# Wagtail 4.2 release notes - IN DEVELOPMENT _Unreleased_ ```{contents} --- local: depth: 1 --- ``` ## What's new ### StreamField data migration helpers Wagtail now provides a set of utilities for creating data migrations on StreamField data. For more information, see [StreamField data migrations](streamfield_data_migrations). This feature was developed by Sandil Ranasinghe, initially as the [wagtail-streamfield-migration-toolkit](https://github.com/wagtail/wagtail-streamfield-migration-toolkit) add-on package, as part of the Google Summer of Code 2022 initiative, with support from Jacob Topp-Mugglestone, Joshua Munn and Karl Hobley. ### Locking for snippets Snippets can now be locked by users to prevent other users from editing, through the use of the `LockableMixin`. For more details, see [](wagtailsnippets_locking_snippets). This feature was developed by Sage Abdullah. ### `fullpageurl` template tag Wagtail now provides a `fullpageurl` template tag (for both Django templates and Jinja2) to output a page's full URL including the domain. For more details, see [](fullpageurl_tag). This feature was developed by Jake Howard. ### Other features * Test assertion [`WagtailPageTestCase.assertCanCreate`](testing_reference) now supports the kwarg `publish=True` to check publish redirection (Harry Percival, Akua Dokua Asiedu) * Ensure that the `rebuild_references_index` command can run without console output if called with `--verbosity 0` (Omerzahid Ali, Aman Pandey) * Add full support for secondary buttons with icons in the Wagtail design system - `button bicolor button--icon button-secondary` including the `button-small` variant (Seremba Patrick) * Add [`purge_embeds`](purge_embeds) management command to delete all the cached embed objects in the database (Aman Pandey) * Make it possible to resize the page editor’s side panels (Sage Abdullah) * Add ability to include [`form_fields` as an APIField](form_page_fields_api_field) on `FormPage` (Sævar Öfjörð Magnússon, Suyash Singh, LB (Ben) Johnston) * Ensure that images listings are more consistently aligned when there are fewer images uploaded (Theresa Okoro) * Add more informative validation error messages for non-unique slugs within the admin interface and for programmatic page creation (Benjamin Bach) * Always show the page editor title field’s border when the field is empty (Thibaud Colas) * Snippet models extending `DraftStateMixin` now automatically define a "Publish" permission type (Sage Abdullah) * Users now remain on the edit page after saving a snippet as draft (Sage Abdullah) * Base project template now populates the meta description tag from the search description field (Aman Pandey) * Added support for `azure-mgmt-cdn` version >= 10 and `azure-mgmt-frontdoor` version >= 1 in the frontend cache invalidator (Sylvain Fankhauser) * Add a system check to warn when a `django-storages` backend is configured to allow overwriting (Rishabh jain) ### Bug fixes * Make sure workflow timeline icons are visible in high-contrast mode (Loveth Omokaro) * Ensure authentication forms (login, password reset) have a visible border in Windows high-contrast mode (Loveth Omokaro) * Ensure visual consistency between buttons and links as buttons in Windows high-contrast mode (Albina Starykova) * Ensure `ChooserBlock.extract_references` uses the model class, not the model string (Alex Tomkins) * Incorrectly formatted link in the documentation for Wagtail community support (Bolarinwa Comfort Ajayi) * Ensure logo shows correctly on log in page in Windows high-contrast mode (Loveth Omokaro) * Comments notice background overflows its container (Yekasumah) * Ensure links within help blocks meet colour contrast guidelines for accessibility (Theresa Okoro) * Ensure the skip link (used for keyboard control) meets colour contrast guidelines for accessibility (Dauda Yusuf) * Ensure tag fields correctly show in both dark and light Windows high-contrast modes (Albina Starykova) * Ensure new tooltips & tooltip menus have visible borders and tip triangle in Windows high-contrast mode (Juliet Adeboye) * Ensure there is a visual difference of 'active/current link' vs normal links in Windows high-contrast mode (Mohammad Areeb) * Avoid issues where trailing whitespace could be accidentally removed in translations for new page & snippet headers (Florian Vogt) * Make sure minimap error indicators follow the minimap scrolling (Thibaud Colas) * Remove the ability to view or add comments to `InlinePanel` inner fields to avoid lost or incorrectly linked comments (Jacob Topp-Mugglestone) * Use consistent heading styles on top-level fields in the page editor (Sage Abdullah) * Allow button labels to wrap onto two lines in dropdown buttons (Coen van der Kamp) * Remove spurious horizontal resize handle from text areas (Matt Westcott) * Move DateField, DateTimeField, TimeField comment buttons to be right next to the fields (Theresa Okoro) * Support text resizing in workflow steps cards (Ivy Jeptoo) * Ignore images added via fixtures when using `WAGTAILIMAGES_FEATURE_DETECTION_ENABLED` to avoid errors for images that do not exist (Aman Pandey) * Restore ability to perform JSONField query operations against StreamField when running against the Django 4.2 development branch (Sage Abdullah) * Ensure there is correct grammar and pluralisation for Tab error counts shown to screen readers (Aman Pandey) * Pass through expected expected `cc`, `bcc` and `reply_to` to the Django mail helper from `wagtail.admin.mail.send_mail` (Ben Gosney) * Allow reviewing or reverting to a Page's initial revision (Andy Chosak) * Use the correct padding for autocomplete block picker (Umar Farouk Yunusa) * Ensure that short content pages (such as editing snippets) do not show an inconsistent background (Sage Abdullah) * Fix horizontal positioning of rich text inline toolbar (Thibaud Colas) * Ensure that `DecimalBlock` correctly handles `None`, when `required=False`, values (Natarajan Balaji) * Close the userbar when clicking its toggle (Albina Starykova) * Add a border around the userbar menu in Windows high-contrast mode so it can be identified (Albina Starykova) * Make sure browser font resizing applies to the userbar (Albina Starykova) ### Documentation * Wagtail's documentation (v2.9 to v4.0) has been updated on [Dash user contributions](https://github.com/Kapeli/Dash-User-Contributions) for [Dash](https://kapeli.com/dash) or [Zeal](https://zealdocs.org/) offline docs applications (Damilola Oladele, Mary Ayobami, Elizabeth Bassey) * Wagtail's documentation (v2 to v4.0) has been added to [DevDocs](https://devdocs.io/wagtail/) which has offline support and is easily accessible in any browser (Vallabh Tiwari) * Add custom permissions section to permissions documentation page (Dan Hayden) * Add documentation for how to get started with [contributing translations](contributing_translations) for the Wagtail admin (Ogunbanjo Oluwadamilare) * Officially recommend `fnm` over `nvm` in development documentation (LB (Ben) Johnston) * Mention the importance of passing `request` and `current_site` to `get_url` on the [performance](performance_overview) documentation page (Jake Howard) * Add documentation for [`register_user_listing_buttons`](register_user_listing_buttons) hook (LB (Ben Johnston)) * Add development (contributing to Wagtail) documentation notes for [development on Windows](development_on_windows) (Akua Dokua Asiedu) * Mention Wagtail’s usage of Django’s default user model by default (Temidayo Azeez) * Add links to treebeard documentation for relevant methods (Temidayo Azeez) * Add clarification on where to register entity plugins (Mark McOsker) * Fix logo in README not being visible in high-contrast mode (Benita Anawonah) * Improve 'first wagtail site' tutorial (Akua Dokua Asiedu) * Grammatical adjustments of `page models` usage guide (Damilola Oladele) * Add class inheritance information to StreamField block sreference (Temidayo Azeez) * Document the hook [`register_image_operations`](register_image_operations) and add an example of a [custom Image filter](custom_image_filters) (Coen van der Kamp) * Fix incorrect example code for StreamField migration of `RichTextField` (Matt Westcott) * Set up Stimulus application initialisation according to RFC 78 (LB (Ben) Johnston) * Refactor submit-on-change search filters for image and document listings to use Stimulus (LB (Ben) Johnston) * Document the policy needed to create invalidations in CloudFront (Jake Howard) ### Maintenance * Switch to using [Willow](https://github.com/wagtail/Willow/) instead of Pillow for images (Darrel O'Pry) * Remove unsquashed `testapp` migrations (Matt Westcott) * Upgrade to Node 18 for frontend build tooling (LB (Ben) Johnston) * Run Python tests with coverage and upload coverage data to codecov (Sage Abdullah) * Clean up duplicate JavaScript for the `escapeHtml` function (Jordan Rob) * Ensure that translation file generation ignores JavaScript unit tests and clean up unit tests for Django gettext utils (LB (Ben Johnston)) * Migrated `initButtonSelects` from core.js to own TypesScript file and add unit tests (Loveth Omokaro) * Migrated `initSkipLink` util to TypeScript and add JSDoc & unit tests (Juliet Adeboye) * Clean up some unused utility classes and migrate `unlist` to Tailwind utility class `w-list-none` (Loveth Omokaro) * Clean up linting on legacy code and add shared util `hasOwn` in TypeScript (Loveth Omokaro) * Remove unnecessary box-sizing: border-box declarations in SCSS (Albina Starykova) * Migrated `initTooltips` to TypeScript add JSDoc and unit tests (Fatuma Abdullahi) * Migrated `initTagField` from core.js to own TypeScript file and add unit tests (Chisom Okeoma) * Added unit tests & JSDoc to `initDissmisibles` (Yekasumah) * Standardise on `classname` for passing HTML class attributes (LB (Ben Johnston)) * Clean up expanding formset and `InlinePanel` JavaScript initialisation code and adopt a class approach (Matt Westcott) * Extracted revision and draft state logic from generic views into mixins (Sage Abdullah) * Extracted generic lock / unlock views from page lock / unlock views (Sage Abdullah) * Move `identity` JavaScript util into shared utils folder (LB (Ben Johnston)) * Remove unnecessary declaration of function to determine URL query params, instead use `URLSearchParams` (Loveth Omokaro) * Update `tsconfig` to better support modern TypeScript development and clean up some code quality issues via Eslint (Loveth Omokaro) * Switch userbar to initialise a Web Component to avoid styling clashes (Albina Starykova) * Refactor userbar stylesheets to use the same CSS loading as the rest of the admin (Albina Starykova) * Remove unused search-bar and button-filter styles (Thibaud Colas) * Use util method to construct dummy requests in tests (Jake Howard) ## Upgrade considerations ### Wagtail-specific image field (`WagtailImageField`) The `AbstractImage` and `AbstractRendition` models use a Wagtail-specific `WagtailImageField` which extends Django's `ImageField` to use [Willow](https://github.com/wagtail/Willow/) for image file handling. This will generate a new migration if you are using a [custom image model](custom_image_model) ### Comments within `InlinePanel` not supported When the commenting system was introduced, support for `InlinePanel` fields was incorrectly added. This has lead to issues where comments can be lost on save or in most cases will be added to the incorrect item within the `InlinePanel`. The ability to add comments here has now been removed and as such any existing comments that were added will no longer show. See https://github.com/wagtail/wagtail/issues/9685 for tracking of adding this back officially in the future. ### Adoption of `classname` convention for some template tags & includes Some undocumented Wagtail admin template tags and includes have been refactored to adopt a more consistent naming of `classname`. If these are used within packages or customisations they will need to be updated to the new variable naming convention. | Name | New (`classname`) | Old (various) | | ------------------- | ------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | | `dialog_toggle` | `{% dialog_toggle classname='...' %}` | `{% dialog_toggle class_name='...' %}` | | `paginate` | `{% paginate pages classname="..." %}` | `{% paginate pages classnames="..." %}` | | `tab_nav_link` | `{% include 'wagtailadmin/shared/tabs/tab_nav_link.html' with classname="..." %}` | `{% include 'wagtailadmin/shared/tabs/tab_nav_link.html' with classes="..." %}` | | `side_panel_button` | `{% include 'wagtailadmin/shared/side_panels/includes/side_panel_button.html' with classname="..." %}` | `{% include 'wagtailadmin/shared/side_panels/includes/side_panel_button.html' with classes="..." %}` | ### `InlinePanel` JavaScript function is now a class The (internal, undocumented) `InlinePanel` JavaScript function, used to initialise client-side behaviour for inline panels, has been converted to a class. Any user code that calls this function should now replace `InlinePanel(...)` calls with `new InlinePanel(...)`. Additionally, child form controls are now initialised automatically, and so it is no longer necessary to call `initChildControls`, `updateChildCount`, `updateMoveButtonDisabledStates` or `updateAddButtonState`. Python code that uses the `InlinePanel` panel type is not affected by this change. ### `WAGTAILADMIN_GLOBAL_PAGE_EDIT_LOCK` setting is now `WAGTAILADMIN_GLOBAL_EDIT_LOCK` The `WAGTAILADMIN_GLOBAL_PAGE_EDIT_LOCK` setting has been renamed to [`WAGTAILADMIN_GLOBAL_EDIT_LOCK`](wagtailadmin_global_edit_lock). ### Wagtail userbar as a web component The [`wagtailuserbar`](wagtailuserbar_tag) template tag now initialises the userbar as a [Web Component](https://developer.mozilla.org/en-US/docs/Web/Web_Components), with a `wagtail-userbar` custom element using shadow DOM to apply styles without any collisions with the host page. For any site customising the position of the userbar, target the styles to `wagtail-userbar::part(userbar)` instead of `.wagtail-userbar`. For example: ```css wagtail-userbar::part(userbar) { bottom: 30px; } ``` ### Support for legacy versions of `azure-mgmt-cdn` and `azure-mgmt-frontdoor` packages will be dropped If you are using the front-end cache invalidator module (`wagtail.contrib.frontend_cache`) with Azure CDN or Azure Front Door, the following packages need to be updated: * For Azure CDN: upgrade `azure-mgmt-cdn` to version 10 or above * For Azure Front Door: upgrade `azure-mgmt-frontdoor` to version 1 or above Support for older versions will be dropped in a future release.