v3.29.0

payloadcms/payloadv3.29.0Mar 20, 2025by denolfe

AI Summary

Upgrades the Lexical dependency to 0.28.0 and introduces support for conditional tabs. It also adds a vector raw column type for Postgres, implements form state select, and adds radio field support to the Form Builder plugin.

Key Highlights

  • Lexical upgrade to 0.28.0
  • Conditional tabs support
  • Postgres vector raw column type
  • Form state select implementation
  • Radio field support in Form Builder

New Features

  • Conditional tabs
  • Postgres vector column type
  • Lexical 0.28.0 upgrade
  • Form state select
  • Radio field (Form builder)

Full Release Notes

## [v3.29.0](https://github.com/payloadcms/payload/compare/v3.28.1...v3.29.0) (2025-03-20)

## 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](https://payloadcms.com/docs/rich-text/custom-features) for details.

If you still encounter richtext-lexical errors, do the following, in this order:
1. Delete `node_modules`
2. Delete your lockfile (e.g. `pnpm-lock.json`)
3. Reinstall your dependencies (e.g. `pnpm install`)

---

### 🚀 Features

* pass i18n through field label and description functions ([#11802](https://github.com/payloadcms/payload/issues/11802)) ([31211e9](https://github.com/payloadcms/payload/commit/31211e9))
* sort support for payload.update operation ([#11769](https://github.com/payloadcms/payload/issues/11769)) ([20e975b](https://github.com/payloadcms/payload/commit/20e975b))
* add find to payloadDataLoader to cache local API queries ([#11685](https://github.com/payloadcms/payload/issues/11685)) ([975bbb7](https://github.com/payloadcms/payload/commit/975bbb7))
* distinct error for unverified email login ([#11647](https://github.com/payloadcms/payload/issues/11647)) ([fd99a30](https://github.com/payloadcms/payload/commit/fd99a30))
* aligns user _strategy returned from API ([#11701](https://github.com/payloadcms/payload/issues/11701)) ([8a51fe1](https://github.com/payloadcms/payload/commit/8a51fe1))
* form state select ([#11689](https://github.com/payloadcms/payload/issues/11689)) ([9ea8a7a](https://github.com/payloadcms/payload/commit/9ea8a7a))
* add `forceSelect` collection / global config property ([#11627](https://github.com/payloadcms/payload/issues/11627)) ([5e3d07b](https://github.com/payloadcms/payload/commit/5e3d07b))
* added support for conditional tabs ([#8720](https://github.com/payloadcms/payload/issues/8720)) ([878dc54](https://github.com/payloadcms/payload/commit/878dc54))
* **db-*:** support sort in db.updateMany ([#11768](https://github.com/payloadcms/payload/issues/11768)) ([e96d3c8](https://github.com/payloadcms/payload/commit/e96d3c8))
* **db-*:** allow to thread `id` to create operation data without custom IDs ([#11709](https://github.com/payloadcms/payload/issues/11709)) ([f442d22](https://github.com/payloadcms/payload/commit/f442d22))
* **db-postgres:** add vector raw column type ([#10422](https://github.com/payloadcms/payload/issues/10422)) ([11d7487](https://github.com/payloadcms/payload/commit/11d7487))
* **plugin-form-builder:** radio field ([#11716](https://github.com/payloadcms/payload/issues/11716)) ([427a5f1](https://github.com/payloadcms/payload/commit/427a5f1))
* **richtext-lexical:** support escaping markdown characters ([#11784](https://github.com/payloadcms/payload/issues/11784)) ([43cdccd](https://github.com/payloadcms/payload/commit/43cdccd))
* **richtext-lexical:** upgrade lexical from 0.27.2 to 0.28.0 ([#11764](https://github.com/payloadcms/payload/issues/11764)) ([240730f](https://github.com/payloadcms/payload/commit/240730f))
* **richtext-lexical:** allow disabling TabNode ([#11656](https://github.com/payloadcms/payload/issues/11656)) ([013b515](https://github.com/payloadcms/payload/commit/013b515))
* **richtext-lexical:** upgrade lexical from 0.27.1 to 0.27.2 ([#11706](https://github.com/payloadcms/payload/issues/11706)) ([adb42cb](https://github.com/payloadcms/payload/commit/adb42cb))
* **ui:** don't trigger preventLeave when opening a new tab ([#11683](https://github.com/payloadcms/payload/issues/11683)) ([398607f](https://github.com/payloadcms/payload/commit/398607f))

### 🐛 Bug Fixes

* add locale support to relationship filter options in WhereBuilder ([#11783](https://github.com/payloadcms/payload/issues/11783)) ([90f2491](https://github.com/payloadcms/payload/commit/90f2491))
* add locale support to relationship filter options in WhereBuilder ([#11783](https://github.com/payloadcms/payload/issues/11783)) ([39ad31a](https://github.com/payloadcms/payload/commit/39ad31a))
* save button styles in edit-many modal ([#11780](https://github.com/payloadcms/payload/issues/11780)) ([7bc75e2](https://github.com/payloadcms/payload/commit/7bc75e2))
* wrap login redirect routes with encodeURIComponent ([#11778](https://github.com/payloadcms/payload/issues/11778)) ([a02e476](https://github.com/payloadcms/payload/commit/a02e476))
* email format validation with hyphens ([#11761](https://github.com/payloadcms/payload/issues/11761)) ([afe4432](https://github.com/payloadcms/payload/commit/afe4432))
* improves email validation format rules ([#11757](https://github.com/payloadcms/payload/issues/11757)) ([875afcc](https://github.com/payloadcms/payload/commit/875afcc))
* field appending on duplicate should ignore non string values ([#11621](https://github.com/payloadcms/payload/issues/11621)) ([74996fd](https://github.com/payloadcms/payload/commit/74996fd))
* passes id and data to read access func when accessing upload URLs ([#11684](https://github.com/payloadcms/payload/issues/11684)) ([4a712e1](https://github.com/payloadcms/payload/commit/4a712e1))
* bulk upload validation when files are missing ([#11744](https://github.com/payloadcms/payload/issues/11744)) ([ea66e21](https://github.com/payloadcms/payload/commit/ea66e21))
* ensures `select` & `radio` field option labels accept JSX elements ([#11658](https://github.com/payloadcms/payload/issues/11658)) ([3c92fbd](https://github.com/payloadcms/payload/commit/3c92fbd))
* add classes for picture tag in media component ([#11605](https://github.com/payloadcms/payload/issues/11605)) ([d66cdbd](https://github.com/payloadcms/payload/commit/d66cdbd))
* **db-mongodb:** spread version schema options correctly ([#11793](https://github.com/payloadcms/payload/issues/11793)) ([1d25b16](https://github.com/payloadcms/payload/commit/1d25b16))
* **plugin-cloud-storage:** s3Storage client uploads working with more than 2 instances of the plugin ([#11732](https://github.com/payloadcms/payload/issues/11732)) ([bb39c87](https://github.com/payloadcms/payload/commit/bb39c87))
* **plugin-import-export:** export with draft true ([#11762](https://github.com/payloadcms/payload/issues/11762)) ([67a7358](https://github.com/payloadcms/payload/commit/67a7358))
* **plugin-import-export:** translated preview labels ([#11758](https://github.com/payloadcms/payload/issues/11758)) ([e83f452](https://github.com/payloadcms/payload/commit/e83f452))
* **plugin-multi-tenant:** ensures redirect route is correctly formatted ([#11753](https://github.com/payloadcms/payload/issues/11753)) ([06aa940](https://github.com/payloadcms/payload/commit/06aa940))
* **plugin-multi-tenant:** missing key console message ([#11693](https://github.com/payloadcms/payload/issues/11693)) ([3d129e8](https://github.com/payloadcms/payload/commit/3d129e8))
* **richtext-lexical:** error in admin panel when block collapsed preference is not an array ([#11771](https://github.com/payloadcms/payload/issues/11771)) ([b857273](https://github.com/payloadcms/payload/commit/b857273))
* **richtext-lexical:** error in admin panel when setting a richtext field in `useAsTitle` ([#11707](https://github.com/payloadcms/payload/issues/11707)) ([ef527fe](https://github.com/payloadcms/payload/commit/ef527fe))
* **richtext-lexical:** make the toolbar indent button consider the disabledNodes property on IndentFeature ([#11739](https://github.com/payloadcms/payload/issues/11739)) ([dd80f52](https://github.com/payloadcms/payload/commit/dd80f52))
* **richtext-lexical:** unchecked list items were rendered as checked in html converter ([#11747](https://github.com/payloadcms/payload/issues/11747)) ([3f23160](https://github.com/payloadcms/payload/commit/3f23160))
* **richtext-lexical:** remove undefined rel and target attributes in link HTML converter ([#11754](https://github.com/payloadcms/payload/issues/11754)) ([aa3737c](https://github.com/payloadcms/payload/commit/aa3737c))
* **ui:** adding guard check for populate docs in upload field ([#11800](https://github.com/payloadcms/payload/issues/11800)) ([7d9d067](https://github.com/payloadcms/payload/commit/7d9d067))
* **ui:** bulk edit subfields ([#10035](https://github.com/payloadcms/payload/issues/10035)) ([b5fc8c6](https://github.com/payloadcms/payload/commit/b5fc8c6))
* **ui:** excess error css coming from group fields ([#11700](https://github.com/payloadcms/payload/issues/11700)) ([0fe922e](https://github.com/payloadcms/payload/commit/0fe922e))
* **ui:** fallback localization data was appearing in document ([#11743](https://github.com/payloadcms/payload/issues/11743)) ([ebfb0eb](https://github.com/payloadcms/payload/commit/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](https://github.com/payloadcms/payload/issues/11699)) ([e0bf505](https://github.com/payloadcms/payload/commit/e0bf505))
* **ui:** processing and initializing form does not disable standalone fields ([#11714](https://github.com/payloadcms/payload/issues/11714)) ([0b1a1b5](https://github.com/payloadcms/payload/commit/0b1a1b5))

### ⚡ Performance

* use direct db calls in job-queue system ([#11489](https://github.com/payloadcms/payload/issues/11489)) ([032c424](https://github.com/payloadcms/payload/commit/032c424))
* download only images and optimize image selection for upload list view, prioritize best-fit size ([#11696](https://github.com/payloadcms/payload/issues/11696)) ([6270d73](https://github.com/payloadcms/payload/commit/6270d73))
* **ui:** implements select in bulk edit ([#11708](https://github.com/payloadcms/payload/issues/11708)) ([d8bfb22](https://github.com/payloadcms/payload/commit/d8bfb22))

### 🛠 Refactors

* **richtext-lexical:** new plaintext and markdown converters, restructure converter docs ([#11675](https://github.com/payloadcms/payload/issues/11675)) ([82840aa](https://github.com/payloadcms/payload/commit/82840aa))

### 📚 Documentation

* mention correct --disable-transpile flag ([#11788](https://github.com/payloadcms/payload/issues/11788)) ([6640b1c](https://github.com/payloadcms/payload/commit/6640b1c))
* updates docs for `useDocumentInfo` ([#11686](https://github.com/payloadcms/payload/issues/11686)) ([ff2df62](https://github.com/payloadcms/payload/commit/ff2df62))

### 🧪 Tests

* dedicated bulk edit test suite ([#11756](https://github.com/payloadcms/payload/issues/11756)) ([a44a252](https://github.com/payloadcms/payload/commit/a44a252))

### 🏡 Chores

* export type FieldAccessArgs ([#11749](https://github.com/payloadcms/payload/issues/11749)) ([f31e5e6](https://github.com/payloadcms/payload/commit/f31e5e6))
* bump prettier, re-enable prettier for docs ([#11695](https://github.com/payloadcms/payload/issues/11695)) ([9f9db3f](https://github.com/payloadcms/payload/commit/9f9db3f))
* **deps:** bump next.js from 15.2.2 to 15.2.3 in monorepo ([#11748](https://github.com/payloadcms/payload/issues/11748)) ([95821c6](https://github.com/payloadcms/payload/commit/95821c6))
* **examples:** add locale to revalidatePath in Pages hook ([#11775](https://github.com/payloadcms/payload/issues/11775)) ([68f2582](https://github.com/payloadcms/payload/commit/68f2582))

### 🤝 Contributors

- Jacob Fletcher (@jacobsfletch)
- Alessio Gravili (@AlessioGr)
- Ainsley Clark (@ainsleyclark)
- Anders Semb Hermansen (@andershermansen)
- Nacho Martin (@nachomglz)
- Jarrod Flesch (@JarrodMFlesch)
- Patrik (@PatrikKozak)
- Terry Yuen (@tyuen)
- Germán Jabloñski (@GermanJablo)
- Dan Ribbens (@DanRibbens)
- Said Akhrarov (@akhrarovsaid)
- Jessica Chowdhury (@JessChowdhury)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- DriesCruyskens (@DriesCruyskens)
- AoiYamada (@AoiYamada)
- Md. Tajmirul Islam Akhand (@Tajmirul)
- Philipp Schneider (@philipp-tailor)
- Tobias Odendahl (@tak-amboss)