TL;DR
Payload CMS v3.29.0 brings significant improvements with Lexical richtext editor upgrades, performance optimizations for the job queue system, and enhanced form handling. Key additions include conditional tabs, vector column support in PostgreSQL, and improved bulk editing capabilities. This release focuses on developer experience with better field access controls, email validation, and more flexible configuration options.
Highlight of the Release
- Lexical richtext editor upgraded to version 0.28.0 with improved table features and markdown support
- Performance optimizations for job queue system using direct database calls
- Support for conditional tabs that can be shown/hidden based on document data
- Vector column type support added for PostgreSQL databases
- Enhanced bulk editing with better handling of nested fields and form state
Migration Guide
Lexical Upgrade
If you installed lexical manually, update it to 0.28.0. Installing lexical manually is not recommended, as it may break between updates. Use our re-exported versions instead.
If you encounter richtext-lexical errors after upgrading, follow these steps:
- Delete
node_modules
- Delete your lockfile (e.g.
pnpm-lock.json)
- Reinstall your dependencies (e.g.
pnpm install)
Job Queue System Changes
The job queue system now uses direct database calls for better performance. If you've added custom hooks to the payload-jobs collection, you'll need to set the new runHooks: true property in your job configuration to maintain the previous behavior.
Note that using runHooks: true will revert to slower payload operations. In most cases, using the onSuccess or onFail properties in the job config will be sufficient and much faster.
Additionally, if you're using the depth property in your job configuration, the system will also fall back to normal payload operations.
API Changes
- The
FieldAccessArgs type is now exported, which may affect custom field access implementations
- The
i18n argument is now passed through field label and description functions
- The
pictureClassName prop has been added to the Media component
Upgrade Recommendations
This release contains significant improvements and bug fixes with minimal breaking changes. It's recommended to upgrade to v3.29.0 as soon as possible to benefit from the performance improvements and new features.
If you're using the Lexical richtext editor, make sure to follow the migration steps to update to Lexical 0.28.0. If you've customized the job queue system with hooks, review the changes to the job queue system and consider using the new runHooks property if needed.
The upgrade process should be straightforward for most users:
- Update your Payload dependencies to v3.29.0
- If using Lexical, ensure you're using our re-exported versions rather than installing it manually
- Test your application thoroughly, especially if you're using richtext fields, job queues, or bulk editing features
Bug Fixes
UI and Form Fixes
- Fixed bulk edit for nested fields and subfields
- Corrected handling of relationship filter options in non-default locales
- Fixed scheduled publish timezone display and selection
- Improved error states in collapsibles, tabs, and arrays
- Prevented "Leave Page" dialog when opening links in new tabs
- Fixed upload preview display based on
displayPreview setting
- Ensured form processing state disables standalone fields
Richtext Editor Fixes
- Fixed error when setting a richtext field as
useAsTitle
- Corrected handling of block collapsed preferences
- Fixed HTML converter issues with unchecked list items and link attributes
- Made toolbar indent button respect disabled nodes configuration
Authentication and Access Control
- Added distinct error for unverified email login attempts
- Fixed access control for upload URLs by passing ID and data to read access functions
- Improved email validation with stricter format rules
- Ensured only authenticated users can access locked documents collection
Plugin Fixes
- Fixed S3 client uploads when using more than two instances of the plugin
- Corrected multi-tenant redirect route formatting
- Fixed import-export plugin handling of translated preview labels and draft exports
New Features
Richtext Editor Improvements
- Upgraded Lexical from 0.27.1 to 0.28.0 with improved table features including column freezing and alignment
- Added support for escaping markdown characters
- New HTML, plaintext, and markdown converters with better documentation
- Option to disable TabNode and control indentation behavior for specific nodes
Database Enhancements
- Added vector raw column type for PostgreSQL to support vector embeddings
- New
forceSelect property for collections/globals to ensure specific fields are always selected
- Support for passing custom IDs during document creation with
acceptIDOnCreate flag
- Added sort support for
payload.update and payload.db.updateMany operations
Form and UI Improvements
- Support for conditional tabs that can be shown/hidden based on document data
- Form state select API for requesting partial form state
- Radio field support added to the form builder plugin
- Improved handling of field paths in bulk edit operations
- Added
pictureClassName prop to Media component for styling picture tags
Security Updates
Authentication and Access Control
- Improved email validation with stricter format rules to prevent potential security issues
- Added distinct error for unverified email login attempts without revealing account existence
- Fixed access control for upload URLs by properly passing ID and data to read access functions
- Ensured only authenticated users can access the
payload-locked-documents collection
Data Protection
- Fixed issue where fields removed from schema could still be returned in MongoDB results
- Added option to strip keys from data that don't exist in the schema from read results
- Improved handling of login redirect routes with proper URL encoding
Performance Improvements
Job Queue System Optimization
- Replaced
payload.* operations with direct payload.db.* calls in the job queue system
- Added new
updateJob and updateJobs helpers to handle task status generation outside normal hook lifecycle
- Added
runHooks property to job configuration for cases where custom hooks are needed
Image and Upload Optimizations
- Optimized image selection for upload list view by prioritizing best-fit size
- Ensured only image files are processed for thumbnails, avoiding redundant requests for non-images
- Added guard check for populate docs in upload field to prevent unnecessary requests
- Reduced bandwidth usage by selecting more efficient image sizes
Form State and Data Loading
- Added
find to payloadDataLoader to cache local API queries
- Implemented form state task queue to prevent excessive network requests
- Added select-like API to form state endpoint for partial form state processing
- Improved bulk edit by requesting only selected fields instead of entire schema
Impact Summary
Payload CMS v3.29.0 delivers a substantial update focused on performance, developer experience, and content editing improvements. The Lexical richtext editor upgrade to 0.28.0 brings enhanced table features and markdown support, while the job queue system has been optimized with direct database calls for significantly faster performance.
Content editors will benefit from improved bulk editing capabilities, better handling of nested fields, and conditional tabs that can be shown or hidden based on document data. Developers gain access to new database features like vector column support in PostgreSQL and the ability to pass custom IDs during document creation.
The release also addresses numerous bugs across the UI, form handling, and plugins, with particular attention to richtext editor issues and access control improvements. Performance optimizations extend to image handling in the upload list view and form state processing, reducing bandwidth usage and network requests.
Overall, this update represents a well-rounded improvement to Payload's core functionality while maintaining backward compatibility, making it a recommended upgrade for all users.
Full Release Notes
Important
This release upgrades the lexical dependency from 0.27.1 to 0.28.0.
If you installed lexical manually, update it to 0.28.0. Installing lexical manually is not recommended, as it may break between updates, and our re-exported versions should be used. See the yellow banner box for details.
If you still encounter richtext-lexical errors, do the following, in this order:
- Delete
node_modules
- Delete your lockfile (e.g.
pnpm-lock.json)
- Reinstall your dependencies (e.g.
pnpm install)
š Features
- pass i18n through field label and description functions (#11802) (31211e9)
- sort support for payload.update operation (#11769) (20e975b)
- add find to payloadDataLoader to cache local API queries (#11685) (975bbb7)
- distinct error for unverified email login (#11647) (fd99a30)
- aligns user _strategy returned from API (#11701) (8a51fe1)
- form state select (#11689) (9ea8a7a)
- add
forceSelect collection / global config property (#11627) (5e3d07b)
- added support for conditional tabs (#8720) (878dc54)
- db-*: support sort in db.updateMany (#11768) (e96d3c8)
- db-*: allow to thread
id to create operation data without custom IDs (#11709) (f442d22)
- db-postgres: add vector raw column type (#10422) (11d7487)
- plugin-form-builder: radio field (#11716) (427a5f1)
- richtext-lexical: support escaping markdown characters (#11784) (43cdccd)
- richtext-lexical: upgrade lexical from 0.27.2 to 0.28.0 (#11764) (240730f)
- richtext-lexical: allow disabling TabNode (#11656) (013b515)
- richtext-lexical: upgrade lexical from 0.27.1 to 0.27.2 (#11706) (adb42cb)
- ui: don't trigger preventLeave when opening a new tab (#11683) (398607f)
š Bug Fixes
- add locale support to relationship filter options in WhereBuilder (#11783) (90f2491)
- add locale support to relationship filter options in WhereBuilder (#11783) (39ad31a)
- save button styles in edit-many modal (#11780) (7bc75e2)
- wrap login redirect routes with encodeURIComponent (#11778) (a02e476)
- email format validation with hyphens (#11761) (afe4432)
- improves email validation format rules (#11757) (875afcc)
- field appending on duplicate should ignore non string values (#11621) (74996fd)
- passes id and data to read access func when accessing upload URLs (#11684) (4a712e1)
- bulk upload validation when files are missing (#11744) (ea66e21)
- ensures
select & radio field option labels accept JSX elements (#11658) (3c92fbd)
- add classes for picture tag in media component (#11605) (d66cdbd)
- db-mongodb: spread version schema options correctly (#11793) (1d25b16)
- plugin-cloud-storage: s3Storage client uploads working with more than 2 instances of the plugin (#11732) (bb39c87)
- plugin-import-export: export with draft true (#11762) (67a7358)
- plugin-import-export: translated preview labels (#11758) (e83f452)
- plugin-multi-tenant: ensures redirect route is correctly formatted (#11753) (06aa940)
- plugin-multi-tenant: missing key console message (#11693) (3d129e8)
- richtext-lexical: error in admin panel when block collapsed preference is not an array (#11771) (b857273)
- richtext-lexical: error in admin panel when setting a richtext field in
useAsTitle (#11707) (ef527fe)
- richtext-lexical: make the toolbar indent button consider the disabledNodes property on IndentFeature (#11739) (dd80f52)
- richtext-lexical: unchecked list items were rendered as checked in html converter (#11747) (3f23160)
- richtext-lexical: remove undefined rel and target attributes in link HTML converter (#11754) (aa3737c)
- ui: adding guard check for populate docs in upload field (#11800) (7d9d067)
- ui: bulk edit subfields (#10035) (b5fc8c6)
- ui: excess error css coming from group fields (#11700) (0fe922e)
- ui: fallback localization data was appearing in document (#11743) (ebfb0eb)
- ui: scheduled publish not displaying the timezone's label and timezones being reset when scheduling a publish, brisbane is now a default timezone (#11699) (e0bf505)
- ui: processing and initializing form does not disable standalone fields (#11714) (0b1a1b5)
ā” Performance
- use direct db calls in job-queue system (#11489) (032c424)
- download only images and optimize image selection for upload list view, prioritize best-fit size (#11696) (6270d73)
- ui: implements select in bulk edit (#11708) (d8bfb22)
š Refactors
- richtext-lexical: new plaintext and markdown converters, restructure converter docs (#11675) (82840aa)
š Documentation
š§Ŗ Tests
š” Chores
š¤ Contributors