Meet "pat-filemanager" — a Plone Blicca successor to "pat-structure" folder contents

TL;DR: We are pleased to announce a ground-up rewrite of Plone's folder-contents UI (pat-structure) on Svelte 5 and pure plone.restapi — no Backbone, no underscore, no DataTables, and zero custom Plone JSON views. It keeps every feature you rely on, fixes the long-standing pain points, and adds a bunch of things editors have wanted for years (drag a whole folder in to upload it, a photo grid, link-integrity-aware delete, and more). We plan to replace pat-structure with pat-filemanager going forward.

See the "Feedback" section at the end of this post how to use it in your Plone 6.2 setup.


:thinking: Why a rewrite?

pat-structure has served Plone well, but it carries a decade of baggage: Backbone + Backbone.PageableCollection + underscore + global window._/window.Backbone, DataTables, and a pile of bespoke server-side JSON views (/cut, /copy, /paste, /rename, /workflow, /rearrange, /moveitem, …) that exist only to feed that one widget.

pat-filemanager throws all of that out and talks to the platform the way modern Plone front-ends do — through plone.restapi. The result is smaller, easier to maintain, and loosely coupled: the pattern only needs a context URL + portal URL and discovers everything else via the API (@querystring-search, @querystring, @breadcrumbs, @navigation, @types, @vocabularies, @workflow, @copy/@move, @tus-upload, @linkintegrity).


:sparkles: What's new & better

:repeat_button: Sort the whole result set, not just the page

The #1 legacy annoyance: DataTables only sorted the current batch. Now a column sort re-queries the catalog and orders the entire result set before batching. Date columns sort on the real catalog date index — so "newest first" actually means newest first, across all pages.

:framed_picture: Switchable views: Table ⇄ Grid

A classic table and a photo-organizing grid with large previews (driven by image_scales). Your view choice is remembered per user.

:magic_wand: Drag & drop, leveled up (powered by SortableJS)

  • Reorder items (persistent, catalog-index based, smoothly flip-animated)
  • Drag items into a subfolder — single item or a whole multi-selection
  • Drag up into the parent folder
  • Multi-upload by dropping files onto the listing — resumable via @tus-upload
  • Drop files straight onto a subfolder to upload into it
  • :glowing_star: Drop an entire folder from your desktoppat-filemanager recreates the folder tree in Plone and uploads every nested file, with a preview & approval dialog showing exactly what will be created before anything is written

:card_index_dividers: All the batch actions, modernized

Cut / copy / paste / delete, workflow transitions (with optional recursive apply to children), tag editing, properties (publication/expiration dates, rights, creators, contributors, exclude-from-nav, language — optionally recursive), and rename — all as clean restapi calls, presented in native <dialog> modals.

:link: Link-integrity-aware delete

Before deleting, pat-filemanager checks @linkintegrity and warns you which other content references the items (and how many sub-items will go with them) — so you don't silently break links across the site.

:bullseye: Smarter selection & filtering

Select the current batch or everything matching the current query. Free-text search, type filter, and a full advanced query builder (arbitrary plone.app.querystring criteria, like pat-structure).

:wheelchair_symbol: Accessibility & i18n

Proper ARIA menu semantics, focus management, native modal dialogs with built-in focus trapping, keyboard alternatives to every drag gesture, and full i18n through the standard Plone catalogs.


:broom: What we drop

Backbone, Backbone.PageableCollection, underscore, the window._ / window.Backbone globals, DataTables, and all the pat-structure-specific server views. Styling is (currently) plain CSS on Bootstrap (no SCSS port needed). This will change depending on our CSS Framework decision for Plone Blicca.


Migration & status

  • :white_check_mark: Feature parity with pat-structure, plus the new features above
  • :white_check_mark: No backend additions required — it's pure restapi
  • :construction: In progress: the default-page indicator (showing which item is the folder's default view) is the last remaining parity gap — there's no clean way to surface it over today's REST API, so a dedicated plone.restapi endpoint for it is currently being built. Once it lands, the listing will flag the default page just like pat-structure does.
  • :motorway: Roadmap: a small, well-scoped plone.restapi @rename service would make multi-item short-name (id) renames transactional and collision-safe — the one place where a tiny backend addition would beat client-side loops. Title renames already work everywhere today.
  • :light_bulb: Ideas: We plan to make some components overridable/extenable, so that you can customize the behavior of the filemanager to your needs. For example, if you need an additional view of the content, it should be possible to simply register the component in @plone/registry ... similar to what we currently have in pat-contentbrowser

:folded_hands: We'd love your feedback

You can install the new filemanager by pinning plone.staticresources==3.1.0a1 in your Plone 6.2 setup.
Then you have to edit or override the plone.app.content.browser.contents.templates.folder_contents.pt template and replace
<div class="pat-structure" tal:attributes="data-pat-structure view/options" /> with
<div class="pat-filemanager" tal:attributes="data-pat-filemanager view/options" />

that's it :glowing_star:

We intend pat-filemanager to become the default folder-contents experience in Plone Blicca, replacing pat-structure. Before we push for that:

  • Does it cover your editorial workflows?
  • Any pat-structure capability you'd miss?
  • Edge cases in large folders, multilingual sites, custom content types?

Try it and tell us here :test_tube:

The Blicca Team :fish:


Sneak previews


22 Likes

10 posts were split to a new topic: Discussion: @plone/client to use for both, Blicca and Volto