Compare Versions - payload
npm / payload / Compare Versions
v3.80.0 (2026-03-20)
🚀 Features
- add
disableUniqueproperty to the slug field for better multi tenant plugin support (#15963) (395e1ed)
🐛 Bug Fixes
- unpublish updates existing version instead of creating a new one (#15985) (67063ab)
- use latest draft version data when trashing unpublished documents (#15981) (57a0edc)
- db-mongodb: fix pagination with collation in transactions (#15990) (5c935aa)
- db-postgres:
nearquery can give incorrect results (#15907) (843306c) - db-sqlite: scheduled publish does not show upcoming events because of wrong nested json querying (#15911) (3fa834a)
- deps: resolve high severity audit vulnerabilities (#15961) (da212fd)
- drizzle: pagination applied incorrectly when sorting by a field inside an array field (#15908) (0f67215)
- drizzle: groups inside localized tabs are not working correctly (#15936) (57bde77)
- graphql: force nullable for relationships to avoid errors when the related document is related (#15915) (560cabe)
- plugin-mcp: plugin can break next.js request handler because underlying Hono library modifies the global Request object (#15938) (4cfa495)
- plugin-multi-tenant: modal container blocks clicks on create-first-user page (#15973) (8157f4c)
- richtext-lexical: richtext fields don't respect RTL direction for Arabic and other RTL locales (#15964) (944a889)
- ui: defer live preview iframe rendering (#15999) (9999083)
- ui: stale data modal shown when onChange starts while save is in-flight (#15960) (dc98f0f)
📚 Documentation
- add custom admin location docs (#15581) (04a4b0a)
- updating lexical richtext fields (#15968) (8e5d56d)
- add copy and paste documentation for blocks (#15987) (747be91)
- warning for numeric field names (#15966) (99dcac1)
- storage adapters improvements (#15946) (9815d83)
📝 Templates
⚙️ CI
🏡 Chores
- add docker:clean script and fix docker:start reliability (#16000) (2646018)
- bump monorepo Next.js version to 16.2.0 (#15992) (a188556)
- consolidate docker scripts into single docker-compose with profiles (#15974) (f89e736)
- examples: update astro package.json name (#15118) (4e1c04e)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Jake Fletcher (@jacobsfletch)
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Sean Zubrickas (@zubricks)
- Riley Langbein (@rilrom)
- Elliot DeNolf (@denolfe)
v3.79.1 (2026-03-16)
🐛 Bug Fixes
- text field validation rejecting localized object values (#15932) (fac59c8)
- use Sec-Fetch-Site header for cookie authentication validation (#15751) (ef507a6)
- improved request origin retrieval (#15919) (f30d34f)
- generate:types inlines all blocks, add
forceInlineBlocksproperty to use in plugin mcp (#15892) (6a9e367) - update broken custom components docs link in config types jsdoc (#15794) (17aa1b5)
- run
sanitizeWhereQueryfor join query access result (#15891) (dc049fe) - early return out of me access (#15883) (c6054c5)
- scope orderable join reordering by parent relation (#15842) (17a0d19)
- stricter input validation (#15868) (e474205)
- drizzle: avoid ts errors for
payload generate:db-schemawith circular references (#15895) (66a2efa) - drizzle: error when using contains operator on hasMany select fields (#15865) (fba2438)
- drizzle: correctly apply query limit on polymorphic joins (#15652) (fe36dde)
- plugin-import-export: add space in zh translation for exportDocu… (#15833) (43d5596)
- plugin-mcp: bump @modelcontextprotocol/sdk from 1.25.2 to 1.27.1 (#15942) (94d2249)
- storage-azure: add stream aborts for error handling and connection closure (#15768) (b2a03c9)
- ui: stale data modal incorrectly shown when user saves their own document (#15933) (a5d9388)
- ui: copy & pasting block content duplicates array items in editor UI (#15941) (9bcedc8)
- ui: deleted array item reappears after reorder with autosave (#15906) (752c15a)
- ui: use consistent empty state styling in relationship table (#15914) (93b90da)
- ui: clicking filtered Combobox entries fails to trigger selection (#15788) (de3e5ae)
- ui: document status shows changed after publishing specific locale (#15765) (b95df0b)
- ui: split only on first colon in toast error messages (#15894) (fd64504)
- ui: block clipboard paste causes duplicate ID errors in Postgres (#15863) (e7d6331)
- ui: monomorphic relationship fields don't support multi-select with in/not_in operators (#15886) (f71ef61)
- ui: equal column widths for block-drawer blocks (#15867) (07f7802)
- ui: isolate join table column preferences from list view (#15846) (649f117)
- ui: falling back to UTC timezones in timezone picker (#15841) (70099b7)
⚡ Performance
📚 Documentation
- correct type name in editMenuItems client component example (#15904) (03b20d0)
- adds req to available args and wraps examples with proper String type conversions in nested-docs (#15931) (d2a0740)
- adds docs for logger config (#15927) (46e43fc)
- fix links to virtual relationship documentation in both Blocks and Array field documentation (#15888) (fff60c8)
- broken anchor link in blocks field table (#15887) (36c051a)
- examples: clarify MongoDB prerequisites in Mongo-backed examples (#15860) (2aa973f)
- plugin-mcp: updates MCP plugin documentation (#15729) (b97b4e7)
🧪 Tests
- adjust total test count to exclude todo tests in summary output (#15943) (e46daec)
- fixes pagination and sorting list-view tests due to hydration timing issues (#15925) (b0f00c4)
- flaky timeout when clicking Create New button in versions test suite (#15850) (3fb10e1)
🏡 Chores
🤝 Contributors
- Jessica Rynkar (@JessRynkar)
- Patrik (@PatrikKozak)
- German Jablonski (@GermanJablo)
- Copilot (@Copilot)
- Leon Gattermayer (@LeonGatt)
- Omar Yusuf Abdi (@omar-y-abdi)
- Sean Zubrickas (@zubricks)
- Eduardo Costa (@ed-cscosta)
- Jarrod Flesch (@JarrodMFlesch)
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Seiya (@silmin)
- Maxim Seshuk (@maximseshuk)
- Kendell (@kendelljoseph)
- Divyam gupta (@divyamdotfoo)
- deepshekhardas (@deepshekhardas)
- Paul (@paulpopus)
- zzz1220 (@zzz1220)
- Mikko Vänskä (@vanska)
v3.79.0 (2026-03-04)
🚀 Features
- richtext-lexical: separate configuration for lexical block icons (#15632) (f0498f2)
- richtext-lexical: upgrade lexical from 0.35.0 to 0.41.0 (#15760) (ba3bd74)
- translations: add i18n translations for modular dashboards (#15004) (cef2838)
Separate Block Icon Configuration (richtext-lexical) — Configure different images for Lexical block icons and block drawer thumbnails independently. Previously, imageURL served both contexts, forcing a compromise between a good 20x20px icon and a good drawer thumbnail. The new images property supports separate icon and thumbnail values with automatic fallback. Fully backwards compatible — imageURL still works but is deprecated. #15632
const QuoteBlock: Block = {
slug: 'quote',
images: {
icon: 'https://example.com/icons/quote-20x20.svg',
thumbnail: { url: 'https://example.com/thumbnails/quote-480x320.jpg', alt: 'Quote block' },
},
fields: [...],
}
Lexical Upgrade 0.35.0 → 0.41.0 (richtext-lexical) — Upgrades the Lexical rich text editor dependency from v0.35.0 to v0.41.0. Includes upstream fixes like normalizeMarkdown (facebook/lexical#7812). All Lexical breaking changes are handled internally by Payload — no action required for standard usage. If you installed lexical manually, update it to 0.41.0 (though using the re-exported versions from @payloadcms/richtext-lexical/lexical/* is recommended). #15760
Modular Dashboard Translations (translations) — Adds i18n translation support for the Modular Dashboards feature, covering all dashboard widget buttons and error messages. Previously, dashboard UI elements lacked translation keys, making them inaccessible for non-English users. Also updates the automatic translation script to use GPT-4.1 for improved cost efficiency. #15004
🐛 Bug Fixes
- restoreVersion validation for localized required fields (#15821) (e899182)
- draft doc validation when duplicating docs (#15816) (f470699)
- plugin-ecommerce: pass req to Payload API calls in Stripe adapter (#15839) (74799ea)
- plugin-import-export: automatically inherit locale and limit from URL queries (#15812) (ee083f0)
- plugin-import-export: fix imports with locales in a different column order than exported (#15808) (410912c)
- plugin-import-export: fix exports in other non-latin scripts being broken when opened in excel (#15813) (d931894)
- ui: drag and drop not working for sortable hasMany fields (#15845) (2c7ef3f)
- ui: prevent false positive stale data modal on autosave-enabled documents (#15817) (6aff717)
- ui: typo in CodeEditor export statement (#15795) (c5b2a91)
🛠 Refactors
📚 Documentation
- add documentation for conditional tabs (#15809) (a1d6733)
- fix table formatting in import-export plugin (#15792) (0dba95a)
🧪 Tests
🏡 Chores
- prevent dev server from dirtying tracked files (#15826) (cb6f426)
- plugin-search: clean up .DS_Store file and resulting empty images directory (#14506) (f6f73dd)
⚠️ BREAKING CHANGES
-
rename widget ComponentPath to Component for consistency (#15780) (f7d0d04)
- Renames
Widget.ComponentPathtoWidget.Componentand types it as PayloadComponentinstead ofstring` - This aligns dashboard widgets with every other component reference in (collections, globals, fields, admin components) - none of them path in the property name, and all of them are typed as
PayloadComponent - Enables new typescript plugin to work for widget paths (the plugin uses
PayloadComponentcontextual type detection -string-typed properties were invisible to it)
- Renames
🤝 Contributors
- Patrik (@PatrikKozak)
- Jens Becker (@jhb-dev)
- Paul (@paulpopus)
- German Jablonski (@GermanJablo)
- Elliot DeNolf (@denolfe)
- Luiz Cláudio (@lcnogueira)
- Palamar Roman (@VeiaG)
- Sebastian Blank (@blankse)
- Alessio Gravili (@AlessioGr)
- Mahmoud Hassan (@Mhmod-Hsn)
v3.78.0 (2026-02-27)
🚀 Features
- typescript plugin for import paths (#15779) (7639664)
- move trash out of beta and delete access can now be limited to trash only (#15210) (2347cd9)
- next, ui: widget fields (#15700) (0a123b5)
- plugin-mcp: out of beta (#15711) (1b19d5f)
- plugin-mcp: ignore virtual fields in create and update operations (#15680) (cc8f888)
- richtext-lexical: add markdown transformer for upload nodes (#15630) (4af5a85)
- ui: adds dashed button style (#15728) (d570787)
- ui: make query-presets editable from the form view (#15657) (575f8e9)
Feature Details
TypeScript Plugin for Component Paths - New @payloadcms/typescript-plugin validates PayloadComponent import paths directly in your IDE. It checks that referenced files and exports exist, provides autocomplete for file paths and export names, supports go-to-definition on component path strings, and understands all Payload path conventions including absolute paths, relative paths, tsconfig aliases, and package imports. #15779
https://github.com/user-attachments/assets/2a8a8f73-a8fd-4e79-9dc4-795d817b5b75
pnpm add -D @payloadcms/typescript-plugin
{
"compilerOptions": {
"plugins": [{ "name": "next" }, { "name": "@payloadcms/typescript-plugin" }]
}
}
Trash Out of Beta with Granular Delete Access - Trash is now a stable feature. Delete access control can now distinguish between trashing and permanently deleting — allowing you to permit users to soft-delete documents while restricting permanent deletion to admins. When data.deletedAt is being set, the operation is a trash; otherwise it's a permanent delete. #15210
import type { CollectionConfig } from 'payload'
export const Posts: CollectionConfig = {
slug: 'posts',
trash: true,
access: {
delete: ({ req: { user }, data }) => {
// Not logged in - no access
if (!user) {
return false
}
// Admins can do anything (trash or permanently delete)
if (user.roles?.includes('admin')) {
return true
}
// Regular users: check what operation they're attempting
// If data.deletedAt is being set, it's a trash operation - allow it
if (data?.deletedAt) {
return true
}
// Otherwise it's a permanent delete - deny for non-admins
return false
},
},
fields: [
// ...
],
}
Widget Fields (next, ui) - Dashboard widgets can now declare configurable fields, similar to Blocks. Widget data is editable from a new drawer UI when in dashboard editing mode. Full type generation is included — WidgetInstance<T> is generic with typed data and width, and WidgetServerProps is generic so widget components receive typed widgetData. #15700
https://github.com/user-attachments/assets/b24d3635-8635-4d5f-84af-a6dcf801aa4f
import { buildConfig } from 'payload'
export default buildConfig({
admin: {
dashboard: {
widgets: [
{
slug: 'sales-summary',
ComponentPath: './components/SalesSummary.tsx#default',
fields: [
{ name: 'title', type: 'text' },
{
name: 'timeframe',
type: 'select',
options: ['daily', 'weekly', 'monthly', 'yearly'],
},
{ name: 'showTrend', type: 'checkbox' },
],
minWidth: 'small',
maxWidth: 'medium',
},
],
},
},
})
import type { WidgetServerProps } from 'payload'
import type { SalesSummaryWidget } from '../payload-types'
export default async function SalesSummaryWidgetComponent({
widgetData,
}: WidgetServerProps<SalesSummaryWidget>) {
const title = widgetData?.title ?? 'Sales Summary'
const timeframe = widgetData?.timeframe ?? 'monthly'
return (
<div className="card">
<h3>
{title} ({timeframe})
</h3>
</div>
)
}
MCP Plugin Out of Beta (plugin-mcp) - @payloadcms/plugin-mcp is now stable and ready for production use. #15711
Virtual Field Filtering in MCP (plugin-mcp) - Virtual fields (virtual: true) are now automatically stripped from MCP tool input schemas and filtered from parsed data before create, update, and updateGlobal operations. This prevents non-stored fields from appearing as accepted MCP parameters. #15680
Markdown Transformer for Upload Nodes (richtext-lexical) - Upload nodes are now properly converted when using convertLexicalToMarkdown. Previously, upload nodes were silently dropped during markdown conversion. Now populated image uploads output , non-image uploads output link syntax, and non-populated uploads output a reference placeholder so data is never lost. #15630
Dashed Button Style (ui) - Adds a new dashed button style variant. Also replaces box-shadow with border on all buttons and fixes icon-only button padding. #15728
Editable Query Presets from Form View (ui) - Query presets can now be created and edited directly from the document form view using a full WhereBuilder, column picker, and groupBy selector — no longer requiring the list view to build queries first. #15657
https://github.com/user-attachments/assets/d25b447b-c942-47ae-8878-47bd17a8a7fb
🐛 Bug Fixes
- getFieldsToSign crashes when user missing group/tab fields (#15775) (9f0c101)
- improve mobile touch support for dnd (#15771) (418bb92)
- prevent silent data overwrites on concurrent edits (#15749) (7a3f43f)
- preserve block metadata in mergeLocalizedData and filterDataToSelectedLocales (#15715) (6557292)
- return 400 for malformed JSON request bodies (#15706) (4861fa1)
- globals not updating updatedAt when saving drafts (#15764) (df17cb1)
- return early if pasteURL is not defined (#15748) (23d52a0)
- prevent req.file leak between sequential duplicate() calls on upload collections (#15620) (2baea2e)
- sanitize filenames in storage adapters (#15746) (45bd2f1)
- throw error for unknown query operators (#15739) (08226db)
- preserve locale data in unnamed groups with localizeStatus (#15658) (38b8c68)
- next: conditionally query snapshot field based on localization (#15693) (d5706ee)
- plugin-import-export: update docs on jobs and basic usage as well as visibility (#15695) (a40210c)
- plugin-mcp: use inline block schemas in JSON output (#15675) (a66e844)
- plugin-multi-tenant: hasMany tenant fields double-wrap arrays in filterOptions (#15709) (aaddeac)
- plugin-multi-tenant: return false instead of query when no tenants (#15679) (f5a5bd8)
- richtext-lexical: bump acorn to resolve type mismatch with transitive dep (#15791) (801e851)
- richtext-lexical: link markdown regex should not match similar looking image markdown (#15713) (0a0afb0)
- richtext-lexical: use headingLevel in danish heading label (#15685) (ad4c0f6)
- richtext-lexical: strip server-only properties from blocks in lexical client schema map (#15756) (c05ace2)
- templates: ecommerce find my order access functionality to use email (#15736) (b317eaa)
- ui: array field add button margin not applying consistently (#15773) (ee298f5)
- ui: respect custom Cell components on richText fields in list view (#15762) (139cf3e)
- ui: use correct translation key for collection version restore modal (#15757) (c1892eb)
- ui: encode HTML special characters in version diff view (#15747) (30fee83)
- ui: flash of border on list selection buttons (#15735) (7f3c6c8)
🛠 Refactors
- extract regex escape pattern into shared utility (#15676) (8ce389e)
- plugin-mcp: reduced code and de-duplication (#15705) (039e6c9)
🎨 Styles
🧪 Tests
- fix flaky versions tests timing out on link clicks before hydration (#15790) (02da3fd)
- fix flaky lexical code block test with incorrect error expectations (#15776) (4e3e780)
- trash e2e list view clicks timing out in CI (#15778) (fd81fd5)
- fix flaky localization tests with race conditions (#15777) (bda5d0d)
- bulk upload button clicks timeout in CI (#15703) (8228a7d)
- field update access control test times out locally (#15691) (78e8e14)
- fix flaky account unlock test in postgres-uuid and custom-schema (#15696) (e3a76e3)
- fix flaky lexical e2e navigation timeouts and drawer clicks (#15694) (9ca5cda)
- fix flaky access-control bulk delete tests failing due to timing issues (#15692) (558345b)
- fix flaky drawer open and column sort timing issues (#15677) (00f763b)
📝 Templates
- fix cloudflare logger error in with-cloudflare-d1 template (#15752) (8791a72)
- ecommerce add missing access control on collections (#15744) (c74d91d)
- fix ecommerce webhooks url and update docs on using stripe webhooks (#15681) (677596c)
🏡 Chores
- make test:e2e agent-friendly with --grep support and dev server reuse (#15755) (929203c)
- deps: bump next.js canary in monorepo (#15708) (e3d8a94)
- plugin-mcp: improve schema sanitization and test coverage (#15704) (7e20b5c)
- templates: bump versions to 3.77.0 (#15678) (e26df27)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Sean Zubrickas (@zubricks)
- Benedikt Rötsch (@axe312ger)
- Shobhit Singhal (@shobhitsinghal624)
- The Mavik (@themavik)
- Divyesh Jain (@divyesh123-jain)
- Paul (@paulpopus)
- German Jablonski (@GermanJablo)
- Jens Becker (@jhb-dev)
- Jarrod Flesch (@JarrodMFlesch)
- Jessica Rynkar (@JessRynkar)
- Kendell (@kendelljoseph)
- Varun Chawla (@veeceey)
v3.77.0 (2026-02-18)
🚀 Features
- pass local API
depththrough toreq.query.depthfor consistency (#15023) (9a38469) - db-*: add
customIDarg todb.create(#15653) (0935824) - plugin-mcp: migrate from @vercel/mcp-adapter to mcp-handler (#15661) (24025fd)
Feature Details
Local API Depth Consistency - The depth option passed to Local API calls like payload.find() is now automatically set on req.query.depth. Previously, hooks relying on req.query.depth would behave differently between Local API and REST/GraphQL calls unless you manually passed req: { query: { depth: x } } in addition to depth: x. This change ensures consistent behavior across all API methods. #15023
Custom ID Support in db.create (db-*) - New customID argument on payload.db.create allows creating documents with a specific ID without requiring a custom ID field in your collection schema. #15653
payload.db.create({ collection: 'posts', customID: 'ce98d6c4-c3ab-45de-9dfc-bf33d94cc941', data: { } })
MCP Plugin Migration (plugin-mcp) - Migrates from the deprecated @vercel/mcp-adapter to mcp-handler and bumps @modelcontextprotocol/sdk to 1.25.2 addressing a security vulnerability. Exposes new handler options: disableSse, onEvent, and redisUrl. #15661
import { mcpPlugin } from '@payloadcms/plugin-mcp'
export default buildConfig({
plugins: [
mcpPlugin({
// Optional: Enable SSE transport (disabled by default)
disableSse: false,
// Optional: Redis URL for SSE session management (defaults to REDIS_URL env)
redisUrl: 'redis://localhost:6379',
// Optional: Track MCP events for analytics/debugging
onEvent: (event) => {
console.log('MCP event:', event)
},
}),
],
})
🐛 Bug Fixes
- hasMany text fields cannot be filtered with contains operator (#15671) (4513a05)
- use consistent empty state styling between list and folder views (#15555) (8953b37)
- populate previousValue correctly in afterChange hooks for nested lexical fields (#15623) (1cc3bb9)
- add i18n support for dashboard edit mode buttons (#15564) (818e31d)
- next: handle undefined fieldTab in version diff tabs (#15590) (bbacab8)
- plugin-cloud-storage: ensure file data persists across operations (#15570) (6af3673)
- plugin-cloud-storage: generateFileURL only ran when disablePayloadAccessControl was true (#15667) (6c5611c)
- plugin-import-export: remove deprecated import (#15666) (733b1df)
- plugin-import-export: export and import issues when using custom IDs (#15518) (7e2a3ab)
- plugin-import-export: columns being duplicated when using toCSV hook (#15597) (28e07dc)
- plugin-mcp: resolve union type fields failing in update tool (#15660) (9ae89dd)
- plugin-multi-tenant: improve translation for "Tenant" (use "Mandant" instead of "Mieter") (#15537) (4d4033b)
- plugin-multi-tenant: tenant selector not appearing after login (#15617) (dd09f67)
- storage-r2: build error due to types issue in R2 Bucket type (#15670) (7d1e233)
- ui: fix broken polymorphic join edit drawer (#15621) (d450e99)
📚 Documentation
- update cell component docs (#15574) (c403b00)
- outline html lexical content conversion (#15601) (dc1b799)
- updates collection admin options (#14605) (8e92f7f)
- update custom components docs (#15576) (ae82294)
- clarify supported Next.js versions and optional dependencies in installation guide (#15604) (409bc0d)
🧪 Tests
🏡 Chores
- add md and mdx language block linting (#15309) (5415516)
- bump playwright to fix vscode run test indicators (#15626) (f74d288)
- only add publishAllLocales to publish when localizeStatus is enabled (#15610) (d57bc22)
🤝 Contributors
- Paul (@paulpopus)
- Patrik (@PatrikKozak)
- Jessica Rynkar (@JessRynkar)
- German Jablonski (@GermanJablo)
- Kendell (@kendelljoseph)
- Ahmad Yasser (@AhmadYasser1)
- Sasha (@r1tsuu)
- Philipp Schneider (@philipp-tailor)
- Philipp Brumm (@brumm)
- Sebastian Blank (@blankse)
- Sean Zubrickas (@zubricks)
- Alessio Gravili (@AlessioGr)
- Vaishnav Patil (@vaishnav-3)
- Divyesh Jain (@divyesh123-jain)
v3.76.1 (2026-02-11)
🐛 Bug Fixes
- use optional chaining for adminThumbnail size lookup to prevent crash (#15586) (6937eec)
- non-image files should not recieve 0 bytes with useTempFiles (#15538) (a313627)
- add CSP headers to SVG uploads to prevent XSS (#15506) (8283c25)
- richtext-lexical: link tooltip overflows outside viewport with long URLs (#15584) (af6b1a1)
- ui: prevent Tabs field crash when stored tabIndex exceeds tab count (#15588) (a9e296e)
- ui: copy to locale function swallowing errors (#15562) (8ce62d8)
- ui: ensure unpublish button only shows when drafts are enabled (#15459) (69dc5e6)
⚙️ CI
v3.76.0 (2026-02-09)
🚀 Features
- plugin-import-export: adds new exportLimit, importLimit and per collection limit control (#15405) (a7beeca)
🐛 Bug Fixes
- drizzle: use dynamic import for
typescriptto avoid dependency in production (#15545) (98a756c) - live-preview-vue: update build config to compile as esm (#14293) (60c65ed)
- next: drop support for Next.js versions with known CVEs, add canary 16.2.0 support (#15547) (2b3061a)
- next: suppress webpack "Critical dependency" warning in dynamicImport (#15534) (6158489)
- plugin-import-export: errors when import/export files were stored in a storage adapter such as S3 (#15441) (73a9650)
- ui: tab error badge not counting required array validation errors (#15563) (0ce6193)
- ui: folder view toggle button styles overridden due to equal specificity (#15544) (df42bec)
- ui: remove clearData call in dropzone drop handler (#10475) (b4e6761)
📝 Templates
⚙️ CI
🏡 Chores
- fix deprecation warning when running reinstall or clean:all monorepo script (#15535) (03bfaf4)
- drizzle: add logs indicating which migration statements are generated (#15374) (306974d)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Daniel Waltz (@danielwaltz)
- Said Akhrarov (@akhrarovsaid)
v3.75.0 (2026-02-05)
🚀 Features
- adds beforeNav and afterNav component slots (#15493) (f23a1df)
- next: pass full initReq context to server functions and dashboard widgets (#15427) (ce13e97)
🐛 Bug Fixes
- handle absolute paths correctly with tempFileDir upload option (#14436) (5ca9bd4)
- ungenerated image sizes should not store original URL (#15454) (fa1cd62)
- add safety check to redirects from external file URL uploads (#15458) (1041bb6)
- sass warning not hidden during webpack build (#15442) (dec0ea7)
- add collection property to auth documents, fixing multi tenancy access control issue (#15404) (d6aa6cc)
- graphql: blocks return null with select: true (#15464) (c2baef4)
- next: versions diff error when swapping blocks with relationship fields (#15478) (5ba0055)
- next: export SlugField from the client dir not rsc (#15461) (6c07f3b)
- next: sync modular dashboard widgets when server component re-renders (#15439) (5495b47)
- plugin-ecommerce: variant creation blocked by variants in trash (#15449) (3f01682)
- plugin-mcp: create and update resource tools now support point fields (#15381) (a28261d)
- ui: extra padding rendering in list view when no description exists (#15507) (3ff6be4)
- ui: remove slug field from rsc exports (#15480) (8f66035)
⚡ Performance
- next: avoid re-calculating permissions in some server functions, pass missing args (#15428) (9c8be5c)
📚 Documentation
🎨 Styles
🧪 Tests
- trash e2e URL regex too strict and blocks query parameters (#15498) (57e759c)
- additional admin e2e coverage for templates (#15477) (63d63be)
- reorganize helpers into shared/e2e/int subdirectories (#15479) (b901231)
- enable figma adapter testing (#15467) (f4920d8)
- improve script to reset tests (#15328) (399b579)
- richText fields serialization (#15465) (fc99048)
- update suites selected by default in runTestsWithSummary (#15463) (603897d)
- trash auth e2e tests have race condition on navigation (#15468) (9bd5123)
⚙️ CI
🏡 Chores
- fix eslint config lookup in formatting hooks (#15516) (38a88b3)
- remove duplicative agents.md, document ai tool compatibility (#15472) (6216f56)
- remove template lockfiles (#15494) (362bf2f)
- replace magic strings with centralized constants (#15475) (8422668)
- claude post-write hook causes error when IDE checks output and doesn't apply formatting correctly (#15445) (033b943)
- claude: add playwright mcp (#15447) (f15b9a3)
- plugin-multi-tenant: use beforeNav instead of beforeNavLinks for tenant selector (#15499) (5d7d544)
🤝 Contributors
- sanbrien (@sanbrien)
- Neha Prasad (@naaa760)
- Kendell (@kendelljoseph)
- Sean Zubrickas (@zubricks)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Jake (@jacobsfletch)
- Kurt Tomlinson (@kurttomlinson)
- Colum Kelly (@columk1)
- German Jablonski (@GermanJablo)
- Jessica Rynkar (@JessRynkar)
- Elliot DeNolf (@denolfe)
v3.74.0 (2026-01-30)
🚀 Features
- thread override access in doc level hooks (#15421) (85d5263)
- extend strictDraftTypes to all draft operations (#15292) (9239164)
- add support for custom UnpublishButton component (#15400) (94254da)
- storage-r2: client uploads using R2 multipart api (#14733) (5c38902)
- ui: allows opting out of popup closing logic (#15407) (fb2b602)
- ui: allows customizing Popup component portal className (#15406) (0f55464)
Override Access in Document-Level Hooks - Access the overrideAccess value inside collection and global hooks. Useful when hook logic needs to know whether access control was bypassed, such as when querying related documents up a hierarchy. #15421
export const Posts: CollectionConfig = {
slug: 'posts',
hooks: {
beforeChange: [
({ overrideAccess, req }) => {
if (overrideAccess) {
// Access control was bypassed
}
},
],
},
}
Extended strictDraftTypes to All Operations - When strictDraftTypes: true is enabled, TypeScript now enforces draft type safety across all Local API operations (not just queries). The draft option is forbidden for collections/globals without drafts enabled, preventing silent runtime behavior where draft flags are ignored. #15292
import { buildConfig } from 'payload'
export default buildConfig({
typescript: {
strictDraftTypes: true, // Enables compile-time draft enforcement
},
// ...
})
⚠️ Note: Generic collection slugs may require explicit type assertions when using draft options.
Custom UnpublishButton Component - Customize the UnpublishButton in collection and global configs, following the same pattern as PublishButton and SaveButton. Previously hardcoded. #15400
export const Posts: CollectionConfig = {
slug: 'posts',
admin: {
components: {
edit: {
UnpublishButton: '/components/CustomUnpublishButton',
},
},
},
}
R2 Multipart Client Uploads (storage-r2) - Upload large files directly from the client using R2's multipart API. Files are split into smaller parts and uploaded separately, avoiding Cloudflare Worker memory limits. #14733
Popup Prevent Close Attribute (ui) - Add interactive elements inside popups without triggering close behavior by adding the data-popup-prevent-close attribute. #15407
<Popup>
<button data-popup-prevent-close onClick={handleClick}>
Click me without closing
</button>
</Popup>
Popup Portal className (ui) - Customize the Popup component's portal container with the new portalClassName prop. #15406
<Popup portalClassName="my-custom-portal-class">
{/* content */}
</Popup>
🐛 Bug Fixes
- isolate payload-preferences by auth collection (#15425) (2dc2e7c)
- traverseFields returning wrong parentPath dot notation for non-localised tabs (#15394) (99b051e)
- widgets and other features failing with transitive dependency imports (#15392) (5561799)
- replace deprecated scmp with crypto.timingSafeEqual (#15322) (2511c02)
- find afterRead hooks should behave like findByID (#15357) (3e27155)
- remove depth from count operation types (#15356) (dfc1600)
- publish button incorrectly shown after saving draft when access denied (#15319) (e833fe6)
- next: version view throws useLocale() server error (#15380) (2ce26fa)
- next: ensure query preset from url is applied (#15323) (592f404)
- next: ensure save preset button is not shown when there are no changes (#15320) (e9af097)
- plugin-cloud-storage: prevent infinite loop when cropping media (#15393) (345a9c7)
- plugin-cloud-storage: adds beforeChange hook to generate url on create (#15401) (d269d39)
- richtext-slate: localized indicator not displaying in label (#15412) (126f713)
- ui: use the formatAdminUrl function to generate unpublish url (#15375) (453e8a6)
- ui: restore default columns after clearing query preset (#15360) (029699d)
- ui: prevent globals crash with arrays fields when lock state user is undefined in handleDocumentLocking (#15259) (ea76ca0)
- ui: getEntityConfig did not respect globalSlug if collectionSlug is undefined (#15362) (b54059c)
📚 Documentation
- clarify beforeValidate and beforeChange hook data behavior (#15300) (ba9605e)
- add payload.logger.error usage guidelines to CLAUDE.md (#15398) (cdbfda2)
- updated redirects plugin integration docs and postgres connection troubleshooting (#15383) (9b2221e)
- improve select jsdocs and empty select docs (#15336) (4181a12)
🧪 Tests
📝 Templates
🔨 Build
⚙️ CI
- enable retries for int and unit tests (#15397) (8b21263)
- cache e2e prod preparation to run once instead of per-shard, various improvements and flake fixes (#15368) (2b3b9d5)
- automatically shard int tests (#15367) (1041b15)
- disable playwright tracing for first test runs, to improve performance and reduce flakes (#15337) (ab603c3)
- automatically shard e2e tests (#15366) (2f19f8f)
- add missing value property to outputs (#15338) (479b057)
- bump monorepo Node.js version from 23.11.0 to 24.13.0 (#15364) (d95c365)
- add linked PR feature to popular-issues action (#15355) (614f13c)
🏡 Chores
- export getSafeFileName utility (#15424) (6b45fee)
- replace rmdirSync to rmSync (#15420) (17c0a3f)
- claude: add respond-to-discussion-features claude command (#15391) (1f7fe63)
- deps: bump form-data, tar, wrangler, and @opennextjs/cloudflare dependencies (#15435) (5875cd0)
- deps: bump tsx (#15363) (7043e3f)
- plugin-multi-tenant: removes basePath arg (#15202) (bd80784)
- ui: move unpublish actions into document controls dropdown (#15417) (99d61db)
🤝 Contributors
- Ricardo Tavares (@rjgtav)
- Patrik (@PatrikKozak)
- German Jablonski (@GermanJablo)
- Jessica Rynkar (@jessrynkar)
- Jarrod Flesch (@JarrodMFlesch)
- Tobias Odendahl (@tak-amboss)
- Paul (@paulpopus)
- Elliot DeNolf (@denolfe)
- Sean Zubrickas (@zubricks)
- Alessio Gravili (@AlessioGr)
- Georg Schelkshorn (@GeorgS)
- Muhammad Hassaan Farooq (@Muhammad-Hassaan-Farooq)
- RajeshKumar11 (@RajeshKumar11)
v3.73.0 (2026-01-23)
🚀 Features
- next.js 16 support (#14456) (18ca83b)
- db-sqlite: add
busyTimeoutoption (#15317) (0c235c3) - db-sqlite: add WAL mode support (#15278) (3357aa6)
- drizzle: predefined migration for
blocksAsJSON: true(#15257) (1b7b13d) - live-preview: expose requestHandler arg to hooks (#15302) (4f3c31f)
- plugin-mcp: adds select API with CRUD tools (#15301) (268b33a)
- ui: use native useEffectEvent if available (#15304) (f0458fb)
Feature Details
🔥 Next.js 16 Support - Full compatibility with Next.js 16, including Turbopack HMR and build support. Requires Next.js >16.1.1-canary.35 or 16.2.0+. Templates will be updated after Next.js 16.2.0 is released. Support for cache components will follow in a future release #14456
WAL Mode Support (db-sqlite) - Enable SQLite Write-Ahead Logging for improved concurrent read/write performance. Configurable synchronous mode and journal size limit. #15278
Busy Timeout Option (db-sqlite) - Set maximum wait time in milliseconds when the database is locked, preventing SQLITE_BUSY errors in high-concurrency scenarios. #15317
Predefined Migration for blocksAsJSON (drizzle) - Migrate existing projects to use blocksAsJSON: true with a single command. Automatically updates your Payload config and generates the required migration. #15257
pnpm payload migrate:create --file @payloadcms/db-postgres/blocks-as-json
Request Handler in Live Preview Hooks (live-preview) - The useLivePreview hook (React and Vue) now accepts a requestHandler argument, allowing customization of data fetching. Useful when your frontend proxies requests or uses external middleware. #15302
Select API for MCP Tools (plugin-mcp) - Find, Create, and Update tools for Globals and Collections now support the select API, reducing token usage and aligning with Payload's existing query capabilities. #15301
Native useEffectEvent (ui) - Uses React's native useEffectEvent when available (React 19.2.0+), falling back to the existing polyfill for older versions. #15304
🐛 Bug Fixes
- select hasMany prevent duplicate values (#15218) (f4e8990)
- orderable fractional indexing case-sensitivity issue with PostgreSQL (#14867) (ef27ad9)
- find distinct sort on a different field (#15233) (e95f26d)
- conditional tabs breaking in Next.js 16 due to unstable tab id (#15270) (f5a7a00)
- correct previousValue and value in afterChange when using seo-plugin (#15253) (b6b6bab)
- db-mongodb: fix projection handling for relationship fields in GraphQL queries with select (#14850) (ace3447)
- drizzle: d1 sqlite IN querying of
idwhen any other join is present in the query (#15290) (4f5a9c2) - next: relationship fields with maxDepth: 0 show "Untitled - ID" in diff view (#15305) (65238c5)
- plugin-mcp: auto-detect basePath from Payload config routes (#15189) (dbc06f6)
- richtext-lexical: internal links render as href="#" in versions view (#15308) (ab4102c)
- sdk: correct return types with
select(#15289) (db40d7b) - ui: diff view columns have unequal widths for nested fields causing text misalignment (#15330) (db72a65)
- ui: upsertPreferences did not return preferences when creating new preferences (#15321) (94d5728)
- ui: pass the locale to reorder endpoint in orderable table (#14839) (d6bb3de)
📚 Documentation
- add jsdocs to query presets api (#15306) (3dbaed8)
- small md fix (#15299) (9a1eb77)
- remove csv as a language for code blocks (#15265) (259eac4)
📝 Templates
⚙️ CI
🏡 Chores
- removes never implemented readDrafts access arg on globals (#15297) (12b679f)
- export fractional indexing utilities (#15286) (02800b0)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Alessio Gravili (@AlessioGr)
- Kendell (@kendelljoseph)
- David Murdoch (@dsm23)
- Rafau (@RafalFilipek)
- Aaron Claes (@AaronClaes)
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Elliot DeNolf (@denolfe)
- Jens Becker (@jhb-dev)
- Paul (@paulpopus)
- Vladyslav Prosolupov (@vladyslavprosolupov)
- Jessica Rynkar (@jessrynkar)
v3.72.0 (2026-01-16)
🚀 Features
- adds experimental option localizeStatus and allows unpublish per-locale functionality (#14667) (d77af00)
- plugin-mcp: add depth parameter support to all MCP find resource tools (#14931) (c979fb3)
Localized Status (Experimental) - Each locale can now track and manage its own publication status independently. Publish or unpublish individual locales without affecting others, with locale-aware UI and version history. Requires enabling at both config and collection level. #14667
// payload.config.ts
export default buildConfig({
experimental: {
localizeStatus: true,
},
// ...
})
// collections/Posts.ts
export const Posts: CollectionConfig = {
slug: 'posts',
versions: {
drafts: {
localizeStatus: true,
},
},
}
⚠️ Migration Required: If you have existing version data, run the provided migration helper to convert
_statusfields from strings to locale objects. See PR #14667 for full migration guide.
Depth Parameter Support (plugin-mcp) - MCP resource tools now support a depth parameter (0-10) to control relationship population depth. Use depth: 0 for lightweight ID-only responses or higher values for fully populated relationship data. Significantly reduces token count when reading documents. #14931
🐛 Bug Fixes
- thumbnailURL hook, virtually populate from thumbnail size (#15232) (beeb269) (https://github.com/payloadcms/payload/commit/4f452ac))
selectinfindByIDwithdraft: truemay return a wrong version (#14742) (49c9fa9)- use window.location.origin as fallback for API URL copy (#15220) (a46e3a2)
- folder creation errors when collection uses translation function labels (#15216) (1a3aeb8)
- correct image size URLs in beforeChange (#15214) (da12eed)
- db-mongodb: hasMany relationship filtering with equals operator returns no results (#15204) (1756c0d)
- deps: bump undici to 7.18.2 to mitigate chained decompression (#15221) (591f9d2)
- plugin-ecommerce: issue with slug map ignoring variants and threading through cart data (#15234) (4b6529f)
- plugin-ecommerce: translations not being mapped correctly (#15205) (3337403)
- templates: prevent jobs run if secret unset (#15207) (8f50f83)
- translations: correct Russian translations for UI states in general section (#14953) (454042e)
- ui: truncates long JSON cells in list view (#9214) (6827978)
📚 Documentation
🧪 Tests
- fix race condition in language switcher helper (#15206) (f98d915)
- add
@payloadcms/storage-s3 clientUploadsintegration test suite (#15194) (4dce061) - fields with defaultValue should not be overwritten in upsert (#15197) (c684c6b)
⚙️ CI
🏡 Chores
- adds generate-translations claude skill (#15215) (f1f2be6)
- enforce no-console rule for
@payloadcms/ui(#15195) (54db43d) - plugin-redirects: add Swedish translation (#15213) (e19f432)
- translations: fixes to Swedish translation (#15212) (d3b12a1)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Vincent Vu (@rubixvi)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Kendell (@kendelljoseph)
- Elliot DeNolf (@denolfe)
- Jens Becker (@jhb-dev)
- Patrik (@PatrikKozak)
- spiner2000 (@spiner2000)
- Marcus Forsberg (@marcusforsberg)
- Jessica Rynkar (@jessrynkar)
- Said Akhrarov (@akhrarovsaid)
- Jeffery To (@jefferyto)
v3.71.0 (2026-01-13)
🚀 Features
- supersedes option to job queue concurrency controls (#15179) (9aeb843)
- add support for custom Status component in document controls (#11154) (ef863e6)
- add exclusive concurrency controls for workflows and tasks (#15177) (35fe09d)
- add bulkOperations.singleTransaction config option (#14387) (92da9fa)
- add support for additional IANA timezones, custom UTC offsets and overriding the timezone field (#15120) (a8785ba)
- ability to cancel current job from within workflow or task handlers (#15119) (1bd3146)
- add typescript.strictDraftTypes flag for opt-in draft query type safety (#14388) (58faafd)
- drizzle: include collection and global slugs in validation errors (#15147) (910d274)
- plugin-ecommerce: new hooks, cart logic moved to the server and fixed several bugs (#15142) (dcd4030)
- plugin-ecommerce: add new method refreshCart in useCart (#14765) (#14767) (529726e)
- plugin-import-export: refactor plugin and add import functionality (#14782) (13e6035)
- plugin-mcp: add draft parameter support to MCP find resource tool (#14924) (744a593)
- plugin-mcp: adds tools that can find and update globals (#15091) (f6d9873)
- plugin-nested-docs: add req parameter to GenerateURL and GenerateLabel types in nested docs (#14617) (6821a09)
- plugin-redirects: add Japanese translations (#15080) (c5b57f7)
- plugin-search: enables skipping of document syncing (#14928) (dfcf15c)
- sdk: automatically fallback to generated types attempt (#15167) (ae50d39)
- sdk: add proper error handling (#15148) (bfe2154)
Feature Details
Job Queue Concurrency Supersedes - Newer jobs can automatically delete older pending jobs with the same concurrency key. Enables "last queued wins" behavior for scenarios where only the latest state matters. #15179
concurrency: {
key: ({ input }) => `generate:${input.documentId}`,
exclusive: true,
supersedes: true, // Newer jobs delete older pending ones (not yet completed and did not start processing yet)
}
Exclusive Concurrency Controls - Prevents race conditions when multiple jobs operate on the same resource. Jobs with the same concurrency key will not run in parallel. Requires enableConcurrencyControl: true (will default to true in v4.0). #15177
export default buildConfig({
jobs: {
enableConcurrencyControl: true,
workflows: [{
slug: 'syncDocument',
concurrency: ({ input }) => `sync:${input.documentId}`,
handler: async ({ job }) => {
// Only one job per documentId runs at a time
}
}]
}
})
Job Cancellation from Handlers - Throw JobCancelledError from within a task or workflow handler to stop the job without retrying. #15119
Custom Status Component - Replace the Status section in document or global edit views without replacing the entire Edit view. Useful for custom locale publishing logic or additional status indicators. #11154
admin: {
components: {
edit: {
Status: '/components/Status/index.tsx#Status',
},
},
},
Bulk Operations Single Transaction (db-mongodb) - Handle database transaction limitations when processing large numbers of documents in bulk operations. Useful for DocumentDB and Cosmos DB which have cursor limitations within transactions. #14387
Additional IANA Timezones & Custom UTC Offsets - Support for additional IANA timezone names via DateTimeFormat API validation, custom UTC offsets in ±HH:mm format, and the ability to override the timezone field configuration. #15120
{
name: 'eventTime',
type: 'date',
timezone: {
supportedTimezones: [
{ label: 'UTC+5:30 (India)', value: '+05:30' },
{ label: 'UTC-8 (Pacific)', value: '-08:00' },
{ label: 'UTC+0', value: '+00:00' },
],
},
}
Override the timezone field:
{
name: 'publishedAt',
type: 'date',
label: 'Published At',
timezone: {
override: ({ baseField }) => ({
...baseField,
admin: {
...baseField.admin,
disableListColumn: true, // Hide from list view columns
},
}),
},
}
Strict Draft Types (typescript) - Opt-in strictDraftTypes flag for correct type safety when querying drafts. When enabled, find operations with draft: true will correctly type required fields as optional. Will become default in v4.0. #14388
export default buildConfig({
typescript: {
strictDraftTypes: true, // defaults to false
},
})
Validation Error Context (drizzle) - Unique constraint ValidationErrors now include data.collection or data.global for better error context when debugging. #15147
Server-Side Cart Logic (plugin-ecommerce) - Cart logic moved to the server with new REST API endpoints. New hooks: onLogin (merge guest cart with user cart), onLogout (clear session), clearSession, mergeCart, and refreshCart. Support for custom cart item matchers and MongoDB-style $inc operator for quantity changes. #15142
/**
* Custom cart item matcher that includes fulfillment option.
*/
const fulfillmentCartItemMatcher: CartItemMatcher = ({ existingItem, newItem }) => {
const existingProductID =
typeof existingItem.product === 'object' ? existingItem.product.id : existingItem.product
const existingVariantID =
existingItem.variant && typeof existingItem.variant === 'object'
? existingItem.variant.id
: existingItem.variant
const productMatches = existingProductID === newItem.product
const variantMatches = newItem.variant
? existingVariantID === newItem.variant
: !existingVariantID
const existingFulfillment = existingItem.fulfillment as string | undefined
const newFulfillment = newItem.fulfillment as string | undefined
const fulfillmentMatches = existingFulfillment === newFulfillment
return productMatches && variantMatches && fulfillmentMatches
}
refreshCart Method (plugin-ecommerce) - Manually refresh cart state after direct modifications, allowing the UI to stay in sync without being blocked by addItem's uniqueness validation. #14767
Import Functionality (plugin-import-export) - Complete plugin refactor with new import functionality. Config is now per-collection with required collections array. Supports disabling import/export per collection and custom collection overrides. #14782 ⚠️ BREAKING CHANGE
importExportPlugin({
overrideExportCollection: (collection) => {
collection.admin.group = 'System'
collection.upload.staticDir = path.resolve(dirname, 'uploads')
return collection
},
overrideImportCollection: (collection) => {
collection.admin.group = 'System'
collection.upload.staticDir = path.resolve(dirname, 'uploads')
return collection
},
collections: [
{
slug: 'posts',
import: false, // disables import functionality, export enabled by default
},
{
slug: 'pages',
export: ({ collection }) => {
collection.admin.group = 'System'
collection.upload.staticDir = path.resolve(dirname, 'uploads')
return collection
},
disableJobsQueue: true, // disable jobs queue for this collection only
},
],
debug: true,
})
Draft Parameter for MCP Find (plugin-mcp) - Query draft/unpublished documents via the MCP plugin's find tool using the new draft boolean parameter. #14924
Globals Support (plugin-mcp) - New MCP tools to find and update globals. #15091
Request Parameter in Nested Docs (plugin-nested-docs) - req parameter added to generateURL and generateLabel functions for more flexibility (e.g., reading current locale). #14617
Skip Sync (plugin-search) - Conditionally skip syncing documents to the search index based on locale, document properties, or other criteria. #14928
skipSync: async ({ locale, doc, collectionSlug, req }) => {
if (!locale) return false
const tenant = await req.payload.findByID({
collection: 'tenants',
id: doc.tenant.id,
})
return !tenant.allowedLocales.includes(locale)
}
Automatic Type Inference (sdk) - The SDK automatically uses your generated types via module augmentation—no need to manually pass GeneratedTypes. #15167
import { PayloadSDK } from '@payloadcms/sdk'
const sdk = new PayloadSDK({}) // Types inferred automatically from payload-types.ts
Proper Error Handling (sdk) - The SDK now throws PayloadSDKError on failed API requests with status, errors, response, and message properties. #15148
import { PayloadSDKError } from '@payloadcms/sdk'
try {
await sdk.create({ collection: 'posts', data: { ... } })
} catch (err) {
if (err instanceof PayloadSDKError) {
console.log(err.status) // 400
console.log(err.errors) // [{ name: 'ValidationError', message: '...', data: {...} }]
}
}
Japanese Translations (plugin-redirects) - Localized admin UI strings for Japanese users. #15080
🐛 Bug Fixes
- wrong construction of urlToUse leads to false alert with logger.error (#15190) (ec6bba5)
- adds missing transactions to login and logout operations (#15134) (dd494be)
- set basePath from next config as env variable (#15154) (a8bfade)
- throw error on empty relationTo array and allow disabling lockDocuments on all collections (#14871) (9521ec6)
- add distinct validate to richtext field type definition (#15069) (d68e75a)
- exclude files from being sent to the form-state action (#15174) (aaea133)
- full image urls stored in DB (#15089) (d462f9b)
- field schema map paths (#10852) (d288752)
- custom OPTIONS endpoints are intercepted and cannot set custom CORS headers (#15153) (c103667)
- upload drawer not loading data for uploads without files (#15150) (00fb6e8)
- cannot read private member #headers error on Node.js 24 when using isolateObjectProperty (#15116) (e214deb)
- db-mongodb: avoid unnecessary
$lookupwhen a join field is not selected (#15149) (e39b1b5) - db-mongodb:
existsoperator on fields that have an array value in the db (#15152) (0afe200) - db-mongodb: find id field from flattened fields (#15110) (40081f4)
- db-postgres: add filenameCompoundIndex baseIndexes for upload collections (#15182) (01f90c9)
- db-postgres: localized and hasMany/polymorphic relationships/uploads inside blocks (#15095) (01e4412)
- drizzle: unique field errors were not thrown as ValidationErrors (#15146) (43c19cb)
- live-preview: remove payload import (#15160) (ec658a4)
- plugin-cloud-storage: should persist external data returned by handleUpload (#15188) (7d80d21)
- plugin-cloud-storage: prevent deleting original file when duplicating (#14961) (9d54267)
- plugin-mcp: handle defaultDepth: 0 in api key authentication (#15014) (e0e058c)
- plugin-multi-tenant: cannot clear selected tenant from dashboard view (#15141) (cd77e5d)
- richtext-lexical,ui: make uploadNode default to
altuser-defined values. (#15097) (3290b04) - storage-*: add range headers to storage adapters (#14890) (ef90811)
- storage-s3: respect upload limits with client uploads (#15176) (4a6189e)
- templates: fix mobile menu auth buttons overflow in ecommerce template (#15020) (6c1109f)
- templates: improve cli detection in cloudflare template (#15098) (5d21ed1)
- templates: add recommended serverExternalPackages to cloudflare (#15094) (0eed581)
- translations: improve Japanese translations for naturalness and consistency (#15077) (88a901c)
- ui: ensure up-to-date upload preview thumbnails in admin panel (#15029) (6f4b272)
- ui: use optional chaining for potentiallyStalePath (#15185) (38cd67a)
- ui: virtual fields with virtual: true show sort chevrons in list view (#15186) (33c3630)
- ui: prevent text overlap in breadcrumbs (#15040) (0e27f19)
- ui: avoid creating hasMany options during IME composition (#15086) (98bc876)
- ui: duplicate document has unused serverURL dependency (#15178) (6d212b8)
- ui: bulk upload error count (#15155) (0a46f4e)
- ui: margins on small screens when using hideGutter in group (#15041) (22f94cd)
- ui: preserve beforeInput/afterInput components in bulk edit (#14954) (c62dc2a)
- ui: prevent wrong scroll target when adding rows in repeated array blocks (#15047) (f13a741)
- ui: crop width and height inputs limited to -1 of max (#15101) (3a6d3bd)
⚡ Performance
- optimized collection create when versions are enabled (#14885) (25813a7)
- graphql: optimized join count when docs are not needed (#14872) (6025eff)
🛠 Refactors
- clean up generated type resolution (#15163) (51d6cd2)
- deprecate returning failed state from job queue handlers (#15102) (070ded7)
📚 Documentation
- clarify available operations for beforeOperation hook (#14774) (8c59762)
- update link for MDN docs on cookies in requests (#15075) (0859f1c)
- updates custom upload component examples (#14678) (d3d8b4e)
- add graphql multi-field sort note (#15123) (14ac061)
- task failure docs (#15096) (81df3d6)
🧪 Tests
- remove silly tests from accessComposition unit tests (#15158) (cc33129)
- fixes flaky form state test (#15128) (251fc68)
- adds assert helpers to the a11y suite (#15132) (daf8061)
- running a11y test suite sequentially (#15130) (536582f)
- update outdated hardcoded postgres connection strings (#15114) (7930f44)
- fixes lexical block test flakes (#15113) (13edb8a)
⚙️ CI
- remove website post release notification (#15133) (5ebda61)
- deps: bumps setup-node version from 4 to 6 (#15122) (fe9119b)
🏡 Chores
- deprecate skip parameter from db-adapters (#15183) (ea15f00)
- add v4 comments for relationTo types (#15187) (d7351d5)
- upgrade to pnpm 10 (#15137) (1c8d515)
- refactor withPayload back to js (#15159) (44af1ad)
- plugin-mcp: adds config.admin.user as an optional default userCollection (#14989) (cdabf79)
- templates: replace arbitrary tailwind values with utilities in ecommerce template (#14654) (67cc734)
⚠️ BREAKING CHANGES
-
plugin-import-export: refactor plugin and add import functionality (#14782) (13e6035)
This PR works to refactor the entire plugin so it's easier for us to work with it going forward and also implements import functionality.
🤝 Contributors
- Sasha (@r1tsuu)
- Jeffery To (@jefferyto)
- Alessio Gravili (@AlessioGr)
- tapartdev (@tapartdev)
- Paul (@paulpopus)
- Patrik (@PatrikKozak)
- Elmo (@Spreizu)
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Jessica Rynkar (@jessrynkar)
- roboin (@Robot-Inventor)
- Tobias Odendahl (@tak-amboss)
- Rick Geersing (@RickGeersing)
- Dan Ribbens (@DanRibbens)
- Riley Langbein (@rilrom)
- David Wensley (@wensleyio)
- Bernhard Frick (@baer95)
- Said Akhrarov (@akhrarovsaid)
- Kendell (@kendelljoseph)
- Jiayi Wang (@Jeromestein)
- Jake (@jacobsfletch)
- Jens Becker (@jhb-dev)
- Sean Zubrickas (@zubricks)
- Anton Timmermans (@atimmer)
- Ricardo Tavares (@rjgtav)
- Marcin Gierada (@teastudiopl)
- Colum Kelly (@columk1)
- Elliot DeNolf (@denolfe)
- Jonathan Elmgren (@jonathanelmgren)
- Thomas Coldwell (@thomas-coldwell)
v3.70.0 (2026-01-05)
🚀 Features
- support qs-esm sort arrays in REST API (#15065) (2ccf898)
- richtext-lexical: adds docs page for lexical blocks, adds new lexical block component types and styles (#14971) (329115c)
Multi-Column REST API Sorting
Sort by multiple columns in the REST API using array syntax, aligning REST API behavior with the Local API. Previously only string-based sorting was supported. #15065
// Sort by multiple fields via REST API query string
// GET /api/posts?sort[0]=createdAt&sort[1]=-title
// Equivalent to Local API:
const posts = await payload.find({
collection: 'posts',
sort: ['createdAt', '-title'],
})
Lexical Blocks Documentation & Component Styles (richtext-lexical)
New documentation page for Lexical blocks with comprehensive examples showing usage and customization. Also introduces new block component types and styles for enhanced rich text editing. https://github.com/payloadcms/payload/pull/14971
See the https://payloadcms.com/docs/rich-text/blocks for full details.
🐛 Bug Fixes
- s3 plugin uploads files before validation (#14988) (502947b)
- add beforeDocumentControls to globals generate importmap (#15036) (4468197)
- warning during Next.js build "the request of a dependency is an expression" (#15007) (cd87ab4)
- next: turbopack build version check not working for 16.1.1 canaries (#15005) (ab68a2f)
- plugin-mcp: pin modelcontextprotocol/sdk dependency version to 1.24.0 (#15017) (1a9d665)
- storage-*: allow prefix to always exist as a field via alwaysInsertFields flag (#14949) (23a8689)
- ui: invalid sass imports to support windows - add Stylelint to prevent regression (#15028) (c66e953)
🧪 Tests
- fix console logs not appearing on vitest (#15008) (e3879bf)
- ensure vitest vscode extension env variables match CI (#15009) (f6248f9)
- migrate from jest to vitest eslint plugin, remove remaining jest references (#14997) (418375c)
🏡 Chores
- adds comment in image component (#14663) (6459ebc)
- bump nodemailer to 7.0.12 (security) (#15062) (aa61b31)
- narrow down files affected by vitest lint rules (#15000) (b97a063)
- claude: fix typo in claude skills access control advanced file (#15060) (5cbdca1)
- deps: bump dnd-kit (#15083) (07c36a3)
⚠️ BREAKING CHANGES
@payloadcms/storage-s3
Only users with custom hooks on S3 upload fields are affected — standard plugin usage is unchanged.
- External upload process for the S3 plugin has moved from
beforeChangetoafterChangeas a result of fix: s3 plugin uploads files before validation (#14988)
This change was necessary to ensure that files uploaded to S3 have passed all validations and been saved to the document, preventing orphaned external files.
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Sean Zubrickas (@zubricks)
- Vincent Vu (@rubixvi)
- Paul (@paulpopus)
- Jessica Rynkar (@jessrynkar)
- Jonathan Elmgren (@jonathanelmgren)
- Patrikbjoh (@Patrikbjoh)
- Anders Semb Hermansen (@andershermansen)
- Riley Langbein (@rilrom)
- Elliot DeNolf (@denolfe)
v3.69.0 (2025-12-19)
🚀 Features
- modular dashboards - widgets (#13683) (f111624)
- adds cursor rules and AGENTS.md to templates (#14889) (19fcf99)
Modular Dashboards with Widgets
Introduces customizable admin dashboards with draggable, resizable widgets. Build personalized dashboard layouts with full keyboard accessibility for reordering and resizing. Future updates will add widget fields (props) for configurable widgets and dashboard presets for sharing layouts. #13683
https://github.com/user-attachments/assets/6c08d8d6-c989-4845-b56f-6d3fbd30b1af
See the RFC discussion for background and roadmap.
AI Development Resources (templates)
All templates now ship with AGENTS.md and .cursor/rules/ directory for improved AI-assisted development with tools like Copilot and Cursor. #14889
See more about AGENTS.md
🐛 Bug Fixes
- basePath not working properly with admin routes (#14967) (fa6b503)
- get field by path for blocks (#14984) (519a3c6)
- improves upload security for PDFs and SVGs (#14929) (61298c6)
- missing range headers (#14887) (ec7c192)
- next: status component incorrectly shows as published status on new documents saved as drafts when readVersions permissions are false (#14950) (394c024)
- plugin-mcp: adds collection and strategy to user (#14981) (042d7eb)
- plugin-multi-tenant: relationTo arrays inflating filterOptions where query size (#14944) (98b6791)
- richtext-lexical: blocksFeature with relationship exposes other tenants (#14985) (3025377)
- storage-s3: encode filename in generated URL (#14438) (86855e1)
- ui: use portals for popup to prevent clipping, improve keyboard navigation (#14910) (af09932)
🛠 Refactors
📚 Documentation
- fix duplicate anchor links (#14976) (4c91d04)
- update screenshot for fields/rich-text (#14979) (2117dbf)
🧪 Tests
- migrate to
vitest(#14337) (4e45432) - move mongodb to different port to avoid port conflicts (#14993) (b4abd04)
- improve database test setup (#14982) (e3c512a)
- multi-tenant login tiles (#14940) (47f63fa)
🏡 Chores
🤝 Contributors
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Sean Zubrickas (@zubricks)
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Kendell (@kendelljoseph)
- Jake (@jacobsfletch)
- Jessica Rynkar (@jessrynkar)
- Paul (@paulpopus)
- Jens Becker (@jhb-dev)
- Patrik (@PatrikKozak)
v3.68.4 (2025-12-14)
🐛 Bug Fixes
- previousValue from hooks should be populated within lexical blocks (#14856) (bb1501e)
- deps: enforce Next.js 15.4.10 (#14908) (7c675fa)
- next: properly construct local req url (#14907) (471cd1b)
- ui: show localized locale name for publish specific locale button (#14906) (848ea65)
- ui: relationship add button unsafe permissions property access (#14903) (127e41a)
📚 Documentation
- remove unused variable from custom field label translation (#14911) (77f96a4)
- update collection access control reference link on collection config page (#14905) (3a1eb77)
⚠️ BREAKING CHANGES
-
deps: enforce Next.js 15.4.10 (#14908) (7c675fa)
Address CVE-2025-67779.
🤝 Contributors
- Jake (@jacobsfletch)
- Riley Langbein (@rilrom)
- Jeffery To (@jefferyto)
- Aaron Claes (@AaronClaes)
- kat (@puzzlesremixed)
- Jessica Rynkar (@jessrynkar)
v3.68.3 (2025-12-11)
⚠️ Security Issue
A high-severity Denial of Service (CVE-2025-55184) and a medium-severity Source Code Exposure (CVE-2025-55183) affect React 19 and frameworks that use it, like Next.js.
Full details here: https://vercel.com/kb/bulletin/security-bulletin-cve-2025-55184-and-cve-2025-55183#how-to-upgrade-and-protect-your-next.js-app
While this is not a Payload vulnerability, it may affect any Payload project running on the affected versions of Next.js. Payload does not install any of these dependencies directly, it simply enforces their versions through its peer dependencies, which will only warn you of the version incompatibilities.
You will need to upgrade React and Next.js yourself in your own apps to the patched versions listed below in order to receive these updates.
Resolution
You are strongly encouraged to upgrade your own apps to the nearest patched versions of Next.js and deploy immediately.
Quick steps:
If using pnpm as your package manager, here's a one-liner:
pnpm add next@15.4.9
For a full breakdown of the vulnerable packages and their patched releases, see https://vercel.com/kb/bulletin/security-bulletin-cve-2025-55184-and-cve-2025-55183#how-to-upgrade-and-protect-your-next.js-app.
🐛 Bug Fixes
🤝 Contributors
- Jake (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
v3.68.2 (2025-12-10)
🐛 Bug Fixes
Fixes Windows users getting ENOENT errors on
devstartup.
- next: unhandled error in renderListView server function when no user present (#14878) (10a8f0f)
- next: merge user serverExternalPackages in withPayload (#14881) (dcecc46)
🛠 Refactors
- replace generic Error('Unauthorized') with UnauthorizedError (#14879) (c9a8aa0)
- next: remove unnecessary react hooks from DefaultTemplate rsc (#14876) (7a94cc1)
🏡 Chores
🤝 Contributors
- Rot4tion (@Rot4tion)
- Alessio Gravili (@AlessioGr)
- Maxim Seshuk (@maximseshuk)
v3.68.0 (2025-12-09)
🚀 Features
Turbopack Build Support (next) - Automatically enables Turbopack Build compatibility when using Next.js ≥ 16.1.0-canary.3. The withPayload wrapper now detects supported versions and enables transitive dependency externalization, unlocking significantly faster production builds with Turbopack. #14845
🐛 Bug Fixes
- adds read and readDistinct to hook mapping (#14853) (0da0da8)
- undefined drafts error in collections with join fields (#14855) (3a29cec)
- use hasDraftsEnabled utility instead of direct check (#14843) (9c9c7c5)
- file objects being serialized to plain objects in upload form state (#14818) (d86c174)
- db-mongodb: correctly pass through collation config in the adapter to be applied in queries via locales (#11242) (db59cb4)
- plugin-multi-tenant: simplified getTenantOptions function and added access control for regular users (#14620) (f7cc078)
- storage-*: upload filename respects prefix (#14566) (ccfaee0)
- ui: component AddNewRelation saves relationTo as first collection instead of selected collection (#14836) (8c5c1fb)
- ui: list drawer per-page dropdown resets to 10 instead of showing saved limit (#14830) (db13a60)
📚 Documentation
🧪 Tests
🔨 Build
- add build:all:force to clean all then build all (d90bccb)
- bump swc-related dependencies (#14834) (617311a)
⚙️ CI
- remove prepack and prepublishonly scripts (#14832) (20914cc)
- add internal-debug release mode (#14820) (ce934b4)
🏡 Chores
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Alessio Gravili (@AlessioGr)
- Riley Langbein (@rilrom)
- Jarrod Flesch (@JarrodMFlesch)
- Adrian Maj (@AdrianMaj)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- Jeffery To (@jefferyto)
- Rot4tion (@Rot4tion)
v3.67.0 (2025-12-05)
🚀 Features
- add groupBy support to query presets (#14808) (2b7aa7a)
- plugin-ecommerce: add ability to enable guest carts with reworked access config (#14565) (90c92f4)
GroupBy Support for Query Presets - Query presets now save and restore groupBy state when switching between presets. Previously, groupBy settings would persist across preset switches and weren't saved as part of the preset configuration. #14808
Guest Carts (plugin-ecommerce) - Enable guest users to create and manage carts without authentication. Carts created by guests are secured with a generated secret stored in local storage. Configure with allowGuestCarts (enabled by default). Also adds isLoading status to all hooks for conditional UI state.
#14565
// Before
ecommercePlugin({
access: {
adminOnly,
adminOnlyFieldAccess,
adminOrCustomerOwner,
adminOrPublishedStatus,
customerOnlyFieldAccess,
}
})
// After
ecommercePlugin({
access: {
adminOnlyFieldAccess,
adminOrPublishedStatus,
customerOnlyFieldAccess,
isAdmin,
isDocumentOwner,
}
})
🐛 Bug Fixes
- add missing beforeInput and afterInput properties to UploadAdmin type (https://github.com/payloadcms/payload/issues/14775) (https://github.com/payloadcms/payload/commit/22a0255)
- add missing afterOperation and beforeOperation hook calls (https://github.com/payloadcms/payload/issues/14778) (https://github.com/payloadcms/payload/commit/e9cd2a5)
- sanitized versions type was incorrect (https://github.com/payloadcms/payload/issues/14810) (https://github.com/payloadcms/payload/commit/51c951f)
- plugin-multi-tenant: moves getGlobalViewRedirect from utilities to rsc exports (https://github.com/payloadcms/payload/issues/14817) (https://github.com/payloadcms/payload/commit/1340818)
- ui: autosave not queued while background process is in flight (https://github.com/payloadcms/payload/issues/14805) (https://github.com/payloadcms/payload/commit/14f042f)
- ui: ensure block error css only gets applied to the affected block (https://github.com/payloadcms/payload/issues/14826) (https://github.com/payloadcms/payload/commit/7520140)
- ui: missing translation support in SelectMany component (https://github.com/payloadcms/payload/issues/14819) (https://github.com/payloadcms/payload/commit/8fa91a5)
⚡ Performance
- cpa: use AST for templates (https://github.com/payloadcms/payload/issues/14648) (https://github.com/payloadcms/payload/commit/bad6680)
⚙️ CI
- clean up bug report template for auto-labeling (https://github.com/payloadcms/payload/commit/ebee8e1)
🏡 Chores
- claude: add coding patterns and best practices section (https://github.com/payloadcms/payload/issues/14829) (https://github.com/payloadcms/payload/commit/c5d8e68)
- deps: bump @types/react and @types/react-dom to 19.2.1 (https://github.com/payloadcms/payload/issues/14815) (https://github.com/payloadcms/payload/commit/d56796b)
- deps: bump next to 15.4.8 in root and test dirs (https://github.com/payloadcms/payload/issues/14811) (https://github.com/payloadcms/payload/commit/1c3417d)
⚠️ BREAKING CHANGES
- plugin-ecommerce: add ability to enable guest carts with reworked access config (https://github.com/payloadcms/payload/issues/14565) (https://github.com/payloadcms/payload/commit/90c92f4)
This PR introduce a breaking change into the plugin as it was necessary in order to provide more secure guest carts.
🤝 Contributors
- Paul (@paulpopus)
- Jake (@jacobsfletch)
- Jessica Rynkar (@jessrynkar)
- Elliot DeNolf (@denolfe)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Jens Becker (@jhb-dev)
v3.66.0 (2025-12-03)
⚠️ Security Issue
A critical-severity vulnerability in React Server Components (CVE-2025-55182) affects React 19 and frameworks that use it, including Next.js (CVE-2025-66478).
You are strongly encouraged to immediately upgrade your own apps to the nearest patched versions of React and Next.js.
While this is not a Payload vulnerability, it may affect any Payload project running on the affected versions of React or Next.js. Payload does not install any of these dependencies directly, it simply enforces their versions through its peer dependencies, which will only warn of the version incompatibilities.
You will need to upgrade React and Next.js yourself in your own apps to the patched versions listed below in order to receive these updates.
Quick steps:
If using pnpm as your package manager, here's a one-liner:
pnpm add react@19.2.1 next@15.4.8
To do this manually:
- In your
package.json:- Bump
reactto19.2.1 - Bump
nextto15.4.8
- Bump
- Reinstall node modules, e.g.
pnpm i - Redeploy your app
Here's a full breakdown of the vulnerable packages and their patched releases:
| Vulnerable package | Patched release |
|---|---|
| React | 19.0, 19.1, 19.2 19.0.1, 19.1.2, and 19.2.1 |
| Next.js | 14.3.0-canary, 15.x, and 16.x (App Router) 14.3.0-canary.88, 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7 |
See https://github.com/payloadcms/payload/issues/14807 for more details.
🚀 Features
- support custom slugify functions (#14117) (59a1607)
- accessibility testing and improvements (#14454) (42cbd70)
- support external JSON schema file references in type generation (#14749) (cb3a078)
- cpa: assume adapter for with-cloudflare-d1 template (#14799) (4f03016)
- richtext-lexical: add align support to upload nodes (#14720) (a21c47b)
Feature Details
Custom Slugify Functions - Override the default slug field behavior with your own slugify function. Useful for special character encoding, additional language support, or custom slug formatting. Also deprecates fieldToUse in favor of useAsSlug for consistency with useAsTitle. #14117
import type { CollectionConfig } from 'payload'
import { slugField } from 'payload'
import slugify from 'slugify';
export const MyCollection: CollectionConfig = {
// ...
fields: [
// ...
slugField({
slugify: ({ valueToSlugify }) => slugify(valueToSlugify, {
// ...additional `slugify` options here
})
})
]
}
Accessibility Testing and Improvements - Adds automated accessibility testing infrastructure including axe a11y scans, focus indicator checks, and horizontal scroll overflow detection. Covers all fields, major views, components, plugins, and Lexical editor. See the a11y report discussion for tracked issues. #14454
External JSON Schema References in Type Generation - Enables $ref pointers to external .json schema files in typescriptSchema field config. External references are resolved relative to process.cwd(). #14749
// payload.config.ts
{
typescript: {
schema: [
({ jsonSchema }) => {
jsonSchema.definitions.MyType = {
$ref: './schemas/my-type.json'
}
return jsonSchema
},
]
}
}
Auto-detect D1 Adapter (cpa) - The with-cloudflare-d1 template now automatically assumes the D1 database adapter, eliminating the database selection prompt during project creation. #14799
Upload Node Alignment (richtext-lexical) - Adds alignment support to upload nodes in the Lexical editor. Upload/media blocks can now be aligned left, center, or right using the FORMAT_ELEMENT_COMMAND. #14720
🐛 Bug Fixes
- remove "all" from JSDoc comment on supported http methods in endpoints (#14777) (8c8def9)
- should exclude svg files from file buffer mime validation (#14751) (015b363)
- deps: bump minimum react and next versions (#14807) (2dfe464)
- plugin-import-export: incorrect user type in Export causing runtime type mismatch (#14790) (61f5aee)
- plugin-multi-tenant: tenant modal not appearing when autosave is off (#14806) (b96e928)
- plugin-multi-tenant: auto assign tenant when autosave is enabled (#14745) (b0674fa)
- richtext-lexical: copying and pasting a single block in Lexical results in an error due to duplicate ID (#14738) (cd9addf)
- richtext-lexical: export serverInlineBlock modules (#14739) (becceb7)
- translations: translate slug field actions (#14784) (5542e56)
- ui: prevent NaN page parameter in polymorphic relationship pagination (#14795) (bbdfdb8)
- ui: reduce spacing between checkbox and first column when few columns shown (#14776) (6ae1bc8)
📚 Documentation
- documents block field image aspect ratio (#14679) (b6a336e)
- document default password reset URL (#14688) (a68423b)
- adds strongly typed examples (#14513) (abe8563)
🧪 Tests
📝 Templates
⚙️ CI
🏡 Chores
⚠️ BREAKING CHANGES
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Jake (@jacobsfletch)
- German Jablonski (@GermanJablo)
- Elliot DeNolf (@denolfe)
- Sean Zubrickas (@zubricks)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- Jessica Rynkar (@jessrynkar)
- Tobias Odendahl (@tak-amboss)
- Ricardo Tavares (@rjgtav)
v3.65.0 (2025-11-25)
❗️Breaking Change
This release disables Turbopack Build support. Please use Webpack to build your app for now. You can do so by using pnpm build on Next.js 15 and pnpm build --webpack on Next.js 16.
🚀 Features
- add augmentable interfaces for collection and global custom properties (#14729) (850c252)
- allow to specify payload instance cache key in
handleEndpoints(#14675) (efa2fd2) - db-mongodb: add afterCreateConnection and afterOpenConnection hooks (#14649) (af6ba86)
- plugin-mcp: add localization support to MCP resource operations (#14334) (a3f490b)
- plugin-mcp: adds a PayloadRequest to custom tool, prompt, and resource handlers (#14644) (0d14b06)
- ui: extract block selector from blocks drawer (#14697) (b9b11f0)
Type-Safe Custom Properties - Add augmentable interfaces for collection and global custom properties: CollectionCustom, CollectionAdminCustom, GlobalCustom, and GlobalAdminCustom. Enables type-safe plugin configuration at the collection/global level with full autocomplete support, matching the existing FieldCustom pattern. #14729
// Augment interfaces in your plugin or project
declare module 'payload' {
export interface CollectionAdminCustom {
disabledFields?: string[]
}
export interface CollectionCustom {
myPluginConfig?: {
enabled: boolean
settings: Record<string, any>
}
}
}
// Now get full type safety in collections
export const Posts: CollectionConfig = {
slug: 'posts',
admin: {
custom: {
disabledFields: ['status'] // ✅ Type-safe!
}
},
custom: {
myPluginConfig: {
enabled: true,
settings: {}
}
}
}
Payload Instance Cache Key - Specify payloadInstanceCacheKey in handleEndpoints and createPayloadRequest to control which cached Payload instance is used for custom endpoints. Useful for multi-tenant scenarios or when managing multiple Payload instances. #14675
MongoDB Connection Lifecycle Hooks (db-mongodb) - Add afterCreateConnection and afterOpenConnection hooks to the MongoDB adapter for performing setup logic after connection/pool initialization. Enables use cases like connection pooling in serverless environments. #14649
export const databaseAdapter = mongooseAdapter({
// ...
afterOpenConnection: async (adapter) => {
const client = adapter.connection.getClient()
attachDatabasePool(client);
},
})
MCP Localization Support (plugin-mcp) - Add full localization support to MCP resource operations (create, update, find, delete). All MCP tools now accept locale and fallbackLocale parameters, bringing feature parity with Payload's REST API for multilingual content management. #14334
// Create content in English
{ "name": "createPosts", "arguments": { "title": "Hello", "locale": "en" }}
// Add Spanish translation
{ "name": "updatePosts", "arguments": { "id": "123", "title": "Hola", "locale": "es" }}
// Retrieve all translations
{ "name": "findPosts", "arguments": { "id": "123", "locale": "all" }}
PayloadRequest in MCP Handlers (plugin-mcp) - Custom tool, prompt, and resource handlers now receive a PayloadRequest object, enabling access to the Payload instance and consistent access control patterns without additional lookups. #14644
// Previously
handler: async (args: Record<string, unknown>) => {}
// Now with req parameter
handler: async (args: Record<string, unknown>, req: PayloadRequest, _extra) => {
// Access payload instance, user, locale, etc.
const { payload, user, locale } = req
}
Reusable Block Selector Component (ui) - Extract BlockSelector component from BlocksDrawer and export for external use. Includes new onSelect callback for custom side effects when blocks are selected. #14697
🐛 Bug Fixes
- trigger login hooks after reset password (#14711) (32560e9)
- ensure restoreAsDraft only updates the published doc when draft is false (#14658) (3f3f5db)
- remove init of transaction for global doc access (#14693) (c455f58)
- count versions should allow querying on localized fields (#14695) (e1168a0)
- prevent upload mimeType error when useTempFiles is true (#14689) (fe8a3e8)
- autoRefresh not working due to stale closure and missing in client config (#14612) (8a3c6dc)
- type TypeWithVersion missing latest property (#14676) (9b6e1a3)
- graphql version error in production (#14622) (cd5b344)
- corrects outgoing localized data from afterRead (#14603) (87137fe)
- relationships should not fallback if fallbackLocale is false (#14641) (9f55254)
- hide turbopack warnings (#14640) (03f19bc)
- logout-inactivity route gets stuck on loading indicator when inactivity and isLoggedIn are true (#14596) (7a31c02)
- tighten up error visibility handling (#14606) (c74a40f)
- claude: properly structure claude plugin (#14432) (3198bbe)
- db-*: do not exit process on error during connect (#14647) (ab03163)
- db-mongodb,drizzle: prevent race condition in transaction session cleanup (#14651) (a7cf30d)
- drizzle: postgres 18 support (#14700) (294ebf5)
- next: remove turbopack build support to fix bundle size regression (#14696) (c484a05)
- next: prevent transaction race condition in renderDocument parallel operations (#14652) (802a21a)
- plugin-multi-tenant: fix infinite sync tenant network calls (#14604) (8901c7b)
- richtext-lexical: block names were not loaded (#14698) (c7a87c0)
- ui: ensures modal closes on route change (#14718) (a044a08)
- ui: query preset crash with empty filters in postgres/sqlite (#14722) (42a4384)
- ui: app header overflow on mobile (#14704) (91d3e04)
- ui: shows minRowsProp instead of minRows (#14681) (e40a4b7)
- ui: publish label regression from 14690 (#14692) (ba5834b)
- ui: publish button shows locale-specific text without localized fields (#14690) (caf68e4)
- ui: equals filter shows no results when value is cleared (#14673) (220a18f)
- ui: select/relationship field values have no tooltip on hover (#14662) (bc23084)
- ui: bulk uploads silently skips files without filenames (#14621) (8f14359)
- ui: relationship field label not updated when document is updated from other drawer (#14609) (0cc06a1)
- ui: duplicate should duplicate as draft by default (#14619) (fb05840)
⚡ Performance
- up to 5000% faster permissions calculation (#14631) (0d9ec91)
- plugin-mcp: removes 'override' config (#14598) (89ab526)
🛠 Refactors
- db-mongodb,drizzle: reduce race condition window between retrieving and using a session (#14653) (bd9f15f)
- ui: strongly type render-list server action (#14611) (337409b)
📚 Documentation
- clarify draft parameter and _status field interaction (#14723) (00d9156)
- add info about imports and ui best practices (#14702) (38f370a)
- adds examples for sending email attachments (#14665) (61547f9)
- updates node version in docker file (#14664) (276685d)
🧪 Tests
- deflakes localization e2e suite (#14639) (6e364fa)
- fix auth e2e test suite flakiness (#14655) (78d5be6)
- adjust test targeting to wait for input (#14614) (36f3cad)
- fix flaky toast assertions in draft validation tests (#14615) (62508ca)
🏡 Chores
- getLocalizedPaths should filter fields with locale-like names (#14661) (fd7c94c)
- updates MCP docs (#14625) (61c61fe)
- claude: further improve payload skill (#14705) (89be107)
- db-mongodb: export
transformfunction (#14677) (51898f5)
⚠️ BREAKING CHANGES
-
plugin-mcp: removes 'override' config (#14598) (89ab526)
- Removes
overridefrom the plugin config - Updates documentation
- Removes
🤝 Contributors
- Patrik (@PatrikKozak)
- MrLijan (@MrLijan)
- Jessica Rynkar (@jessrynkar)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Sean Zubrickas (@zubricks)
- Elliot DeNolf (@denolfe)
- Jacob Fletcher (@jacobsfletch)
- Violet Rosenzweig (@6TELOIV)
- Kendell (@kendelljoseph)
- Dan Ribbens (@DanRibbens)
- Steven Ceuppens (@stevenceuppens)
- Jarrod Flesch (@JarrodMFlesch)
- Sasha (@r1tsuu)
- Zvonimir Bušić (@ZvonimirBusic)
v3.64.0 (2025-11-13)
🚀 Features
- add support for UTC timezone in date fields (#14586) (8b34e40)
- next: turbopack build support, fix incorrect handling of external packages (#14475) (3a975d7)
- plugin-mcp: adds MCP context to req.payloadAPI (#14595) (860bdf2)
- plugin-mcp: adds custom auth config (#14538) (73a18dc)
- plugin-redirects: support translations (#14548) (ad8f0b2)
UTC Timezone Support - Add support for 'UTC' as a timezone value in date fields. Previously unsupported due to validation against Intl API runtime values. Also fixes issue where having only one timezone would make it selected by default. #14586
import { buildConfig } from 'payload'
const config = buildConfig({
admin: {
timezones: {
supportedTimezones: [
{
label: 'UTC',
value: 'UTC',
},
],
defaultTimezone: 'UTC',
},
},
})
Turbopack Build Support - Full support for Turbopack builds (now default in Next.js 16). Properly externalizes database adapter entry points to prevent production failures. Resolves issues with direct dependency externalization causing runtime errors. #14475
MCP Context Detection - Detect when Payload API calls originate from MCP context using req.payloadAPI === 'MCP'. Enables conditional logic in hooks based on MCP usage. #14595
export const Posts: CollectionConfig = {
slug: 'posts',
hooks: {
beforeRead: [
({ doc, req }) => {
if (req.payloadAPI === 'MCP') {
doc.title = `${doc.title} (MCP Hook Override)`
}
return doc
},
],
},
}
Custom Auth Configuration - Override default API key authentication with custom authorization logic using overrideAuth. Provides granular control over MCP access permissions. #14538
import { type MCPAccessSettings, mcpPlugin } from '@payloadcms/plugin-mcp'
plugins: [
mcpPlugin({
overrideAuth: (req) => {
return {
posts: { find: true },
products: { find: true, update: true },
} as MCPAccessSettings
},
})
]
Redirect Plugin Translation Support - Enable translations for plugin fields, eliminating need for verbose field overrides configuration. Configure field labels in multiple languages directly through i18n config. #14548
export default buildConfig({
i18n: {
translations: {
en: {
'plugin-redirects': {
fromUrl: 'Source URL (Custom)',
},
},
de: {
'plugin-redirects': {
fromUrl: 'Quell-URL',
internalLink: 'Interner Link',
},
},
},
},
plugins: [redirectsPlugin({ collections: ['pages'] })],
})
🐛 Bug Fixes
- previous value undefined for nested fields in afterChange (#14582) (d60ea6e)
- default values inconsistent between Local and REST APIs (#14556) (8f7ef35)
- findGlobalVersionByID id type (#14534) (99ed0e5)
- localized block fields (#14587) (2295c89)
- add secondary PDF mimeType validation and tests (#14529) (ce479ab)
- unlock access not being correctly denied when using a where query (#14585) (f63e34e)
- error when calling jobs.handleSchedules when there are no schedules defined (#14519) (072cb97)
- changing the language of the admin panel does not work for "radio" and "select" fields. (#14569) (bb520d6)
- inject custom translations into supportedLanguages in sanitization (#14549) (d7f1ea2)
- db-mongodb: localization transforms on nested localized fields (#14600) (6070d8d)
- db-mongodb: findVersions/findGlobalVersions not respecting limit of 0 (#14573) (43dcf84)
- graphql: avoid errors with sort as empty string (#14594) (fad476d)
- next: turbopack error when using db-d1-sqlite package (#14558) (bd6decf)
- next, ui: show status "changed" in List View (#14555) (565680d)
- plugin-form-builder: expose formSubmissionID as a variable to be used in emails (#14429) (ad74386)
- plugin-mcp: correctly uses local access controls (#14457) (fc2becf)
- richtext-lexical: urls being wrongly encoded by incomplete URL validation (#14557) (2cb0c59)
- storage-r2: respect data.prefix in handleUpload path construction (#14485) (454d0d3)
- ui: error on inserting new documents on uploads with hasMany (#14567) (fd44d2b)
- ui: save button becomes disabled after failed save with draft validation (#14584) (6fda71a)
- ui: invalid req.locale shows incorrect data (#14537) (f29a07f)
⚡ Performance
🛠 Refactors
📚 Documentation
🧪 Tests
- move draft validation tests from form-state to field error states test suite (#14599) (e1f07ff)
- run cpa against create-next-app latest and canary (#14583) (cca97c6)
- 21x faster versions int suite (#14510) (844f99f)
📝 Templates
⚙️ CI
🏡 Chores
- add .worktrees to .gitignore (87f2bd9)
- fix serverExternalPackages errors in monorepo (#14535) (e76da3f)
🤝 Contributors
- Kendell (@kendelljoseph)
- Jarrod Flesch (@JarrodMFlesch)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- German Jablonski (@GermanJablo)
- Jessica Rynkar (@jessrynkar)
- Sasha (@r1tsuu)
- Sam (@damnsamn)
- Alessio Gravili (@AlessioGr)
- Tobias Odendahl (@tak-amboss)
- Elliot DeNolf (@denolfe)
- Jens Becker (@jhb-dev)
- Sean Zubrickas (@zubricks)
v3.63.0 (2025-11-07)
🚀 Features
- add support for polymorphic uploads (#14363) (df40d0e)
- adds new UI option Duplicate In [Select Locales] (#13803) (53d8557)
Polymorphic Uploads
Upload fields can now reference multiple upload collections, similar to polymorphic relationships. This enables more flexible media management where a single field can accept different types of files from various collections. Works seamlessly with bulk upload and hasMany options. #14363
import type { CollectionConfig } from 'payload'
export const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
name: 'media',
type: 'upload',
relationTo: ['images', 'documents', 'videos'], // references multiple upload collections
},
],
}
Can also be combined with hasMany:
import type { CollectionConfig } from 'payload'
export const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
name: 'media',
type: 'upload',
relationTo: ['images', 'documents', 'videos'], // references multiple upload collections
hasMany: true, // allows multiple uploads
},
],
}
🐛 Bug Fixes
- use
TSiblingDataforpreviousSiblingDocinFieldHook(#14503) (339a0c3) - support generic types for kv.get (#14494) (f6194c6)
- group-by sticky pagination not rendering for virtual relationship fields (#14470) (648021c)
- ensure importMap is reliably generated during HMR (fixes Next.js 16 issue) (#14474) (61a7095)
- hmr not working in next.js 16 (#14462) (0231a8d)
- disable
lockedDocumentsif the kv adapter uses a collection (#14453) (827c9a1) - drizzle: postgesql where in jsonb (#13742) (207295b)
- graphql: sort by multiple fields (#14486) (b925d34)
- next: withPayload wrapper next.js 16 support (#14473) (c0de75e)
- next: version._status field queried/returned for entities without drafts (#14423) (a22dff3)
- plugin-cloud-storage: file sizes use correct mime type (#11633) (2410296)
- richtext-lexical: prevent unnecessary requests for inline blocks (#14522) (69408f0)
- richtext-lexical: bulk upload drawer rendered at the wrong depth if already in a drawer (#14472) (4fd8d03)
- ui: virtual fields disappearing from filter/groupBy dropdowns with access control (#14514) (a3c0e84)
- ui: safely access fieldPermissions (#14458) (2393721)
- ui: simplify UI orderable collections table by allowing only ascending order (#14433) (eba6cfc)
⚡ Performance
🛠 Refactors
📚 Documentation
🧪 Tests
- use new chromium headless browser for playwright, bump playwright (#14464) (2bb5535)
- multi-tenant flake (#14447) (80d7781)
📝 Templates
- remove payload cloud template, remove cloud plugin from templates (#14479) (76ba2df)
- remove outdated cloning and payload cloud information (#14484) (d4d9622)
🔨 Build
⚙️ CI
- speed up workflow reruns, remove run_number from build cache key (#14448) (f67d031)
- add kv and plugin-mcp to valid PR scopes (be0943a)
🏡 Chores
- standardize query param parsing (#14498) (3c9f56e)
- enables folders on website template (#14116) (219fba2)
- bump kv-redis version (ff670c0)
- claude: update claude PostToolUse hook to only format on write (9f2adeb)
- claude: set some sane defaults (#14445) (aa14d86)
- claude: add analyze-issue command (#14435) (f1456a0)
🤝 Contributors
- Sasha (@r1tsuu)
- Elliot DeNolf (@denolfe)
- Chris Rieckmann (@c-riq)
- Sam Wheeler (@swheeler7)
- Alessio Gravili (@AlessioGr)
- Slava Nossar (@slavanossar)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- Tobias Odendahl (@tak-amboss)
- Kendell (@kendelljoseph)
- Jessica Rynkar (@jessrynkar)
- German Jablonski (@GermanJablo)
- Sean Zubrickas (@zubricks)
- Violet Rosenzweig (@6TELOIV)
v3.62.0 (2025-10-30)
🚀 Features
Jobs Access Control
Adds role-based access control for job queue and cancel operations, allowing you to restrict who can manage background jobs in your application. Both operations now support overrideAccess parameter and respect custom access control functions defined in your jobs configuration. #14404
// Configure access control
jobs: {
access: {
queue: ({ req }) => req.user?.roles?.includes('admin'),
cancel: ({ req }) => req.user?.roles?.includes('admin'),
}
}
// Use in Local API
await payload.jobs.cancel({
where: { workflowSlug: { equals: 'sync' } },
overrideAccess: false,
req,
})
Per-Field Timezone Configuration
Date fields can now have individual timezone settings, allowing different date fields to support their own list of supported timezones with custom default values. This enables more flexible date handling across your application. #14410
{
name: 'date',
type: 'date',
timezone: {
defaultTimezone: 'America/New_York',
supportedTimezones: [
{ label: 'New York', value: 'America/New_York' },
{ label: 'Los Angeles', value: 'America/Los_Angeles' },
{ label: 'London', value: 'Europe/London' },
],
},
}
You can also enforce a specific timezone by specifying just one with a default value:
{
name: 'date',
type: 'date',
timezone: {
defaultTimezone: 'Europe/London',
supportedTimezones: [
{ label: 'London', value: 'Europe/London' },
],
},
}
KV Storage Adapters
Introduces a new key-value storage system with multiple adapter options (Database, In-Memory, Redis) for enhanced data persistence and performance. This provides the foundation for the upcoming Realtime API and other features requiring fast key-value access. #9913
Access the KV store via payload.kv with the following interface:
interface KVAdapter {
/**
* Clears all entries in the store.
* @returns A promise that resolves once the store is cleared.
*/
clear(): Promise<void>
/**
* Deletes a value from the store by its key.
* @param key - The key to delete.
* @returns A promise that resolves once the key is deleted.
*/
delete(key: string): Promise<void>
/**
* Retrieves a value from the store by its key.
* @param key - The key to look up.
* @returns A promise that resolves to the value, or `null` if not found.
*/
get(key: string): Promise<KVStoreValue | null>
/**
* Checks if a key exists in the store.
* @param key - The key to check.
* @returns A promise that resolves to `true` if the key exists, otherwise `false`.
*/
has(key: string): Promise<boolean>
/**
* Retrieves all the keys in the store.
* @returns A promise that resolves to an array of keys.
*/
keys(): Promise<string[]>
/**
* Sets a value in the store with the given key.
* @param key - The key to associate with the value.
* @param value - The value to store.
* @returns A promise that resolves once the value is stored.
*/
set(key: string, value: KVStoreValue): Promise<void>
}
Configure the adapter using the kv property:
buildConfig({
kv: adapter()
})
Database KV adapter (default) - Uses your existing database with a hidden payload-kv collection:
import { databaseKVAdapter } from 'payload'
buildConfig({
kv: databaseKVAdapter({
kvCollectionOverrides: {
slug: 'custom-kv',
...(process.env.DEBUG === 'true' && {
admin: { hidden: false },
access: {},
}),
},
}),
})
In Memory KV adapter - Fast memory-based storage for development:
import { inMemoryKVAdapter } from 'payload'
buildConfig({
kv: inMemoryKVAdapter(),
})
Redis KV Adapter - Production-ready Redis integration:
pnpm add @payloadcms/kv-redis
import { redisKVAdapter } from '@payloadcms/kv-redis'
buildConfig({
kv: redisKVAdapter({
keyPrefix: "custom-prefix:", // defaults to 'payload-kv:'
redisURL: "redis://127.0.0.1:6379" // defaults to process.env.REDIS_URL
}),
})
Configurable Toast Position
Toast notifications can now be positioned anywhere on the screen (top-left, top-center, top-right, bottom-left, bottom-center, bottom-right), giving you control over where important messages appear to your users. This is particularly useful for applications with large screens or specific UI layouts. #14405
The position configuration is a direct pass-through of the Sonner library's position options, with 'bottom-right' remaining the default.
Feature PRs
- add access control for jobs queue and cancel operations (#14404) (0a37edb)
- timezone config can now be added on a per field basis (#14410) (a3df837)
- add KV storage adapters (#9913) (ffb9a2e)
- make toast position configurable (#14405) (d5fab43)
- ui: export useQueue React hook (#14396) (612880d)
🐛 Bug Fixes
- globals with versions return _status field when access denied (#14406) (b766ae6)
- custom dashboard component causes runtime error on create-first-user and account views (#14393) (d5f4e72)
- claude: remove invalid frontmatter fields (#14411) (118d005)
- db-*:
findMigrationDirin projects withoutsrcfolder (#14381) (059185f) - db-mongodb: migration fails for cosmosDB (#14401) (10a640c)
- db-mongodb: type error with
prodMigrations(#14394) (8e5e23a) - db-mongodb: duplicate ids in sanitizeQueryValue (#11905) (36bb188)
- db-postgres: hasMany relationship/number/text fields inside blocks are incorrectly returned when using
select(#14399) (850cc38) - drizzle: number fields in generated schema with
defaultValue(#14365) (8996b35) - plugin-multi-tenant: remove unused syncTenants from useEffect deps (#14362) (906a3dc)
- richtext-lexical: do not run json.parse if value is undefined or null (#14385) (09a6140)
- richtext-lexical: prevent TS CodeBlocks from sharing Monaco model (useId) (#14351) (5caebd1)
- storage-*: update the client cache to use a map instead with cache keys per bucket config (#14267) (38f2e1f)
- ui: where builder crashing with invalid queries (#14342) (6c83046)
🛠 Refactors
- deprecate job queue depth property (#14402) (1341f69)
- ui: simplify ConfigProvider, improve useControllableState types and defaultValue fallback (#14409) (255320e)
⚙️ CI
- add claude as valid scope (560f2f3)
🤝 Contributors
- Dan Ribbens (@DanRibbens)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Elliot DeNolf (@denolfe)
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Ossaid Qadri (@imossaidqadri)
- Philipp Schneider (@philipp-tailor)
- Kholiavko Roman (@kholiavko-roman)
- Jacob Fletcher (@jacobsfletch)
- Séalan Cronin (@sealan)
- Jarrod Flesch (@JarrodMFlesch)
- Justus Blönnigen (@technicaldirector)
v3.61.1 (2025-10-24)
🐛 Bug Fixes
- ui: ask before closing doc drawer with edits (#14324) (c1d017a)
- filteredLocales in the client config are stale (#14326) (5a37909)
- db-*: querying joins with
$existson mongodb and improve performance when querying multiple times on postgres (#14315) (1f166ba) - db-postgres: regression in migrations in the
_relstable (#14341) (a2b1c9b) - plugin-search: add locale to key in syncedDocsSet (#14289) (c29e1f0)
- ui: account for array values in transformWhereToNaturalLanguage (#14339) (f2cabe7)
- ui: preview button not responding to conditional URL (#14277) (ad0e7b2)
- ui: use
depth: 0for publish specific locale request (#14313) (b68715e)
📚 Documentation
- various grammar and typo fixes (#14170) (c96d50d)
- adds example for name or label on groups field (#14323) (6d88f7d)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Boyan Bratvanov (@bratvanov)
- Sasha (@r1tsuu)
- Sean Zubrickas (@zubricks)
- Said Akhrarov (@akhrarovsaid)
- Paul (@paulpopus)
v3.61.0 (2025-10-23)
🚀 Features
- @payloadcms/plugin-mcp Released (BETA) - New plugin that enables Payload to function as an MCP server, allowing AI models to interact with your collections through a standardized protocol. The plugin provides built-in tools for CRUD operations on collections and supports custom tools. #13674
🐛 Bug Fixes
- user updatedAt modified during session operations (#14269) (a1671ec)
- document header text clipping (#14291) (db973e9)
- typescript requires fields when draft: true despite passing
draft: true(#14271) (1016cd0) - blocks access control not respecting update access whether on collection or on a per field basis (#14226) (88cb687)
- allow slugField to accept localized argument and fixed slug generation with custom field names (#14234) (2ced43d)
- db-postgres: limit index and foreign key names length (#14236) (a63b4d9)
- drizzle: folders with trash enabled don't display documents in polymorphic joins (#14223) (6d3aaaf)
- plugin-form-builder: display full textarea content in form submissions (#14161) (24dad01)
- plugin-multi-tenant: block references issue (#14320) (4f8b7d2)
- plugin-search: exclude skipped drafts in reindex handler (#14224) (0dc782c)
- richtext-lexical: ensure block node form displays up-to-date value when editor remounts (#14295) (f8e6b65)
- richtext-lexical: node replacements ignored for block, inline block, upload, unknown and relationship nodes (#14249) (1561853)
- richtext-lexical, ui: ui errors with Slash Menu in Lexical and SearchBar component in RTL (#14231) (fed3bba)
- ui: document locked modal blocks interaction after clicking Go Back (#14287) (5782a41)
- ui: change password button being hidden and unlock button being shown incorrectly on account page (#14220) (bcb4d8e)
⚡ Performance
- richtext-lexical: decrease size of field schema, minor perf optimizations (#14248) (e25ce1c)
- richtext-lexical: do not return i18n from editor adapter (#14228) (54224c3)
🛠 Refactors
📚 Documentation
- improve slate to lexical migration docs (#14309) (6838c56)
- db indexes - code example missing const (#14171) (3b37f4a)
- add explanation about re-renders in
useFormFields(#14288) (8cdb5dc) - add jsdocs to RichText adapter (#14246) (8b0ac01)
- clarify
admin.timezoneslist configuration with example (#14238) (de5f3db) - fix link to slug-overrides in text.mdx (#14211) (8136a84)
- add mention of the useUploadHandlers error and steps to remedy it with a mention to monorepos (#14233) (8663024)
🔨 Build
- add plugin-mcp to publishList (#14319) (894cf0c)
- add README sync for top-level -> packages/payload (#14316) (2aba827)
🏡 Chores
- extract snapshot logic, correct types in version ops (#14290) (c2dcd12)
- bump pino to v9.14.0 and pino-pretty (#14283) (b252658)
- refresh CLAUDE.md (#14268) (05a869d)
- cleanup, short-circuit .split calls (#14245) (d57be12)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Kendell (@kendelljoseph)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Boyan Bratvanov (@bratvanov)
- Paul (@paulpopus)
- German Jablonski (@GermanJablo)
- Bogdan Covrig (@bogdaaamn)
- Romain Pironneau (@romainpi)
- Sasha (@r1tsuu)
- Ahmed Abdellahi Abdat (@ahmed-abdat)
- Said Akhrarov (@akhrarovsaid)
v3.60.0 (2025-10-16)
🚀 Features
- accept multiple locales in fallbackLocale (#13822) (623a1b8)
- adds settingsMenu to admin navigation sidebar (#14139) (ee8b3cf)
- plugin-multi-tenant: allow collection access to be overridden via callback (#14127) (c40eec2)
- plugin-multi-tenant: allow hasMany on tenant field overrides (#14120) (fb93cd1)
- plugin-multi-tenant: user collection access overrides (#14119) (38b7a60)
- richtext-lexical: add collection filtering to UploadFeature, refactor relationship hooks (#14111) (6defba9)
- richtext-lexical: client-side block markdown shortcuts, code block (#13813) (07a1eff)
Localization
-
Multiple fallback locales -
fallbackLocalenow accepts an array of locales for queries and locale configs. Payload will check each locale in order until finding a value, eliminating the need for manual fallback handling. #13822/** Local API **/ await payload.findByID({ id, collection, locale: 'en', fallbackLocale: ['fr', 'es'], }) /** REST API **/ await fetch(`${baseURL}/api/${collectionSlug}?locale=en&fallbackLocale[]=fr&fallbackLocale[]=es`) /** GraphQL **/ await restClient.GRAPHQL_POST({ body, query: { locale: 'en', fallbackLocale: ['fr', 'es']}, }) /** Locale Configs **/ locales: [ { code: 'en', label: 'English', fallbackLocale: ['fr', 'es'], }, ]
Admin UI
-
Settings menu in navigation - New
admin.components.settingsMenuconfig option adds a gear icon above the logout button. Click to open a popup menu with custom admin-level utilities and actions that don't fit into collection or global navigation. #14139
Multi-Tenant Plugin
-
Collection access overrides - New
accessResultOverridecallback allows modifying multi-tenant access control results per operation (read, create, update, delete, readVersions, unlock). Enables custom logic like allowing shared content across tenants. #14127multiTenantPlugin<ConfigType>({ collections: { posts: { accessResultOverride: async ({ accessResult, accessKey, req }) => { // here is where you can change the access result or return something entirely different if (accessKey === 'read') { return { or: [ { isShared: { equals: true, } }, accessResult ] } } else { return accessResult } } } } }) -
Multiple tenants per document - Tenant field overrides now support
hasManyrelationships, allowing documents to belong to multiple tenants. #14120 -
User collection access overrides - New
usersAccessResultOverridecallback enables customizing access control on the users collection, overriding default tenant privacy when needed. #14119usersAccessResultOverride: ({ accessKey: 'read', // 'create', 'read', 'update', 'delete', 'readVersions', 'unlock' accessResult: AccessResult, // the `AccessResult` type ...args, // AccessArgs }) => { // this is where you could adjust what gets returned here. if (accessKey === 'read') { return true // over simplified example } // default to returning the result from the plugin return accessResult }
Lexical Rich Text
-
Upload collection filtering -
UploadFeaturenow supportsdisabledCollectionsandenabledCollectionsto control which collections appear in the upload drawer. Also refactors enabled relationships logic with cleaneruseEnabledRelationshipshook. #14111 -
Client-side markdown shortcuts & code blocks - Blocks with
admin.jsxnow support markdown shortcuts on the client (previously server-only). Includes pre-madeCodeBlockcomponent for use inBlocksFeature. Also fixesreadOnlyhandling across nested fields. #13813https://github.com/user-attachments/assets/cfc0d2a8-ffb3-4926-b097-ad9c2b133586
🐛 Bug Fixes
findDistinctby explicit ID paths in relationships and virtual fields (#14215) (2b1b6ee)- hasMany / polymorphic relationships to custom number IDs (#14201) (a3b3865)
- hide fields with read: false in list view columns, filters, and groupBy (#14118) (bcd40b6)
- validate Point Field to -180 to 180 for longitude and -90 to 90 for latitude (#14206) (13a1d90)
- urls in upload sizes are not encoded (#14205) (747a049)
- restoring trashed drafts with empty required fields fails validation (#14186) (3317207)
- db-d1-sqlite: add missing
blocksAsJSONproperty (#14103) (f14a38e) - db-mongodb: documents not showing in folders with
useJoinAggregations: false(#14155) (e613a78) - db-mongodb: improve check for
ObjectId(#14131) (32e2be1) - graphql: bump tsx version to get around esbuild vulnerability (#14207) (d7ec48f)
- next: custom views not overriding built-in single-segment routes (#14066) (691f810)
- plugin-multi-tenant: object reference mutations in addFilterOptionsToFields (#14150) (e62f1fe)
- richtext-lexical: state key collisions when multiple TextStateFeatures are registered (#14194) (f01a6ed)
- richtext-lexical: editor throws an error if OrderedList is registered but not UnorderedList or CheckList (#14149) (1fe75e0)
- richtext-lexical: editing a copied inline block also modifies the original (#14137) (5bacb38)
- richtext-lexical: correctly type field property of RenderLexical (#14141) (cd94f8e)
- richtext-lexical: improve type autocomplete and assignability for lexical nodes (#14112) (a46faf1)
- sdk:
paginationis not passed to search params (#14126) (ee9f160) - storage-gcs: bump @google-cloud/storage for vulnerability (#14199) (1077aa7)
- storage-r2: uploads with prefix don't work, add
test/storage-r2(#14132) (4fd4cb0) - templates: encoding and decoding slugs in website template (#14216) (cacf523)
- templates: ecommerce seeding issue (#14196) (d65b8c6)
🛠 Refactors
📚 Documentation
- revert sentry docs change (#14113) (8844eaf)
- incorrect pg driver injection example in Sentry integration docs (#14088) (95dbaed)
🧪 Tests
⚙️ CI
- notify website repo on release [skip ci] (#14140) (a36e5d2)
- add website dispatch event, testing for releases [skip ci] (#14138) (b0d31ba)
- add missing labels to bug report template [skip ci] (#14134) (3069e5b)
- update generate-template-variations script to cover cloudflare template (#14105) (e78057b)
🏡 Chores
- better audit dependencies script (#14189) (f9e75a4)
- ignore agent local files [skip ci] (#14184) (7ecb5a0)
- drizzle: bump drizzle-orm and drizzle-kit for vulnerabilities (#14200) (4afa286)
- email-nodemailer: bump nodemailer dependencies to latest (#14121) (077c6f5)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- Jessica Rynkar (@jessrynkar)
- German Jablonski (@GermanJablo)
- Elliot DeNolf (@denolfe)
- Elliott W (@elliott-w)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Diogo Gaspar (@shadowoff09)
v3.59.1 (2025-10-07)
🐛 Bug Fixes
- revert drizzle-orm (#14108) (ee78eb2)
- plugin-multi-tenant: not setting cookie properly on login (#14107) (5590535)
- ui: update memory user when autoLogin enabled (#14018) (c2fa629)
⚙️ CI
- update activity notification channels (72be9d3)
🏡 Chores
- update lock (7e12880)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
v3.59.0 (2025-10-07)
🚀 Features
- slug field (#14007) (b09ae67)
- support any depth for relationships in
findDistinct(#14090) (e4f8478) - adds
disableGroupByto fields admin props (#14017) (537f58b) - allow
findDistincton fields nested to relationships and on virtual fields (#14026) (9d6cae0) - bundle types (#14020) (9bcb7b0)
- cpa: add cloudflare template to create-payload-app command (#14091) (e8140ed)
- db-*: adds support for readReplicas in D1 adapter config (#14040) (5a6f361)
- db-mongodb,drizzle: add atomic array operations for relationship fields (#13891) (7eacd39)
- next: export views, pass all props to custom dashboard view (#14094) (abebd24)
- plugin-nested-docs: pass collection config as an arg to generateURL and generateLabel (#14086) (db6ec30)
- ui: add support for disabling join field row types (#12738) (cd546b3)
- ui: live preview conditions (#14012) (2be6bb3)
🐛 Bug Fixes
- add detection for --experimental-https flag (#14085) (3cf3f93)
- missing cross-env in deploy:database (#14076) (709ee58)
- support USE_HTTPS for local hmr (#14053) (feaa395)
- update packages list for
pnpm payload info(#14030) (4b6b0c5) autosave: truedoesn't work onpayload.updatewithwhere(#14001) (5d86d5c)- db-d1-sqlite: avoid bound parameter limit when querying relationships and inserting rows (#14099) (444ca0f)
- db-mongodb: localized blocks with fallback and versions (#13974) (1e654c0)
- db-postgres:
drizzledoesn't recognize types from the generated types (#14058) (ef84b20) - db-postgres: querying multiple hasMany text or number fields (#14028) (95bdffd)
- db-postgres: joins count with hasMany relationships (#14008) (1510e12)
- drizzle: generate DB schema syntax is deprecated (#14031) (ef57d24)
- graphql: error querying hasMany relationships when some document was deleted (#14002) (48e9576)
- next: force inactive live preview after passing conditions (#14048) (ca3f054)
- next: prevent locale upsert when not authenticated (#13621) (ece5a95)
- plugin-ecommerce: variants
validateOptionserrors with SQLite when creating a new variant (#14054) (3b9e759) - plugin-multi-tenant: rm chalk dep (#14003) (d017499)
- plugin-search: handle trashed documents in search plugin sync (#13836) (de352a6)
- richtext-lexical: field.admin overrides were ignored in RenderLexical helper (#14024) (810da54)
- richtext-lexical: slash menu arrows keys not respected when block nearby (#14015) (54b6f15)
- sdk: incorrect
fetchinitialization on cloudflare (#14009) (a5c8b5b) - storage-r2: upload with the correct contentType (#13988) (066997d)
- storage-uploadthing: hide key field from filters and columns (#14004) (2ce6e13)
- templates: ignore wrangler when bundling to fix template styles (#14067) (c135bf0)
- templates: added missing CLOUDFLARE_ENV in cloudflare template when optimizing database (#14064) (9fcd1fa)
- templates: don't use remote bindings in cloudflare template when developing locally (#14063) (9d3e540)
- templates: ecommerce wrong links in readme and docs and issue with missing graphql dependency (#14045) (e4f90a2)
- templates: correct typo in footer text (#14021) (a938ad6)
- translations: refine Persian (fa) translations for clarity and natural tone (#14082) (990603c)
- translations: fixes to Icelandic translations (#14038) (7088d25)
- translations: fixes to Swedish translation (#13994) (4b193da)
- ui: phantom fields when duplicating rows with rows (#14068) (08f6d99)
- ui: invalid time value error when document locking with autosave enabled (#14062) (394000d)
- ui: undefined access with polymorphic joins and fix joins test config (#14057) (cb7a24a)
- ui: popup list controls overlap with table in list view (#13967) (1e23882)
- ui: upload dropzone error when collectionConfig is undefined (#14043) (62fcf18)
- ui: saving empty code editor throw error (#14019) (bffb9ef)
- ui: add support back for custom live preview components (#14037) (d826159)
- ui: array fields not respecting width styles in row layouts (#13986) (accd95e)
⚡ Performance
- graphql: select only the requested columns (#13711) (c819083)
- templates: added cloudflare cache headers for static files (#14069) (c59df45)
📚 Documentation
- readme changes - add one-click deployment options and improve templates section (#14092) (a88e3c5)
- update README.md (#11297) (c8661da)
- adds comprehensive virtual field configuration documentation (#13942) (10e5042)
- db-mongodb: fix note on indexing localized fields (#14071) (9c08fb8)
📓 Examples
⚙️ CI
- update pr-title commit scopes (#14055) (fa28dca)
- add linked PRs to new issue notifications (#14059) (bbff65c)
🏡 Chores
- ci changes to add compatibility for mongodb alternates (#13898) (9ceee8e)
- update d1 cloudflare template package versions (#13977) (7601835)
- eslint: set reportUnusedDisableDirectives to error (#14011) (209b1f1)
- templates: bump sharp version in ecommerce template (#14089) (836e0f7)
🤝 Contributors
- Jacob Fletcher (@jacobsfletch)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Alessio Gravili (@AlessioGr)
- Dan Ribbens (@DanRibbens)
- Nate Caminata (@ncaming)
- Marwin Hormiz (@marwinhormiz)
- rfwn࿐ (@rfwn)
- Jeffery To (@jefferyto)
- Ricardo Tavares (@rjgtav)
- Patrik (@PatrikKozak)
- Kamal (@kamal0620040)
- Elliot DeNolf (@denolfe)
- gursh (@gurshdev)
- Said Akhrarov (@akhrarovsaid)
- Jarrod Flesch (@JarrodMFlesch)
- Riley Langbein (@rilrom)
- Valur Sverrisson (@Valur)
- Marcus Forsberg (@marcusforsberg)
- Aurimar Lopes (@AurimarL)
- Jan Beck (@jancbeck)
- Tobias Odendahl (@tak-amboss)
v3.58.0 (2025-09-30)
🚀 Features
Ecommerce plugin and template (#8297) (ef4874b)
The Ecommerce Template and Plugin is now ready in beta, you can get started by running the Payload CPA command below
pnpx create-payload-app my-project -t ecommerce
Full docs are available on our website
Payload SDK package (#9463) (92a5f07)
Allows querying Payload REST API in a fully type safe way. Has support for all necessary operations, including auth, type safe select, populate, joins properties and simplified file uploading. Its interface is very similar to the Local API.
import { PayloadSDK } from '@payloadcms/sdk'
import type { Config } from './payload-types'
// Pass your config from generated types as generic
const sdk = new PayloadSDK<Config>({
baseURL: 'https://example.com/api',
})
// Find operation
const posts = await sdk.find({
collection: 'posts',
draft: true,
limit: 10,
locale: 'en',
page: 1,
where: { _status: { equals: 'published' } },
})
New Cloudflare D1 SQLite adapter, R2 storage adapter and Cloudflare template (#12537) (99043ee)
You can now deploy directly to Cloudflare using our 1-click template or click the deployment button below
🐛 Bug Fixes
- ensure blocks filterOptions are awaited (#13960) (41aa201)
- sanitize collection labels to inherit defaults when only a partial config is provided (#13944) (1752043)
- avoid relying on
Function.prototype.nameto detect react components (#13931) (4652bd0) - next: static live preview url corrupt after save (#13949) (3c4f8a3)
- plugin-multi-tenant: properly localize labels (#13943) (2cc34d1)
- richtext-lexical: editor re-mounting on save due to json key order not being preserved in postgres (#13962) (6a2e814)
- ui: query preset where field not displaying array values (#13961) (9248fc4)
- ui: move collection description below title in document view (#13946) (ae34b6d)
⚙️ CI
- add
@payloadcms/sdkto publish list (#13964) (f9743b4) - add cron to activity notifications [skip ci] (#13959) (6d995ff)
- proper path for activity notifications [skip ci] (2514e4d)
- activity-notifications debug inputs (ba33f2f)
- github activity slack notifications (#13955) (4562df7)
🏡 Chores
- update templates and docs links (#13971) (d7888df)
- rename activity notifications workflow (f7b1b7b)
- sdk: add README (#13975) (2e1fb57)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Patrik (@PatrikKozak)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
- Luke Sandberg (@lukesandberg)
v3.57.0 (2025-09-25)
🚀 Features
- adds admin.formatDocURL function to control list view linking (#13773) (1d1240f)
- conditional blocks (#13801) (d8dace6)
- support
hasManyvirtual relationship fields (#13879) (1072171) - next: regenerate live preview url on save (#13631) (00a673e)
- plugin-form-builder: allow creating form submissions from the admin panel (#11222) (104a5fc)
- plugin-multi-tenant: improves tenant assignment flow (#13881) (fcb8b5a)
- richtext-lexical: support copy & pasting and drag & dopping files/images into the editor (#13868) (59414bd)
- richtext-lexical: utility render lexical field on-demand (#13657) (1c89291)
- translations: add Tamil translations (#13788) (7975fe3)
🐛 Bug Fixes
- server component readonly state issues with document locking (#13878) (512a8fa)
- make input/output encoding explicit in auth/crypto's encrypt/decrypt (#13710) (7f35213)
- pagination returning duplicate results when timestamps: false (#13920) (062c1d7)
- add missing translation key (#13902) (39143c9)
findDistinctwith polymorphic relationships (#13875) (e99e054)- admin.hidden not respected for RSCs, render-field server function not respecting field-overrides client-side (#13869) (228e8f2)
- exits handlers loop if response is returned (#13866) (425172c)
- support
hasMany: truerelationships infindDistinct(#13840) (d0543a4) - removes select argument from create operation db calls (#13841) (a26d8d9)
- db-postgres: localized relationships inside blocks (#13760) (22ae9fa)
- db-sqlite:
existsoperator increateJSONQuery(#13907) (f980a86) - graphql: graphql tab schema not handling tabs correctly (#13850) (83b6e37)
- next: clear bfcache on forward/back (#13913) (f868ed9)
- next: groupBy for polymorphic relationships (#13781) (9c20eb3)
- plugin-import-export: collectionSlug field regression from hidden field changes (#13917) (96c6612)
- plugin-multi-tenant: ensure relationship filter filters based on doc.tenant (#13925) (cbbf98e)
- plugin-multi-tenant: improve Norwegian translation for "tenant" (#13923) (dea91f3)
- plugin-search: transaction state errors in parallel reindex operations (#13915) (79b2557)
- plugin-search: returns doc instead of empty return (#13916) (68882aa)
- plugin-seo: allow number ids & resolved relations for image auto-generation (#13906) (abbe38f)
- richtext-lexical: remove unexpected spaces in link html converter (#13924) (c230005)
- richtext-lexical: richtext field duplicates description custom component (#13880) (66f5d14)
- richtext-lexical: prevent disallowed headings to be pasted (#13765) (207caa5)
- translations: adjust some zh translations (#13867) (ae7b75a)
- translations: correct Ukrainian language translations (#13639) (5b5eaeb)
- translations: missing noLabelGroup translation key for Tamil translations (#13896) (cb23aaf)
- ui: opening relationship field with appearance: "drawer" inside rich text inline block closes drawer (#13830) (7bbd07c)
- ui: corrects url for publish specific url (#13922) (662bab2)
- ui: array field state to return empty array instead of 0 (#11283) (3f5c989)
- ui: folder filters hidden behind results (#13908) (5c81342)
- ui: custom folder slug in browse-by (#13909) (4975b8d)
- ui: query folder children with depth and select (#13910) (984f1b3)
- ui: revert-to-published button showing on new drafts (#13897) (82d98ab)
- ui: bulk upload with locale param (#13865) (667c4f1)
- ui: ensures visible list view thumbnails with enableListViewSelectAPI (#13864) (82aade2)
- ui: respect editorOptions, prevent field from flashing on save (#13848) (5241113)
- ui: set prefetch false on Link buttons (#13846) (33228d9)
⚡ Performance
- graphql: use depth 0 in auth/apiKey for graphQL requests (#13895) (9a59562)
- ui: use select API in RelationshipProvider to speed up load times in RelationshipCell (#13832) (77cac30)
🛠 Refactors
- richtext-lexical: new upload node design (#13901) (bea77f2)
- translations: correct i18n translation for Norwegian (#13854) (b7f6e3c)
📚 Documentation
- corrects link for experimental features topic (#13862) (b1e5bd9)
- clarify JWT token encryption / decryption in configuration docs (#13816) (0a5b7b0)
⚙️ CI
- remove v2 issue template (f39c7bf)
🏡 Chores
- revert docs label change (c33c037)
- update documentation issue template (ae95d58)
- consolidate canAccessAdmin logic (#13849) (42b5935)
- deps: bump @faceless-ui/modal to v3.0.0 (#13842) (9a8e3f8)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Elliot DeNolf (@denolfe)
- Dan Ribbens (@DanRibbens)
- roboin (@Robot-Inventor)
- Jacob Fletcher (@jacobsfletch)
- Anders Semb Hermansen (@andershermansen)
- Jie Wang (@escwxyz)
- aptt (@apttx)
- Ricardo Tavares (@rjgtav)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Sasha (@r1tsuu)
- Jessica Rynkar (@jessrynkar)
- Паламар Роман (@VeiaG)
- Anil Shebin S J (@AnilShebin)
- German Jablonski (@GermanJablo)
- Jens Becker (@jhb-dev)
- Sean Zubrickas (@zubricks)
- Kwan Jun Wen (@junwen-k)
v3.56.0 (2025-09-17)
🚀 Features
- pass args to task
onSuccessandonFailcallbacks (#13269) (3acdbf6) - crons for all bin scripts, new jobs:handle-schedules script, more reliable job system crons (#13564) (cdeb828)
- expose multipart/form-data parsing options (#13766) (8282031)
- global beforeOperation hook (#13768) (3af546e)
- ui: export FieldPathContext (#13806) (a3acfeb)
🐛 Bug Fixes
- add missed
paginationproperty tofindVersionsandfindGlobalVersionsand handle it properly (#13763) (a955392) - skip validation when trashing documents with empty required fields (#13807) (3b13867)
- versions created with incomplete data when using
selectparameter (#13809) (faed3aa) - error accessing sanitizedPermissions during docAccess operation: "Cannot read properties of undefined" (#13800) (c7795fa)
- typo in the description of the isTemp field of query presets (#13728) (e75bfb0)
- fully sanitize unauthenticated client config (#13785) (e2632c8)
- client config context inheritance (#13790) (dfb0021)
- db-mongodb: support 2x and more relationship sorting (#13819) (24ace70)
- db-mongodb: localized arrays inside blocks with versions (#13804) (09dec43)
- examples: secure mt example users collection (#13810) (9a841df)
- live-preview: client-side live preview failed to populate localized fields (#13794) (b34e5ea)
- live-preview: reset cache per subscription and ignore invalid preview messages (#13793) (b62a30a)
- next: unnamed, unlabeled groups displayed without label in version view (#13831) (8d3b146)
- next: sparse block and arrays diffs were not rendered correctly (#13829) (433c513)
- next: exclude permissions from page response when unauthenticated (#13796) (8113d3b)
- next: richtext field is read-only for expired lock (#13789) (4278e72)
- next: login redirect crashes page (#13786) (13af91f)
- next: resolve filterOptions by path (#13779) (8a7124a)
- translations: use correct Dutch terms for "clear" and "close" (#13748) (fce94d6)
- ui: pass locale arg in query params for folder operations (#13837) (c0684e3)
- ui: correct field path in inline create drawer for auth fields (#13815) (91e7f0c)
- ui: populate nested fields for enableListViewSelectAPI (#13827) (dc732b8)
- ui: cross-domain server-side live preview throws postMessage error (#13825) (731c4fb)
- ui: undefined operators for virtual field with unsupported field types (#13820) (5c02d17)
- ui: prevent form validation after draft submit error (#12918) (a2c31fa)
- ui: show loading state in relationship field during search and pagination (#13805) (555228b)
- ui: safely access preferences when loading list view (#13771) (4482eaf)
📚 Documentation
📝 Templates
⚙️ CI
- adjust audit-dependencies cron time (898e937)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Jonathan Elmgren (@jonathanelmgren)
- Sasha (@r1tsuu)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Slava Nossar (@slavanossar)
- Philipp Schneider (@philipp-tailor)
- Elliot DeNolf (@denolfe)
- Amelia (@LimChorngUan)
- BrannanKovachev (@BrannanKovachev)
- Robbe Vaes (@Robbe95)
- Robbert Stevens (@robbertstevens)
- Anders Semb Hermansen (@andershermansen)
- German Jablonski (@GermanJablo)
v3.55.1 (2025-09-10)
🐛 Bug Fixes
- presentational-field types incorrectly exposing hooks (#11514) (285fc8c)
- graphql: pass collectionSlug to nested join fields in tabs, collapsible and group resolvers (#13752) (e52b757)
- next: error after logging in and navigating to different page in production (#13758) (e40c821)
- ui: listSearchableFields can resolve to multiple fields with the same name when using tabs (#13668) (ffed540)
📝 Templates
🤝 Contributors
- Dallas Opelt (@DallasO)
- Alessio Gravili (@AlessioGr)
- German Jablonski (@GermanJablo)
- timeo-schmidt (@timeo-schmidt)
- Elliot DeNolf (@denolfe)
v3.55.0 (2025-09-09)
🚀 Features
- adds disableListColumn and disableListFilter to imageSize admin props (#13699) (e1ea074)
- unauthenticated client config (#13714) (e49005f)
- adds new experimental.localizeStatus option (#13207) (0f6d748)
- live-preview: client-side live preview: simplify population, support hooks and lexical block population (#13619) (6e203db)
- richtext-lexical: upgrade lexical from 0.34.0 to 0.35.0 (#13715) (7a8bcdf)
- richtext-lexical: upgrade lexical from 0.28.0 to 0.34.0 (#13622) (1a1696d)
- richtext-lexical: add options to hide block handles (#13647) (fdab271)
- ui: save collection folder tab preferences (#13702) (6a0637e)
- ui: adds admin.autoRefresh root config property (#13682) (f288cf6)
🐛 Bug Fixes
- ensure client-side live preview correctly updates for globals (#13718) (03f7102)
- set X-Payload-HTTP-Method-Override as allowed cross origin header (#13717) (a4a0298)
- update user session on reset (#13667) (d9e1832)
- prevent enabling trash on folders (#13675) (be47f65)
- db-sqlite: convert Date to ISO 8601 string in queries (#11694) (917c66f)
- next: version diff view not handling all field permissions correctly (#13721) (911f17a)
- next: display deleted relations and uploads in version diff views (#12955) (bbcdea5)
- next: version diff view shows correct document title in step nav (#13713) (794bf82)
- plugin-multi-tenant: hide watchTenant column field (#13740) (a0112d7)
- plugin-multi-tenant: skip baseFilter if user has access to all tenants (#13633) (65b3845)
- plugin-nested-docs: prevent phantom breadcrumb row (#13628) (a231a05)
- plugin-nested-docs: crumbs not syncing on non-versioned collections (#13629) (4600c94)
- plugin-search: update with db adapter on create (#13670) (1293019)
- richtext-lexical: fix picture closing tag in html converter (#13100) (24e436b)
- richtext-lexical: add internationalization support for default style label in textStateFeature (#13662) (0c44c3b)
- storage-vercel-blob: filename is incorrectly stored encoded when addRandomSuffix is true (#13746) (b2f9d4e)
- templates: URI encode the cacheTag in getMediaUrl utility - Website template (#13558) (008a52d)
- ui: consistent searchbar across folders and lists (#13712) (09e3174)
- ui: cannot filter by virtual relationship fields in WhereBuilder (#13686) (7e98fbf)
- ui: undefined permissions passed in create-first-user view (#13671) (5146fc8)
- ui: don't populate on auto save (#13649) (7794541)
- ui: use consistent row ids when duplicating array and block rows (#13679) (b8d7ccb)
- ui: field.admin.condition data attribute missing document ID when document is being edited (#13676) (a115868)
- ui: await for publish success to update the UI (#13673) (9b10933)
- ui: sidebar missing sticky top offset (#13652) (1c68ed5)
- ui: should not show publish specific locale button when no localized fields exist (#13459) (ac691b6)
- ui: json field type ignoring editorOptions (#13630) (426f99c)
⚡ Performance
- plugin-search: reindex collections in parallel, up to 80% faster (#13608) (b99c324)
- ui: opt-in to the select api in the list view (#13697) (d2d2df4)
📚 Documentation
- missing comma in custom-strategies example (#13701) (27cfe77)
- plugin-form-builder: add RadioField documentation (#13529) (4e972c3)
🧪 Tests
⚙️ CI
🏡 Chores
- add AGENTS.md (#13688) (d109b44)
- ui: prevent loading orphaned documents when viewing root collection folders (#13684) (9f0573d)
🤝 Contributors
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Ilham Saputrajati (@ilhamsj)
- Cedric Delacombaz (@cdelacombaz)
- Said Akhrarov (@akhrarovsaid)
- Aapo Laakkio (@ApsiV11)
- Anders Semb Hermansen (@andershermansen)
- German Jablonski (@GermanJablo)
- Yazal Ulloa (@yazalulloa)
- Elliot DeNolf (@denolfe)
- Jessica Rynkar (@jessrynkar)
- reiv (@reiv)
- Riley Langbein (@rilrom)
v3.54.0 (2025-08-28)
🚀 Features
- support parallel job queue tasks, speed up task running (#13614) (e0ffada)
- configurable toast notifications (#13609) (0a18306)
- allow multiple, different payload instances using getPayload in same process (#13603) (13c24af)
- db-*: support atomic array $push db updates (#13453) (5ded64e)
- plugin-multi-tenant: allow custom tenant field per collection (#13553) (6db07f0)
- plugin-multi-tenant: re-enable global selector on all views (#13575) (f260d0a)
🐛 Bug Fixes
- restore as draft function was passing a published status (#13599) (a670438)
- hide jobs stats global by default (#13566) (a92c251)
- deeply merge array and block rows from server form state (#13551) (1e13474)
- ensure updates to createdAt and updatedAt are respected (#13335) (5c16443)
- db-*: add delete version id for non-mongodb (#10613) (ddb8ca4)
- graphql: invalid enum names when values include brackets (#13597) (1dc346a)
- next: richtext fields not read-only for locked documents (#13579) (344ad69)
- next: update rest route handler types for Next.js 15.5 compatibility (#13521) (763cb61)
- plugin-multi-tenant: prevent duplicate filters on referenced blocks (#13607) (03a00ca)
- plugin-multi-tenant: autosave global documents not rendering (#13552) (409dd56)
- richtext-lexical: toolbar dropdown items are disabled when selecting via double-click (#13544) (3bc1d08)
- ui: prevent infinite redirect if no user (#13615) (303381e)
- ui: bulk edit overwriting fields within named tabs (#13600) (138938e)
- ui: autosave in document drawer overwrites local changes (#13587) (bd81936)
- ui: multiple logout requests being made in parallel (#13595) (cf37433)
- ui: auth-fields container renders despite no visible auth/API key/verify content (#13554) (8101842)
- ui: correctly pass query params to locked document requests (#10802) (598ff4c)
🛠 Refactors
📚 Documentation
- adds default populate video (#13586) (ded8ec4)
- blank-template-url-fix (#13580) (45c3be2)
- fix small typo in documentation (#13545) (3408d7b)
⚙️ CI
- remove run-e2e-turbo flow (#13611) (5c41966)
- ignore template bump commits in release notes [skip ci] (60cfc31)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Jarrod Flesch (@JarrodMFlesch)
- Jacob Fletcher (@jacobsfletch)
- Jessica Rynkar (@jessrynkar)
- Sean Zubrickas (@zubricks)
- Elliot DeNolf (@denolfe)
- Patrik (@PatrikKozak)
- Rodrigo Solís (@sorodrigo)
- Logan Stellway (@lstellway)
- Yunsup Sim (@SimYunSup)
- Vincent Vu (@rubixvi)
v3.53.0 (2025-08-21)
🚀 Features
- add icelandic translations (#13423) (2bdd669)
- plugin-import-export: use groupBy as SortBy when present and sort is unset (#13491) (a7ed88b)
- plugin-import-export: adds sort order control and sync with sort-by field (#13478) (efdf002)
- plugin-multi-tenant: visible tenant field on documents (#13379) (5cf215d)
🐛 Bug Fixes
- server edit view components don't receive document id prop (#13526) (9607453)
- uploads update unnecessarily resizing with sharp (#13528) (a94cd95)
- accept computed array and block rows from server form state (#13501) (f382c39)
- 'front-end' spelling typo in JSDocs for overrideAccess (#13515) (f44e276)
- imports (part 2/2) (#13520) (cf427e5)
- select field component value prop type does not support array values (#13510) (4f6d0d8)
- unable to query versions on latest key (#13512) (73ba4d1)
- avoid re-uploading the file unless changed (#13500) (92d459e)
- copy to locale with localized fields inside tabs (#13456) (ec5b673)
- omit trashed documents from appearing in folder results (#13492) (1909063)
- update docker base image in templates (#13020) (64f4b0a)
- db-mongodb: disable join aggregations in DocumentDB compatibility mode (#13270) (c7b9f0f)
- db-postgres: camelCase point fields (#13519) (aa90271)
- next: no client field found error when accessing version view in some configurations (#13339) (393b4a0)
- next: add missing translations to version view (c8ef924)
- plugin-form-builder: export radio field type (#11908) (fea6742)
- richtext-lexical: use thumbnail component for uploads (#12540) (7699d02)
- storage-s3: validate Content-Length before appending header (#13472) (9d08f50)
- templates: plugin template correct paths for exports (#13427) (b714e6b)
- translations: stale version.versionCreatedOn key in translation (#13530) (a04bc9a)
- ui: thread id through instead of from routeParams (#13539) (b65ca68)
- ui: logout type error when user is null during locale switch (#13514) (b3e48f8)
- ui: replace deprecated
document.execCommand('copy')API withnavigator(#13431) (368cd90) - ui: local image src changing when title changes (#13442) (406a09f)
- ui: double ? in gravatar url (#13511) (332b2a9)
- ui: nested fields with admin.disableListColumn still appear as columns in list view (#13504) (9f7d8c6)
- ui: blocks field not respecting width styles in row layouts (#13502) (30ea8e1)
- ui: cannot replace the file if the user does not have delete access (#13484) (3dd142c)
- ui: bulk upload action bar buttons wrapping (#13486) (b7243b1)
⚡ Performance
- storage-s3: stream files and abort s3 request from static handler (#13430) (36fd6e9)
- ui: do not fetch doc permissions on autosave (#13477) (c67ceca)
- ui: reduce number of field renders on submit (#13524) (5e433aa)
📚 Documentation
- fix typo in custom views (#13522) (a840fc9)
- clarify pagination and improve cross-referencing (#13503) (f9bbca8)
- db-mongodb: note on indexing localized fields & per-locale growth (#13469) (379ef87)
🧪 Tests
🏡 Chores
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Jónas G. Sigurðsson (@jonnigs)
- Patrik (@PatrikKozak)
- Alessio Gravili (@AlessioGr)
- Dan Ribbens (@DanRibbens)
- Anders Semb Hermansen (@andershermansen)
- Jacob Fletcher (@jacobsfletch)
- Said Akhrarov (@akhrarovsaid)
- Sasha (@r1tsuu)
- Gregor Billing (@gregorbg)
- Bob Bass (@robertjbass)
- Boyan Bratvanov (@bratvanov)
- German Jablonski (@GermanJablo)
- Jan Huenges (@jhuenges)
- Паламар Роман (@VeiaG)
- chenxi-debugger (@chenxi-debugger)
- id3er0 (@id3er0)
- Anatoly Kopyl (@anatolykopyl)
- Elliot DeNolf (@denolfe)
v3.52.0 (2025-08-15)
🚀 Features
🐛 Bug Fixes
- filter
payload-cookies ingetExternalFileonly if the URL is external (#13475) (8d4e7f5) - db-postgres: ensure index names are not too long (#13428) (047519f)
- plugin-import-export: csv export & preview showing full documents for hasMany monomorphic relationships instead of just ID (#13465) (3e65111)
- ui: significantly more predictable autosave form state (#13460) (0b60bf2)
📚 Documentation
🧪 Tests
- skip cookies filter for internal URLs in
getExternalFile(#13476) (46699ec) - fix import-export plugin int (#13474) (b426052)
📝 Templates
🤝 Contributors
- jacobsfletch (@jacobsfletch)
- Sasha (@r1tsuu)
- Sean Zubrickas (@zubricks)
- Dan Ribbens (@DanRibbens)
- Patrik (@PatrikKozak)
- Elliot DeNolf (@denolfe)
v3.51.0 (2025-08-13)
🚀 Features
- plugin-multi-tenant: allow tenant field overrides (#13316) (995f96b)
- ui: update query presets ux (#13095) (255bba9)
🐛 Bug Fixes
- upload with no filename gives vague error (#13414) (5a99d8c)
- version view breaks when tab field has function for label (#13415) (35ca98e)
- ensure scheduling by default only handles default queue, add allQueues config to autoRun (#13395) (ad2564e)
- use thumbnailUrl for upload documents in folder view (#13368) (2211f3d)
- next: group by boolean values (#13382) (d4f1986)
- next: group by dates with null values (#13381) (7344d64)
- richtext-lexical, plugin-multi-tenant: text editor exposes documents from other tenants (#13229) (9c8f320)
- templates: only generate slug from title on demand (#12956) (2bc9a2d)
- translations: update traditional chinese (zh-TW) localization (#13370) (5d8f8dc)
- ui: autosave form state discards local changes (#13438) (8173180)
- ui: misalignment of nested toggles on document API tab (#13424) (306b7f6)
- ui: field elements showing over the top of Preview content (#13148) (72f5763)
- ui: bulk upload issues (#13413) (a374aab)
- ui: autosave hooks are not reflected in form state (#13416) (1d81b0c)
- ui: search in select fields with
filterOptions(#13397) (c9a1590)
📚 Documentation
🧪 Tests
⚙️ CI
🏡 Chores
🤝 Contributors
- Jessica Rynkar (@jessrynkar)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Alessio Gravili (@AlessioGr)
- Jarrod Flesch (@JarrodMFlesch)
- Paul (@paulpopus)
- Marcus Michaels (@marcusmichaels)
- Luke Bennett (@lukebennett)
- German Jablonski (@GermanJablo)
- Rodrigo Antunes (@rodrigoant)
- Sasha (@r1tsuu)
- Yi Chi (@chiyi4488)
- Sam (@damnsamn)
- Elliot DeNolf (@denolfe)
v3.50.0 (2025-08-05)
🚀 Features
- add hooks to restoreVersion collection operation (#13333) (9031f3b)
- adds trash support to the count operation (#13304) (1175508)
- graphql: allow to pass
count: trueto a join query (#13351) (f432cc1) - translations: add Indonesian translations (#13323) (df91321)
🐛 Bug Fixes
- deletedAt in TypeWithID not accepting null from generated types (#13363) (8401b21)
- svg uploads allowed when glob (#13356) (43b4b22)
- querying
hasMany: trueselect fields inside polymorphic joins (#13334) (b26a73b) - next: version view did not properly handle field-level permissions (#13336) (1d70d4d)
- next: incorrect version view stepnav value (#13305) (8a48941)
- next: safely access relationTo value from relationship field (#13337) (095e7d9)
- next: incorrect doc link in trash view with groupBy enabled (#13332) (c48b57f)
- next: cannot filter trash (#13320) (e7124f6)
- plugin-multi-tenant: constrain results to assigned tenants when present (#13365) (20b4de9)
- richtext-lexical: recursively unwrap generic Slate nodes in Lexical migration converter (#13202) (227a20e)
- ui: fallback to default locale checkbox passes wrong value (#12396) (b74f4fb)
- ui: group/array error paths persisting when valid (#13347) (2903486)
- ui: add hidden sidebar fields css specificity (#13344) (b965db8)
- ui: hide sidebar when no fields rendered (#13340) (1b93c4b)
- ui: incorrect padding when using rtl (#13338) (f2d4004)
⚡ Performance
- 23% faster job queue system on postgres/sqlite (#13187) (3114b89)
- ui: only select the useAsTitle field when fetching the document data of a relationship value (#13228) (1b31c74)
🧪 Tests
- adds e2e tests for auth enabled collections with trash enabled (#13317) (a8b6983)
- stabilize frequent fails (#13318) (a22f27d)
🏡 Chores
🤝 Contributors
- Jessica Rynkar (@jessrynkar)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Jens Becker (@jhb-dev)
- Sasha (@r1tsuu)
- Muhammad Nizar (@mnizarzr)
- Evelyn Hathaway (@evelynhathaway)
v3.49.1 (2025-07-29)
🐛 Bug Fixes
- support next.js 15.4.4 (#13280) (5c94d2d)
- keep apiKey encrypted in refresh operation (#13063) (#13177) (b1fa76e)
- filters cookies with the
payload-prefix in getExternalFile by default (#13215) (0894249) - use atomic operation for incrementing login attempts (#13204) (4fde0f2)
- refactors toast error rendering (#13252) (d093bb1)
- serve svg+xml as svg (#13277) (bc80284)
- svg+xml file detection (#13276) (e8f6cb5)
- drizzle: respect join.type config (#13258) (8518141)
- next: group by null relationship crashes list view (#13315) (e502203)
- next: catch list filter errors, prevent list view crash (#13297) (8d84352)
- next: pass req through document tab conditions and custom server components (#13302) (c5c8c13)
- next: unable to view trashed documents when group-by is enabled (#13300) (aff2ce1)
- plugin-multi-tenant: prefer assigned tenants for selector population (#13213) (e29d1d9)
- richtext-lexical: unify indent between different converters and make paragraphs and lists match without CSS (#13274) (7cd4a8a)
- translations: improve swedish translations (#13272) (da8bf69)
- translations: missing closing brace in rs latin translation for lastSavedAgo (#13172) (26d9dae)
- ui: autosave-enabled document drawers close unexpectedly within the join field (#13298) (61ee8fa)
⚡ Performance
📚 Documentation
- remove asterisk from optional url property in live preview docs (#13108) (fc59448)
- typo in vercel-content-link.mdx (#13170) (9e04dbb)
- fixes typo in ternary operator for live preview docs (#13163) (72954ce)
- remove obsolete scheduler property (#13278) (2e9ba10)
🧪 Tests
📝 Templates
⚙️ CI
🏡 Chores
- next: cleanup unused code (#13292) (b1aac19)
- ui: var name typo in relationship field (#13295) (a888d5c)
🤝 Contributors
- contip (@contip)
- German Jablonski (@GermanJablo)
- Adebayo Ajayi (@Braggedtooth)
- brutumfulmen97 (@brutumfulmen97)
- Alejandro Martinez (@ja-martinez)
- Aayush Rajagopalan (@aayushxr)
- Sean Zubrickas (@zubricks)
- Jacob Fletcher (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
v3.49.0 (2025-07-25)
🚀 Features
- adds trash support (soft deletes) (#12656) (f63dc2a)
- group by (#13138) (bccf6ab)
- scheduling jobs (#12863) (c08b2ae)
- ui: expose refresh method to list drawer context (#13173) (e48427e)
🐛 Bug Fixes
- filtering by polymorphic relationships inside other fields (#13265) (75385de)
- text field validation for minLength: 1, required: false (#13124) (af2ddff)
- empty folderType arrays break relational dbs (#13219) (7f9de6d)
- handle undefined values in afterChange hooks when read:false and create:true on the field level access for parents and siblings (#12664) (46d8a26)
- exit payload jobs:run process after completion (#13211) (4ae503d)
- db-mongodb: handle duplicate unique index error for DocumentDB (#13239) (c1cfceb)
- db-postgres: search is broken when
useAsTitleis not specified (#13232) (a83ed5e) - next: prevent base list filters from being injected into the url (#13253) (0eac58e)
- plugin-import-export: json preview and downloads preserve nesting and exclude disabled fields (#13210) (8f85da8)
- ui: preserve localized blocks and arrays when using CopyToLocale (#13216) (4a712b3)
- ui: incorrect blocks label sizing (#13264) (fa7d209)
- ui: ensure document unlocks when logging out from edit view of a locked document (#13142) (7e81d30)
- ui: monomorphic relationship fields should not show relationTo option labels (#13245) (29fb9ee)
- ui: select all should reset when params change, page, filter, etc (#12612) (412bf4f)
- ui: ensure publishSpecificLocale works during create operation (#13129) (dce898d)
- ui: properly sync search params to user preferences (#13200) (d7a3faa)
⚡ Performance
- db-postgres: avoid including
prettierto the bundle (#13251) (380ce04) - drizzle: single-roundtrip db updates for simple collections (#13186) (94f5e79)
🛠 Refactors
📚 Documentation
- add
statusto forbidden field names when using Postgres and drafts are enabled (#13233) (7ae4f8c) - remove payload cloud (#13240) (77f279e)
- fix typo, example was not valid JSON (#13224) (0eb8f75)
- shorten line length in code snippet comments to avoid horizontal scrolling (#13217) (d6e21ad)
- plugin-import-export: document plugin-import-export (#13243) (14322a7)
🔨 Build
⚙️ CI
🏡 Chores
- add new int test verifying that select improves performance of new optimization (#13254) (aeee070)
- plugin-import-export: use debug-level logging for createExport process (#13242) (246a42b)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- German Jablonski (@GermanJablo)
- Jarrod Flesch (@JarrodMFlesch)
- Jacob Fletcher (@jacobsfletch)
- Dan Ribbens (@DanRibbens)
- Alessio Gravili (@AlessioGr)
- Elliot DeNolf (@denolfe)
- fgrsource (@fgrsource)
- Chandler Gonzales (@jcgsville)
- Jessica Rynkar (@jessrynkar)
- iamacup (@iamacup)
- Jake Fell (@jakefell)
v3.48.0 (2025-07-17)
🚀 Features
- add
findDistinctoperation (#13102) (a20b436) - atomic number field updates (#13118) (841bf89)
- plugin-import-export: adds support for disabling fields (#13166) (5839cb6)
- plugin-import-export: adds support for forcing export format via plugin config (#13160) (7294cf5)
- plugin-import-export: adds pluginConfig options to disable Save and Download buttons in export UI (#13158) (de53f68)
- richtext-lexical: export $createLinkNode and $isLinkNode for server use (#13205) (6ae730b)
- ui: supports collection scoped folders (#12797) (12539c6)
🐛 Bug Fixes
- Enhances field-level access controls on Users collection to address s… (#13197) (cab7ba4)
- cron jobs running when calling bin scripts, leading to db errors (#13135) (64d76a3)
- types for RenderField fields prop (#13162) (5f01953)
- db-mongodb: improve compatibility with Firestore database (#12763) (41cff6d)
- plugin-import-export: disabled flag to cascade to nested fields from parent containers (#13199) (95e373e)
- plugin-import-export: export field dropdown to properly label and path fields in named/unnamed tabs (#13180) (2a59c5b)
- plugin-multi-tenant: selector could become hidden (#13134) (e575511)
- plugin-seo: add localized property to MetaTitleComponent (#12751) (d213c91)
⚡ Performance
📚 Documentation
- fix minor typo (#13185) (be8e8d9)
- performance (#13068) (277448d)
- fix invalid syntax failing the docs import (#13165) (4831bae)
- add section on browser environment variables when using experimental-build-mode (#13164) (4c69f8e)
🧪 Tests
📝 Templates
⚙️ CI
- disable bundle analysis for forks (#13198) (e6da384)
- fix post-release-templates workflow (#13159) (edd1f02)
🤝 Contributors
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Sasha (@r1tsuu)
- Sean Zubrickas (@zubricks)
- Elliott W (@elliott-w)
- Elliot DeNolf (@denolfe)
- jangir-ritik (@jangir-ritik)
- Jacob Fletcher (@jacobsfletch)
- Patrick Roelofs (@Patrickroelofs)
v3.47.0 (2025-07-11)
🚀 Features
- allow joins, select, populate, depth and draft to /me REST API operation (#13116) (2d91cb6)
- exports new sanitizeUserDataForEmail function (#13029) (9f1bff5)
- next: redirect non-existent documents to list view with banner (#13062) (5e82f9f)
- next: add redirect from
${adminRoute}/collectionsto${adminRoute}(#13061) (a7a0501) - plugin-import-export: show delayed toast when export download takes time (#13126) (b3a994e)
- storage-*: include modified headers into the response headers of files when using adapters (#12096) (cb6a73e)
- ui: add API key visibility toggle (#13110) (8a3b97c)
- ui: adds support for copy pasting complex fields (#11513) (1d6ffcb)
🐛 Bug Fixes
- execute mimetype validation on the file buffer data (#13117) (5695d22)
- login operation not returning collection and _strategy (#13119) (0c2b105)
- ensure we perform ssrf check within dispatcher (#13078) (e99c67f)
- ensure default values are not shown when value is hidden (#13074) (855a320)
- correctly reset login attempts (#13075) (aa97f3c)
- payload auth api-key algorithm compatibility (#13076) (9c45321)
- next: prevent live preview url functions from firing unnecessarily (#13088) (0b88466)
- plugin-import-export: sync export field selection with list view columns from query columns (#13131) (c1bad01)
- plugin-import-export: flattening logic for polymorphic relationships in CSV exports (#13094) (c6105f1)
- plugin-import-export: selectionToUse field to dynamically show valid export options (#13092) (0806ee1)
- plugin-import-export: sync field select dropdown with form value (#13103) (1c6a79b)
- ui: disabled and styles add row button correctly (#13140) (2cafe49)
- ui: ensure buildFormStateHandler throws error instead of returning null for unauthorized requests (#13123) (06ef798)
- ui: monomorphic joins tables not fetching draft documents (#13139) (19a3367)
- ui: ensure that schedule publishing time picker can only be in the future (#13128) (f63dfad)
- ui: hidden input should wait for form initialization (#13114) (c77b39c)
- ui: improve alignment of clear and dropdown indicator buttons in select based fields (#12995) (4c25357)
- ui: prevent error crashing UI when relationship assigned as useAsTitle (#12981) (8a5cb27)
⚡ Performance
- db-postgres: simplify
db.updateOneto a single DB call with if the passed data doesn't include nested fields (#13060) (055cc4e)
📚 Documentation
- richtext-lexical: add documentation page about official features (#13132) (576644d)
- templates: fix grammar in README (#13027) (96c24a2)
⚙️ CI
- use .tool-versions file in setup (#13093) (dde9681)
- audit-dependencies workflow (#13090) (c876ddf)
- blank audit-dependencies workflow [skip ci] (fee33b5)
🏡 Chores
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Aaron Claes (@AaronClaes)
- Patrik (@PatrikKozak)
- Jessica Rynkar (@jessrynkar)
- Paul (@paulpopus)
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Said Akhrarov (@akhrarovsaid)
- Elliot DeNolf (@denolfe)
- Jacob Fletcher (@jacobsfletch)
- Dani Calero (@danicaleroo)
- Dan Ribbens (@DanRibbens)
- Adam Klingbaum (@adamklingbaum)
v3.46.0 (2025-07-07)
🚀 Features
🐛 Bug Fixes
- deduplicate custom array id fields (#13064) (e6f8ca6)
- check hostname of upload url (#13018) (30fc7e3)
- db-mongodb: updateOne mutates the data object and does not transform it for read (#13065) (6d5cc84)
- next: adds token to reset password initialState (#13067) (f4f13a2)
- next: respect collection-level live preview config (#13036) (f49eeb1)
- plugin-redirects: make 'from' field unique to prevent errors in redirect logic (#12964) (50c2f8b)
- ui: increase timeout for opening list drawer in RelationshipInput (#13031) (2650eb7)
- ui: change password button is hidden when user has full field access (#12988) (1d9ad6f)
🧪 Tests
⚙️ CI
🤝 Contributors
- Patrik (@PatrikKozak)
- Kendell (@kendelljoseph)
- Alessio Gravili (@AlessioGr)
- Jessica Rynkar (@jessrynkar)
- Jarrod Flesch (@JarrodMFlesch)
- Germán Jabloñski (@GermanJablo)
- Jacob Fletcher (@jacobsfletch)
v3.45.0 (2025-07-03)
🚀 Features
- mount live preview to document root (#12860) (f2213e5)
- drizzle: support half-precision, binary, and sparse vectors column types (#12491) (583a733)
🐛 Bug Fixes
- disable graphql introspection queries when disableIntrospectionInProduction is true (#12982) (a9580e0)
- strict custom view paths (#12968) (cfc7adc)
- appropriately throw unverified email error (#12933) (9f60306)
- db-mongodb: nested sorting by ID (#13016) (81532cb)
- db-mongodb: add ability to disable fallback sort and no longer adds a fallback for unique fields (#12961) (c902f14)
- db-postgres: joins with
hasMany: truerelationships nested to an array (#12980) (0e8ac0b) - drizzle: ensure updateOne does not create new document if
wherequery has no results (#12991) (fafaa04) - examples: only allow super admins to create users with super admin role (#13015) (6e5ddc8)
- examples: checks requested tenant matches user tenant permissions (#13012) (5002953)
- plugin-import-export: pre-scan columns before streaming CSV export (#13009) (34c3a51)
- plugin-import-export: preview table to include all selected columns regardless of populated data (#12985) (335af1b)
- plugin-multi-tenant: unnecessary modal appearing (#12854) (16f5538)
- templates: wrong link in demo content (custom components) (#13024) (f70c6fe)
- ui: save nested richtext inside inlineBlock (#12773) (babcd59)
- ui: autosave infinite loop within document drawer (#13007) (b40c581)
- ui: field bulk upload showing stale data (#13006) (9ba740e)
- ui: prevent document drawer from remounting on save (#13005) (c80b6e9)
- ui: bulk upload redirecting to relationship documents when added (#13001) (a9ad7c7)
- ui: skip disabled fields when adding OR filter conditions in list view (#13004) (7a40a9f)
- ui: render preview sizes button when adjustments are disabled but image sizes are defined (#12999) (b1ae749)
- ui: block rows unexpectedly collapse and array rows not collapsed on init (#12987) (3f30a2e)
- ui: prevent error if rows is undefined in mergeServerFormState (#12962) (6f6d305)
🎨 Styles
🧪 Tests
📝 Templates
⚙️ CI
- template errors not being caught due. fix: error due to updated generated-types User type (#12973) (4458f74)
🏡 Chores
🤝 Contributors
- Patrik (@PatrikKozak)
- Sasha (@r1tsuu)
- Sebastian Blank (@blankse)
- Alessio Gravili (@AlessioGr)
- Germán Jabloñski (@GermanJablo)
- Jessica Rynkar (@jessrynkar)
- Jacob Fletcher (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
- Said Akhrarov (@akhrarovsaid)
- Paul (@paulpopus)
v3.44.0 (2025-06-27)
🚨 Notice 🚨
If your project uses the local auth strategy with db-postgres or db-sqlite, a migration is required. This is due to a new security feature (enabled by default) that stores a unique auth session identifier in the database.
To opt out and continue using the previous behavior, you can disable the feature by setting auth.useSessions: false in your users collection config.
For example:
// payload.config.ts
collections: [
{
slug: 'users',
auth: {
useSessions: false,
},
fields: [],
},
],
🚀 Features
- auth sessions (#12483) (26d709d)
- collection-level preferences (#12909) (c8b7214)
- collection-level
disableBulkEdit(#12850) (a5ec55c) - plugin-import-export: preview displays CSV and JSON data accurately (#12948) (3830d71)
- templates: added int and e2e tests to blank and website templates (#12866) (87c7952)
🐛 Bug Fixes
- richTextField supports beforeInput/afterInput, but these were missing from types.ts (#12889) (e769550)
- validate "null" value for point field as true when its not required (#12908) (2da6d92)
- get external resource blocked (#12927) (a7ad573)
- restore missing properties to live preview client config (#12904) (bcb10b5)
- uses valid fractional index for test (#12942) (8900a38)
- querying virtual fields deeply with
draft: true(#12868) (bc9b501) - use small pill size when viewing version information (#12844) (6c4dfe4)
- db-mongodb: strip deleted from the config blocks from the result (#12869) (54afaf9)
- db-postgres: joins with custom schema (#12937) (c1f6297)
- db-postgres: querying on
hasMany: trueselect field in a relationship (#12916) (b74969d) - drizzle: skip column if undefined in findMany (#12902) (605c993)
- live-preview: client-side live preview cannot populate more than 10 relationships at once (#12929) (7472798)
- live-preview: foreign postMessage events reset client-side state (#12925) (67fa5a0)
- next: live preview popup triggers leave without saving modal (#12947) (141133a)
- next: prevent errors in globals version view (#12920) (39e9519)
- next: remove error handling from next auth functions (#12897) (1b5e3fe)
- next: remove console.error from next auth functions (#12881) (fe58f03)
- plugin-import-export: duplicated rows and headers in CSV export when streaming paginated results (#12941) (5cf9287)
- plugin-import-export: csv export for polymorphic relationship fields (#12926) (6d76874)
- plugin-import-export: omit CSV columns when toCSV returns undefined (#12923) (751691a)
- plugin-multi-tenant: updates tenant selector upon tenant creation (#12936) (c76d839)
- richtext-lexical: consistent html converter inline padding (#12848) (11ac230)
- ui: usePreventLeave should not show alert for exceptions (#12722) (c3c1614)
- ui: vertically align table headers to the middle (#12699) (0e9865c)
- ui: properly render create new button in polymorphic joins (#12930) (a1822d2)
- ui: render DateTime label as
- ui: bulk upload losing state when adding additional files (#12946) (d62d9b4)
- ui: unreachable custom views when admin route set to '/' (#12812) (379fc12)
- ui: toggle list selections off on successful bulk action (#12861) (9f17db8)
- ui: align caret on error tooltip for checkbox field (#12917) (c094b0e)
- ui: updates auth fields UI to reflect access control (#12745) (1845669)
- ui: folder server function must reference exports dir (#12898) (0d50799)
- ui: custom row labels on arrays should not be removed on field duplication (#12895) (37c945b)
- ui: date format of useAsTitle lost after changing value (#12928) (20bbbcf)
- ui: properly differentiate between DOM events and raw values in setValue (#12892) (c03e9c1)
- ui: should select document after creation from relationship field (#12842) (25e3902)
- ui: support react node content in ConfirmationModal heading and body (#12841) (dffdee8)
🛠 Refactors
- changed default exports to named exports in payload package (#12871) (053192c)
- remove unused assets, move remaining assets out of payload packages (#12874) (bb17cc3)
- simplify job queue error handling (#12845) (59f536c)
- simplify job type (#12816) (84cb2b5)
📚 Documentation
- remove group from list of default field validations (#12921) (e5e0ec8)
- filterOptions anchor link fix (#12883) (fcaf989)
- fix typo on authentication overview page (#12891) (7a0308f)
- plugin-sentry: add pg query instrumentation guide (#12229) (dede3a4)
🧪 Tests
- bulk edit flaky selectors (#12950) (86e48ae)
- adds test for skipSafeFetch allowList (#12954) (7ebac63)
- guard against null values in custom toCSV functions (#12938) (1cdec86)
- fix
database/int.spec.tswith postgres custom schema (#12922) (cf87871) - fix
databaseintegration tests with postgres (#12919) (886c07e)
📝 Templates
📓 Examples
⚙️ CI
- bring back CODEOWNERS file for reviews, approval not required [skip ci] (1db0619)
- revert bump pnpm to v10 (#12840) (#12906) (ca0d036)
- add timeout-minutes for int and e2e (#12903) (c7dc1b4)
- adjust neverBuiltDependencies in test/package.json (#12896) (a44e4c4)
- bump pnpm to v10 (#12840) (85e0e0e)
🏡 Chores
- fix jest global teardown incorrectly always returning process exit status 0 (#12907) (5368440)
- set trimTrailingWhitespace and insertFinalNewline in vscode settings (#12939) (b1a57fa)
- fix withPayload helper jsdoc (#12503) (57f4fb6)
- remove neverBuiltDependencies from test/package.json (4831f66)
- add eslint rule to ignore default exports in test suite configs (#12655) (9c5adba)
🤝 Contributors
- James Mikrut (@jmikrut)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Roman (@spielerx)
- Jesper We (@JesperWe)
- ThijsAtFreave (@ThijsAtFreave)
- Sam Wheeler (@swheeler7)
- Chandler Gonzales (@jcgsville)
- Jessica Rynkar (@jessrynkar)
- Said Akhrarov (@akhrarovsaid)
- Dani Calero 🚀 (@danicaleroo)
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Patrik (@PatrikKozak)
- Dave Ryan (@dave-wwg)
- Jarrod Flesch (@JarrodMFlesch)
- Kendell (@kendelljoseph)
- Ondřej Závodný (@ozavodny)
- Paul (@paulpopus)
- Ruby Jasmin (@rubyjasmin)
- Anatoly Kopyl (@anatolykopyl)
- Alessio Gravili (@AlessioGr)
- Andrea Ghidini (@ghidosoft)
- Adler Weber (@adlrwbr)
- Marcus Michaels (@marcusmichaels)
- Philip (@stuckinsnow)
v3.43.0 (2025-06-16)
🚀 Features
- admin upload controls (#11615) (f2e0422)
- expose
dataargument inafterChangehook for collections and globals (#12756) (458a04b) - db-postgres: allow to store blocks in a JSON column (#12750) (215f49e)
- db-postgres: support read replicas (#12728) (0a35737)
- version diff view overhaul (#12027) (4e2e4d2)
- next: reorder document view tabs (#12288) (65309b1)
- storage-s3: dynamic presigned URL downloads (#12706) (865a9cd)
- ui: adds constructorOptions to upload config (#12766) (b372a34)
- ui: moves folder rendering from the client to the server (#12710) (a43d1a6)
🐛 Bug Fixes
- ensure job autoruns are not triggered if jobs collection not enabled (#12808) (769ca03)
- filtering joins in
whereby ID (#12804) (9943b35) - change payload.jobs.run and bin script to only run jobs from
defaultqueue by default, adds support for allQueues argument (#12799) (06ad171) - remove unsupported path property from default document view configs (#12774) (f64a0ae)
- field inside an unnamed group field erroring when used as a title (#12771) (143aff5)
- error when saving global with versioning enabled (#12778) (cf43c5c)
- reduce global DOM/Node type conflicts in server-only packages (#12737) (67fb29b)
- orderable has incorrect sort results depending on capitalization (#12758) (37afbe6)
- ensure redirect route is correctly formatted for "Copy to locale" (#12560) (9d2817e)
- db-mongodb: 4x and more level deep relationships querying (#12800) (245a2de)
- db-mongodb: bump
mongooseto8.15.1(#12755) (860e0b4) - db-postgres: reordering of enum values, bump
drizzle-kit@0.31.0anddrizzle-orm@0.43.1(#12256) (7045182) - db-postgres: x3 and more nested blocks regression (#12770) (df8be92)
- db-sqlite: sqlite unique validation messages (#12740) (254ffec)
- plugin-import-export: download button in collection edit view (#12805) (8235fe1)
- plugin-import-export: incorrect custom type on toCSVFunction changed to toCSV (#12796) (3edcc40)
- plugin-import-export: export all available fields by default (#12731) (c4e5831)
- plugin-nested-docs: check error name that is changed at compile time (#12798) (729b676)
- plugin-redirects: add missing optional chaining (#12753) (d0e647a)
- storage-azure: return error status 404 when file is not found instead of 500 (#11734) (018317d)
- storage-gcs: return 404 on file not found instead of 500 (#11746) (d8626ad)
- storage-s3: return error status 404 when file is not found instead of 500 (#11733) (a19921d)
- translations: reformats
bnBDandbnINtranslation imports to camelCase (#12736) (08fbcb5) - ui: reordering with a join field inside a group (#12803) (e60db07)
- ui: adjust alignment of list header actions (#12793) (77f3805)
- ui: not showing hyphenated field values in table (#12791) (e7b5884)
- ui: inconsistent pill sizes across admin panel (#12788) (9364d51)
⚡ Performance
🛠 Refactors
- next: simplify document tab rendering logic (#12795) (53835f2)
- next: simplify document view routing (#12777) (b556fe3)
📚 Documentation
- fix header custom component example (#12801) (7fef589)
- remove outdated
buildPathproperty (#12741) (38652d7) - add info about localized/built-in validation error messages (#12718) (96f417b)
- fix invalid code block language (#12734) (ebe7fde)
🏡 Chores
- adds filters (#12622) (c04c257)
- remove invalid colon from workspaces key in package.json (#12757) (08d5b2b)
- migrate to TypeScript strict in Payload package - #4/4 (#12733) (53f8838)
- scripts: fix tsconfig.base.json reset (3313ab7)
🤝 Contributors
- Sasha (@r1tsuu)
- Jessica Rynkar (@jessrynkar)
- Alessio Gravili (@AlessioGr)
- Dan Ribbens (@DanRibbens)
- Kendell Joseph (@kendelljoseph)
- Paul (@paulpopus)
- Jacob Fletcher (@jacobsfletch)
- Jayce Pulsipher (@jaycetde)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
- Patrick Roelofs (@Patrickroelofs)
- Anders Semb Hermansen (@andershermansen)
- Said Akhrarov (@akhrarovsaid)
- Elliot DeNolf (@denolfe)
- Anyu Jiang (@anyuj)
- Germán Jabloñski (@GermanJablo)
- codeflorist (@codeflorist)
v3.42.0 (2025-06-09)
🚀 Features
- create the importmap file if missing and the location can be found (#12727) (c6659db)
- plugin-import-export: add custom toCSV function on fields (#12533) (8f4c442)
- plugin-import-export: add debug logging option (#12705) (678bfc7)
- translations: add Bangla translations (#12696) (3f670ca)
🐛 Bug Fixes
- proper globals max versions clean up (#12611) (9fbc3f6)
- adds routeParams to the req on views (#12711) (773e4ad)
- plugin-form-builder: export DateField type (#12695) (8d7dbe6)
- plugin-import-export: incorrect config extension of jobs (#12730) (ff615d3)
- plugin-import-export: revise zhTw translations (#12685) (afbdf3d)
- richtext-lexical: text state css not applied if 2+ text state groups present (#12726) (3d177fd)
- richtext-lexical: prevent runtime error if using TextStateFeature without props (#12668) (6f82154)
- richtext-slate: add 'li' string literal to RichTextElement type (#12693) (e10e445)
- translations: correct i18n dynamic variable name for 'movingFromFolder' (#12642) (6f76d72)
⚡ Performance
📚 Documentation
- document how to expose the jobs collection in Admin UI (#12707) (34fe36b)
- fix formatting in custom components > edit view paragraph (#12697) (6466684)
- improve jobs autorun docs, adds e2e test (#12196) (7c05c77)
- enhance drafts documentation with examples for REST, Local, and GraphQL APIs (#12575) (629e74d)
- removes duplicate headline in building without a db connection (#12694) (4ee4aa7)
- plugin-form-builder: add warning about GraphQL type name collis… (#12720) (7b21270)
🏡 Chores
🤝 Contributors
- Dan Ribbens (@DanRibbens)
- Sasha (@r1tsuu)
- sonny.you (@SonnyYou)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Germán Jabloñski (@GermanJablo)
- Gordon Westerman (@gwesterman)
- Willian de Souza (@WillFelisberto)
- Anyu Jiang (@anyuj)
- SHOMRIDDHO'S WORLD (@shomriddho)
- Jessica Rynkar (@jessrynkar)
- Paul (@paulpopus)
- Sean Zubrickas (@zubricks)
v3.41.0 (2025-06-05)
🚀 Features
- optionally exclude collection documents from appearing in browse-by-folder (#12654) (337f618)
- improve turbopack compatibility (#11376) (319d335)
- polymorphic join querying by fields that don't exist in every collection (#12648) (2b40e0f)
- ui: use document drawers for folder edit/create (#12676) (9581092)
- ui: adds new editMenuItems custom component (#12649) (625d8d9)
🐛 Bug Fixes
- correctly detect glb & gltf mimetypes during upload (#12623) (05eeddb)
- allow unnamed group fields to not set a label at all (#12580) (d561195)
- cpa: generate .env when using the --example flag (#12572) (836fd86)
- db-postgres: ensure deletion of numbers and texts in upsertRow (#11787) (bd512f1)
- db-postgres:
inquery withnull(#12661) (c08cdff) - live-preview: correct type inference (#12619) (c83e791)
- next: cannot override tab of default views (#11789) (c639c5f)
- plugin-seo: thread allowCreate to meta image component (#12624) (ede5c67)
- richtext-lexical: export defaultColors for use in client components (#12627) (8199a7d)
- richtext-lexical: enable select inputs with ctrl+a or cmd+a (#12453) (89ced5e)
- translations: add missing import for lv locale from date-fns (#12577) (cbc37d8)
- ui: adjusts margin spacing on upload actions (#12692) (1dd4a12)
- ui: safely extract text from React nodes (#12419) (48e5ee6)
- ui: formatDate and formatTimeToNow utility type error on i18n arg to support I18nClient too (#12576) (76bf459)
- ui: correctly thread through the autoComplete attribute from admin config to the text input (#12473) (08ec837)
- ui: clear miliseconds in date fields unless theyre explicitly provided in the display format (#12650) (a9ff375)
- ui: reset columns state throwing errors (#11903) (08a6f88)
- ui: upload action button styles (#12592) (6119d89)
⚡ Performance
🛠 Refactors
- translations: correct i18n translation for Mandarin (#12561) (6f8cff7)
- ui: improve relationship field option loading reliability using queues (#12653) (30dd9a2)
📚 Documentation
- add Content-Type header for JWT authentication (#12513) (3f7debd)
- fix import statements for
plugin-nested-docs(#12494) (5635ec5) - improve rich-text documentation with hasText usage tip (#12645) (53de775)
- fix beforeHook documentation to reflect actual behaviour (#12651) (fd5cd1a)
- improve module augmentation docs for request context (#12681) (0c3ff88)
- update seo plugin tabbedUI docs to mention potential pitfalls with the config option (#12549) (505eaa2)
- missing dash (#12644) (684c436)
- building without a db connection (#12607) (7c094dc)
📝 Templates
⚙️ CI
🏡 Chores
- fix various e2e test setup issues (#12670) (545d870)
- fix lint warnings for default exports, unused imports, unused err in catch (#12666) (48218bc)
- migrate to TypeScript strict in Payload package (enable strictNullChecks) - #3 (#12586) (6ec21a5)
- update CONTRIBUTING.md (#12511) (5e3a94b)
🤝 Contributors
- Patrik (@PatrikKozak)
- Kamil Troczewski (@kamiloox)
- codeflorist (@codeflorist)
- Rot4tion (@Rot4tion)
- iamacup (@iamacup)
- Jacob Fletcher (@jacobsfletch)
- Alessio Gravili (@AlessioGr)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Germán Jabloñski (@GermanJablo)
- Jessica Rynkar (@jessrynkar)
- Jacob (@chmielulu)
- Tobias Odendahl (@tak-amboss)
- Anyu Jiang (@anyuj)
v3.40.0 (2025-05-29)
🚀 Features
- adds new canSetHeaders prop to auth strategies (#12591) (ca6f849)
- moves getSafeRedirect into payload package (#12593) (7e873a9)
- adds calling of before and after operation hooks to resetPassword (#12581) (54a0484)
- show nested fields in named tabs as separate columns in the list view (#12530) (20f7017)
- filter query preset constraints (#12485) (0204f0d)
- select field filter options (#12487) (f75d62c)
- ui: export FieldAction type (#12589) (699af8d)
🐛 Bug Fixes
- parseCookies ignore invalid encoded values (#12515) (bfdcb51)
- improve translation script prompt and fix some incorrectly used terms in spanish and dutch (#12548) (1731dd7)
- browseByFolder route should be optional (#12527) (c010d51)
- thread req into interal folder payload operations (#12523) (64443d8)
- infinite loop in findUp utility when a result is not found (#12457) (842d184)
- delete subfolders hook with relational databases (#12507) (45f4c5c)
- db-*: disable DB connection for
payload migrate:create(#12596) (12395e4) - db-*:
migrate:resetexecutes in a wrong order (#12445) (1b1e36e) - db-mongodb: exists query on checkbox fields (#12567) (f2b6c4a)
- db-postgres: properly escape the
'character (#12590) (6888f13) - examples: update live-preview example to ESM (#12570) (d6f6b05)
- next: folder redirects not working (#12509) (bc43982)
- richtext-lexical: respect disableBlockName (#12597) (ca26402)
- richtext-lexical, ui: opening relationship field with appearance: "drawer" inside rich text inline block (#12529) (f2b54b5)
- storage-vercel-blob: client uploads with a prefix (#12559) (b61ef13)
- templates: update template/plugin and fix import map issue (#12305) (68ba24d)
- translations: improve Spanish translations (#12555) (8a7ac78)
- translations: correct Norwegian terms for “locale” and language labels (#12557) (bd2571c)
- ui: reduces pill sizing in autosave cells (#12606) (a17d84e)
- ui: oversized column selector pills (#12583) (3022cab)
- ui: filtering on hasMany fields (#12579) (166dafe)
- ui: prevent textarea description overlapping fields and not honoring rows attribute (#12406) (032375b)
- ui: cloudfront removing X-HTTP-Method-Override header (#12571) (8448e5b)
- ui: live-preview-tab should show beforeDocumentControls (#12568) (dfa0974)
- ui: safari css rendering issues with table and folder cards (#12531) (293cdc1)
- ui: only and files/folders to the grid/list if they were added to the current folder (#12525) (5a75881)
- ui: replaces css fn with css calc (#12520) (feeee19)
- ui: index based ids without useAsTitle breaks folders (#12519) (e9cda1e)
⚡ Performance
🛠 Refactors
📚 Documentation
- autoLogin codeblock was not nested under 'admin' (#12573) (0c0b0fe)
- typos and links (#12484) (7fa879c)
- fix typos, duplicated words, wrong property names etc. (#12480) (e2f7889)
📝 Templates
🏡 Chores
- updates bug template (#12587) (4a41369)
- fixes monorepo dev plugin-import-export (#12528) (06fbc07)
- moves collections folders property to the top level (#12508) (d83b2bf)
- examples: remove unused imports from custom server example (#12467) (071c61f)
- examples: fix read permission in auth example (#12403) (cceb793)
- ui: finish adding folders e2e tests (#12524) (feb7e08)
🤝 Contributors
- Sasha (@r1tsuu)
- Jarrod Flesch (@JarrodMFlesch)
- James Mikrut (@jmikrut)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Jordy (@jordanlambrecht)
- Alessandro Stoppato (@alexrah)
- Germán Jabloñski (@GermanJablo)
- Sean Zubrickas (@zubricks)
- Jessica Rynkar (@jessrynkar)
- Patrik (@PatrikKozak)
- Said Akhrarov (@akhrarovsaid)
- Paul (@paulpopus)
- Anders Semb Hermansen (@andershermansen)
- Anyu Jiang (@anyuj)
- Dan Ribbens (@DanRibbens)
- Ricardo Tavares (@rjgtav)
- Jake Grella (@jakegrella)
- Rémy (@rrelmy)
- Elliot DeNolf (@denolfe)
v3.39.0 (2025-05-22)
🚀 Features
Folders allow you to organize your documents in a more manageable way. Now you can enable folders on a per-collection basis and from there start adding folders from within the admin panel (or via the API). Once you have folders enabled you can then start organizing. You can create folders and store documents across multiple collection types and then view them either in the collection "By Folder" or in the global "Browse by Folder" view.
https://github.com/user-attachments/assets/da1e0dec-abc7-4e5c-9241-3a733b2bfa0c
- show fields inside groups as separate columns in the list view (#7355) (2a41d3f)
- plugin-form-builder: add new date field (#12416) (4dfb2d2)
- richtext-lexical: add TextStateFeature (allows applying styles such as color and background color to text) (#9667) (fc83823)
- ui: extracts relationship input for external use (#12339) (88769c8)
🐛 Bug Fixes
- auto inject req.user into query preset constraints (#12461) (22b1858)
- telemetry in opennext cloudflare (#12327) (2ab8e2e)
- prevent resizing of original file with
withoutEnlargementon update (#12291) (1235a18) - incorrect environment file loading (#12360) (1425269)
- sanitize duplicate blocks (#12440) (5855f3a)
- orderable with groups and tabs requires migration (#12422) (529bfe1)
- respect
hidden: truefor virtual fields that have reference to a relationship field (#12219) (1f6efe9) - cpa: ensure it always installs the latest version of the templates (#12488) (898e97e)
- db-*: ensure consistent sorting even when sorting on non-unique fields or no sort parameters at all (#12447) (72ab319)
- db-mongodb: remove
limitfrom nested querying (#12464) (230128b) - db-postgres: allow the same block slug in different places with a different
localizedvalue (#12414) (219fd01) - plugin-import-export: add translations for all UI elements and fields (#12449) (3127d6a)
- plugin-multi-tenant: multi-locale tenant select label (#12444) (4fe3423)
- plugin-multi-tenant: add missing translation for Assigned Tenant field (#12448) (e8c2b15)
- plugin-seo: fix genImageResponse result parsing (#12301) (cead312)
- richtext-lexical: support inline block types in strict mode for JSXConvertersFunction type (#12478) (8596ac5)
- templates: make images visible in live preview if it is not running on port 3000 (#12432) (d4899b8)
- ui: set gap to 0 in sort column buttons to remove unneeded spacing (#12481) (c772a32)
- ui: render missing group children fields for unnamed group (#12433) (6fb2beb)
- ui: req not being threaded through to views (#12213) (bd6ee31)
⚡ Performance
📚 Documentation
- update rich text to HTML conversion documentation (#12465) (c701dd4)
- fix API capitalization typo in virtual fields documentation (#12477) (324daff)
🧪 Tests
📝 Templates
🏡 Chores
- simplifies buildColumnState functions (#12496) (8142a00)
- ignore .idea run configuration templates (#12439) (23f4204)
- fix all lint errors and add mechanisms to prevent them from appearing again (#12401) (2a929cf)
- add ignores .next folder in eslint config for templates template (#12423) (e395a0a)
- drizzle: fix lint errors in
@payloadcms/drizzle(#12428) (38029cd) - live-preview: load schemaJSON from proper client config in integration tests (#12167) (08a3dfb)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Paul (@paulpopus)
- Anders Semb Hermansen (@andershermansen)
- Germán Jabloñski (@GermanJablo)
- Patrik (@PatrikKozak)
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Alessio Gravili (@AlessioGr)
- Keisuke Ikeda (@ksk1kd)
- Jacob Fletcher (@jacobsfletch)
- conico974 (@conico974)
- Femi Oladipo (@femioladipo)
- Anyu Jiang (@anyuj)
- Elliot DeNolf (@denolfe)
- ch-jwoo (@ch-jwoo)
v3.38.0 (2025-05-15)
🚀 Features
- add latvian language support (#12363) (77bb7e3)
- allow group fields to have an optional name (#12318) (e258cd7)
- prevent query preset lockout (#12322) (9779cf7)
- thread overrideAccess through field validations (#12399) (7130834)
- plugin-multi-tenant: prompt the user to confirm the change of tenant before actually updating (#12382) (faa7794)
- storage-s3: presigned URLs for file downloads (#12307) (800c424)
- ui: fixed toolbar group customization (#12108) (b7b2b39)
- ui: display the actual error message on unpublish if available (#11898) (b3cac75)
🐛 Bug Fixes
- db-mongodb: sort by fields in relationships with
draft: true(#12387) (fd67d46) - db-mongodb: localized dates being returned as date objects instead of strings (#12354) (c43891b)
- db-postgres: build
nearsort query properly for point fields (#12240) (58fc2f9) - db-postgres:
dbNamein arrays regression with long generated drizzle relation names (#12237) (5fce501) - db-postgres: v2-v3 migration errors with relation already exists (#12310) (3edfd7c)
- db-postgres: ensure module augmentation for generated schema is picked up correctly in turborepo (#12312) (98283ca)
- db-postgres: selectDistinct might remove expected rows when querying with nested fields or relations (#12365) (8219c04)
- drizzle: improve db push schema comparison (#12193) (7266225)
- next: tells webpack not to bundle the require-in-the-middle pkg (#12417) (7498d09)
- plugin-cloud: ensure scheduled publishing works if no custom jobs are defined (#12410) (d63c8ba)
- richtext-lexical: newTab not being able to be checked to true by default (#12389) (3e7db30)
- ui: respect
filterOptions: { id: { in: [] } }(#12408) (8ebadd4) - ui: passes value to server component args (#12352) (d9c0c43)
⚡ Performance
- remove duplicative deep loops during field sanitization (#12402) (93d79b9)
- actually debounce rich text editor field value updates to only process latest state (#12086) (1d5d96d)
📚 Documentation
- remove link to outdated ecommerce template from stripe plugin docs (#12353) (cd45574)
- add local api instructions for vercel content link (#12385) (a9cc747)
- add pagination and limit: 0 information in pagination for API docs (#12243) (05ae957)
📝 Templates
- fix categories search sync (#12359) (3701de5)
- add eslint ignore rule for '.next/' (#12332) (09f15ff)
- fix Media component failing when setting a custom serverURL (#12214) (1869377)
🏡 Chores
- add NODE_OPTIONS to vscode settings by default in the repo for playwright extension (#12390) (e93d0ba)
- add no-frozen-lockfile flag for templates script (#12394) (735d699)
- bump node version in monorepo and add new flag for node 23.6+ (#12328) (021932c)
- plugin-stripe: enable TypeScript strict (#12303) (edeb381)
🤝 Contributors
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Jarrod Flesch (@JarrodMFlesch)
- Dan Ribbens (@DanRibbens)
- Dmitrijs Trifonovs (@dt-globelaxy)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Ruslan (@ruslan-amboss)
- Philipp Schneider (@philipp-tailor)
- Anyu Jiang (@anyuj)
- Jessica Rynkar (@jessrynkar)
- Germán Jabloñski (@GermanJablo)
- Rot4tion (@Rot4tion)
- jeepman32 (@jeepman32)
- Tobias Odendahl (@tak-amboss)
v3.37.0 (2025-05-05)
🚀 Features
- exports additional login helper utils (#12309) (dcd4e37)
- live-preview: expose requestHandler to subscribe.ts (#10947) (35c0404)
- ui: update RelationshipFilter if only filterOptions are changed (#11985) (446938b)
- ui: add document link to drawer (#12036) (292b462)
- ui: add option to open related documents in a new tab (#11939) (1ef1c55)
- ui: make select and relationship field placeholder configurable (#12253) (e568391)
- ui: allow array fields to be filtered in list view (#11925) (78d3af7)
🐛 Bug Fixes
- allow custom admin user collection in query presets constraints (#12202) (b9868c4)
- cpa: overwrites existing env variables (#10636) (e5b28c9)
- db-*: migration batch not incrementing past 1 (#12215) (3c9ee5d)
- db-postgres: start transaction in v2-v3 migration only after drizzle prompts to avoid timeout (#12302) (2628b43)
- graphql:
nextPageandprevPageare non nullable even though they can benullsometimes (#12201) (3fb81ef) - graphql: population of joins that target relationship fields that have
relationToas an array (#12289) (c08c707) - plugin-cloud-storage: missing 'prefix' in cloud storage plugin (#11970) (0d10f43)
- plugin-multi-tenant: make tenant selector respect order if orderable enabled for tenant collection (#12314) (a6d76d6)
- richtext-lexical: add missing line-breaks to plaintext conversion (#11951) (ddf40d5)
- ui: unable to search for nested fields in WhereBuilder field selection (#11986) (3818634)
- ui: blockType ignored when merging server form state (#12207) (a62cdc8)
- ui: fix version list status for unpublished documents (#11983) (b6b02ac)
📚 Documentation
- fix typo in fields/relationship.mdx (#12306) (055a263)
- repair blank template markdown link in installation docs (#12297) (5365d4f)
🏡 Chores
- live-preview: enable TypeScript strict (live-preview-vue) (#12299) (b480f81)
- live-preview-react: enable TypeScript strict (#12298) (11018eb)
- storage-uploadthing: enable TypeScript strict (#12304) (d7d3744)
🤝 Contributors
- Ruslan (@ruslan-amboss)
- Anyu Jiang (@anyuj)
- Florian Beeres (@cideM)
- James Mikrut (@jmikrut)
- Tobias Odendahl (@tak-amboss)
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Germán Jabloñski (@GermanJablo)
- Bamsi (@francescoamici)
- Philipp Schneider (@philipp-tailor)
- qoheleth-tech (@qoheleth-tech)
- Samuel Gabriel (@sam-gab)
- Jessica Rynkar (@jessrynkar)
- Janus Reith (@janus-reith)
v3.36.1 (2025-04-30)
🐛 Bug Fixes
- duplicate with orderable (#12274) (710fe09)
- virtual relationship fields with
select(#12266) (564fdb0) - update email regex to support special characters (#12181) (8fee016)
- db-postgres:
countcrashes when query contains subqueries and doesn't return any rows (#12273) (4a56597) - plugin-import-export: csv export column order (#12258) (47a1eee)
- richtext-lexical: ensure state is up-to-date on inline-block restore (#12128) (1b17df9)
⚡ Performance
- optimize file access promises (#12275) (6133a1d)
- db-postgres: skip pagination overhead if
limit: 0is passed (#12261) (27d644f)
🤝 Contributors
- Dan Ribbens (@DanRibbens)
- Sasha (@r1tsuu)
- Mattias Grenhall (@grenhall)
- Tobias Odendahl (@tak-amboss)
v3.36.0 (2025-04-29)
🚀 Features
- add
beforeDocumentControlsslot to allow custom component injection next to document controls (#12104) (d553069) - add
showSaveDraftButtonoption to show draft button with autosave enabled (#12150) (34ea6ec)
🐛 Bug Fixes
- user validation error inside the forgotPassword operation in the cases where user had localised fields (#12034) (c85fb80)
- db-mongodb: fallback
versionwhen not selected (#12158) (6dc61ae) - db-postgres: sort by distance when the
nearoperator is used (#12185) (9955818) - examples: incorrect documentation links for Live Preview example (#12233) (ab03f4f)
- next: pg-cloudflare build issue (#12242) (2157450)
- plugin-search: delete does not also delete the search doc (#12148) (df7a369)
- richtext-lexical: prevent extra paragraph when inserting blocks or uploadNodes. Add preemptive selection normalization (#12077) (5492542)
- richtext-lexical: allow to indent and outdent if at least one selected node allows it (#12182) (9b1dd2a)
- richtext-lexical: reset indent on node transforms (#12183) (2c20051)
- ui: copyToLocale should not pass any id's to avoid duplicates (#11887) (34ead72)
- ui: relationship using list drawer correctly updates when hasMany is true (#12176) (5bd852c)
- ui: reflect default sort in join tables (#12084) (b750ba4)
⚡ Performance
- optimize virtual fields that reference ID (#12159) (fdff587)
- graphql: skip count query for join field using simple pagination (#12223) (6b83086)
- plugin-nested-docs: remove extra find call (#12224) (2f21d46)
- plugin-search: reduce query depth in hooks (#12225) (caae598)
- ui: only select necessary data for relationship options (#12251) (9948040)
🛠 Refactors
📚 Documentation
- adds warning about handling different environments with migrations (#12249) (b7ae4ee)
- fix query preset config link (#12156) (034a267)
- virtual fields linking with relationship fields (#12145) (d91478c)
🤝 Contributors
- Germán Jabloñski (@GermanJablo)
- Tobias Odendahl (@tak-amboss)
- Jessica Rynkar (@jessrynkar)
- Bjørn Nyborg (@Bjornnyborg)
- Dan Ribbens (@DanRibbens)
- Sam Wheeler (@swheeler7)
- Adrian Maj (@AdrianMaj)
- Tylan Davis (@tylandavis)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Silas Krause (@krsilas)
- Sasha (@r1tsuu)
- Corey Larson (@coreyleelarson)
- Patrik (@PatrikKozak)
v3.35.0 (2025-04-16)
🚀 Features
- queriable / sortable /
useAsTitlevirtual fields linked with a relationship field (#11805) (1c99f46) - threads operation through field condition function (#12132) (c877b1a)
- adds and exports reusable auth server functions (#11900) (6b34937)
- db-postgres: dependency inject pg to allow Sentry instrumentation (#11478) (da7be35)
- ui: add option for rendering the relationship field as list drawer (#11553) (55d00e2)
- ui: use defaultDepth in API view (#11950) (b354d00)
🐛 Bug Fixes
- respects boolean query preset constraints (#12124) (a675c04)
- ensures cors headers are run against custom endpoints (#12091) (e79b203)
- reordering draft documents causes data loss (#12109) (e90ff72)
- correct typo in error message and remove console.log (#12082) (a9eca3a)
- db-postgres: use correct export path for codegen in
createSchemaGenerator(#12043) (71e3c78) - db-sqlite: text field converts to floating point number (#12107) (6572bf4)
- richtext-lexical: allow to indent children even if their parents are not indentable (#12042) (babf4f9)
- templates: missing default value in select field (#11715) (5b554e5)
- translations: add missing Catalan translations (#10682) (85e6edf)
- ui: stale paths on custom components within rows (#11973) (21599b8)
- ui: issue with schedule publish disappearing on autosave collections (#12078) (3a7cd71)
- ui: use route.api from config in OrderableTable (#12081) (3287f70)
⚡ Performance
📚 Documentation
- fix syntax issue in blocks field (#11855) (b9832f4)
- minor formatting tweaks to server function examples (#12102) (c661d33)
🏡 Chores
- adjusts ChevronIcon styling to match other icons (#12133) (2362899)
- assign available port to env variable in dev suite (#12092) (39462bc)
- separate Lexical tests into dedicated suite (#12047) (a66f90e)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Philipp Schneider (@philipp-tailor)
- Tylan Davis (@tylandavis)
- Kristian Djaković (@kristian240)
- Jacob Fletcher (@jacobsfletch)
- James Mikrut (@jmikrut)
- Dan Ribbens (@DanRibbens)
- Tobias Odendahl (@tak-amboss)
- Adler Weber (@adlrwbr)
- Sam Wheeler (@swheeler7)
- AoiYamada (@AoiYamada)
- Edgar Guerra (@edguerrade)
- Jessica Chowdhury (@JessChowdhury)
- Paul (@paulpopus)
- Slava Nossar (@slavanossar)
- Corey Larson (@coreyleelarson)
- alexrah (@alexrah)
- Germán Jabloñski (@GermanJablo)
v3.34.0 (2025-04-10)
🚀 Features
- support
wherequerying by join fields (#12075) (466dcd7) - add support for time format config on scheduled publish (#12073) (eab9770)
🐛 Bug Fixes
- cannot define a join field when the target relationship is nested to a second or higher tab (#12041) (7aa3c5e)
- image previews getting stuck in list view when paginating (#12062) (a0fb335)
- array minRow validation should not show when non-required with no rows (#12037) (f079ece)
- querying by polymorphic join field
relationTowithoverrideAccess: false(#11999) (b9ffbc6) - db-postgres: long array field table aliases cause error even when
dbNameis used (#11995) (09782be) - richtext-lexical: diff component css was not included in css bundle (#12028) (f1d9b44)
- ui: ensure
filefield is only serialized at top-level for upload-enabled collections (#12074) (112e081) - ui: form state race conditions (#12026) (4d7c1d4)
- ui: adds multi select inputs for text fields in where builder (#12054) (18ff9cb)
- ui: orderable table rendering (#12066) (9853f27)
- ui: adds multi select inputs for number fields in where builder (#12053) (09916ad)
- ui: resets value in where builder when operator changes (#11136) (ec34e64)
- ui: upload edits handling for bulk uploads (#12001) (c7b14bd)
- ui: prefer adminThumbnail even if file is non-image (#11948) (7721025)
⚡ Performance
📚 Documentation
- formatting tweaks for local api docs (#12064) (a90ae9d)
- adjust formatting on Local API - Server Functions documentation (#12058) (d19412f)
- adds server function and access control sections to local API docs (#11902) (b809c98)
- clarify file upload example with
_payload& field explanation (#12025) (83319be) - fix and normalize links (#11993) (e109491)
- fix a typo (#12012) (dee9abd)
- fix markdown link (#12000) (5c54d9a)
🧪 Tests
📝 Templates
- update readme on blank template and blank template variations for Vercel (#12070) (3523c2c)
- bump for v3.33.0 (#12003) (6d83147)
⚙️ CI
🏡 Chores
- run
dev:generate-types(#11994) (97e2e77) - add logging templates script and fix engines for pnpm v10 (#12021) (b270901)
- deps: bump image-size to 2.0.2 version (#12063) (37bfc63)
- deps: bump next.js to 15.3.0 and related dependencies (#12067) (e0046bb)
- deps: bump image-size package for security update (#12040) (acae547)
- plugin-seo: enable TypeScript strict (#11933) (a72fa86)
🤝 Contributors
- Sasha (@r1tsuu)
- Germán Jabloñski (@GermanJablo)
- Paul (@paulpopus)
- Patrik (@PatrikKozak)
- Jacob Fletcher (@jacobsfletch)
- Jessica Chowdhury (@JessChowdhury)
- Philipp Schneider (@philipp-tailor)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
- Tylan Davis (@tylandavis)
- Said Akhrarov (@akhrarovsaid)
- Elliot DeNolf (@denolfe)
- Omar (@oasaleh)
- zy1p (@zy1p)
v3.33.0 (2025-04-04)
🚀 Features
- drizzle: export buildQuery and parseParams (#11935) (f34eb22)
- graphql: improve non-nullability in query result types (#11952) (018bdad)
- next: improved lexical richText diffing in version view (#11760) (d29bdfc)
- storage-uploadthing: configurable upload router input config (#11954) (f9c73ad)
- ui: use drag overlay in orderable table (#11959) (816fb28)
🐛 Bug Fixes
- postgres null value breaks orderable hook (#11997) (9adbbde)
- allow custom
passwordfield when usingdisableLocalStrategy: true(#11893) (8ad22eb) ValidationErrorerror message whenlabelis a function (#11904) (dc793d1)- do not append
docinput for scheduled publish job if it's enabled only for globals (#11892) (760cfad) - db-mongodb: querying relationships with where clause as an object with several conditions (#11953) (857e984)
- db-postgres:
deleteOnefails when thewherequery does not resolve to any document (#11632) (4ebd3ce) - db-postgres: down migration fails because
migrationTableExistsdoesn't check in the current transaction (#11910) (f310c90) - graphql: respect
draft: truewhen querying joins (#11869) (e5690fc) - storage-uploadthing: pass
clientUploads.routerInputConfigto the handler (#11962) (8e93ad8) - ui: optimistic rows disappear while form state requests are pending (#11961) (8880d70)
⚡ Performance
- ui: significantly optimize form state component rendering, up to 96% smaller and 75% faster (#11946) (e87521a)
📚 Documentation
- fix invalid markdown (#11996) (f7ed8e9)
- add missing comma (#11976) (e6aad5a)
- fix variable names for lexical markdown conversion (#11963) (06d937e)
📝 Templates
🏡 Chores
- fix flake (fae113b)
- plugin-cloud-storage: enable TypeScript strict (#11850) (d47b753)
- plugin-form-builder: enable TypeScript strict (#11929) (a58ff57)
- plugin-nested-docs: enable TypeScript strict (#11930) (fd42ad5)
- plugin-redirects: enable TypeScript strict (#11931) (6c735ef)
- richtext-lexical: add DebugJsxConverterFeature (#10856) (308cb64)
🤝 Contributors
- Dan Ribbens (@DanRibbens)
- Sasha (@r1tsuu)
- Paul (@paulpopus)
- Alessio Gravili (@AlessioGr)
- Tony Tkachenko (@tonytkachenko)
- James (@jmikrut)
- Jacob Fletcher (@jacobsfletch)
- reiv (@reiv)
- Said Akhrarov (@akhrarovsaid)
- Germán Jabloñski (@GermanJablo)
v3.32.0 (2025-04-01)
🚀 Features
- orderable collections (#11452) (d963e6a)
- configurable job queue processing order (LIFO/FIFO), allow sequential execution of jobs (#11897) (c844b4c)
- change version view
modifiedOnlydefault totrue(#11794) (21f7ba7) - db-*: return database name to unsanitized config (#11913) (a083d47)
- db-*: export types from main export (#11914) (a6f7ef8)
🐛 Bug Fixes
- typescriptSchema override required to false (#11941) (968a066)
- support parallel job queue tasks (#11917) (9a1c3cf)
- next: block encoded and escaped open redirects in getSafeRedirect (#11907) (96289bf)
- plugin-cloud-storage: ensure client handlers are added to import map regardless of enabled state (#11880) (98e4db0)
- richtext-lexical: incorrectly hidden fields in drawers due to incorrect permissions handling (#11883) (f34cc63)
- translations: improve Swedish translations for query presets (#11937) (5b0e0ab)
- ui: nested fields disappear when manipulating rows in form state (#11906) (373f6d1)
- ui: switching languages does not update cached client config (#11725) (4a0bc86)
- ui: query presets are available for unrelated collections (#11872) (4fc2eec)
- ui: nested custom components sometimes disappear when queued in form state (#11867) (10ac989)
⚡ Performance
- prefer async fs calls (#11918) (d1c0989)
- ui: download only images and optimize image selection for document edit view, prioritize best-fit size (#11844) (5ae5255)
🛠 Refactors
- drizzle: replace query chaining with dynamic query building (#11923) (9c88af4)
- ui: replace autosave queue pattern with useQueues hook (#11884) (62c4e81)
📚 Documentation
- capitalization error (#11912) (af8c786)
- fix invalid react-hooks docs (#11895) (2b6313e)
- correct spelling of "it" (#11889) (b863fd0)
- fix links in custom components and custom features (#11881) (6b56343)
🧪 Tests
📝 Templates
🏡 Chores
- deps: bump mongodb-github-action (#10921) (329cd0b)
- live-preview: enable TypeScript strict (#11840) (6badb5f)
- ui: added selected option as a class to list table cell (#11750) (1578cd2)
🤝 Contributors
- Germán Jabloñski (@GermanJablo)
- Dan Ribbens (@DanRibbens)
- Jacob Fletcher (@jacobsfletch)
- Marcus Forsberg (@marcusforsberg)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Said Akhrarov (@akhrarovsaid)
- Nate Schneider (@nate-at-keen)
- Maxim Seshuk (@maximseshuk)
- Philipp Schneider (@philipp-tailor)
- Pranav (@pranav-vaniya)
- Paul (@paulpopus)
v3.31.0 (2025-03-25)
🚀 Features
Query presets (#11330) (998181b)
Query Presets allow you to save and share filters, columns, and sort orders for your collections. This is useful for reusing common or complex filtering patterns and column configurations across your team. Query Presets are defined on the fly by the users of your app, rather than being hard coded into the Payload Config.
https://github.com/user-attachments/assets/1fe1155e-ae78-4f59-9138-af352762a1d5
🐛 Bug Fixes
- auth fields distrupt field paths within the field schema map (#11861) (74f935b)
- add uuid fallback for non-secure contexts in JSON fields (#11839) (1081b4a)
- next: adds safe redirect utility and apply to login redirects (#11814) (234df54)
- next: version view breaking for deeply nested tabs, rows and collapsibles (#11808) (3c4b3ee)
- plugin-seo: translation correction (#11817) (6174708)
- richtext-lexical: ensure initial state for nested lexical fields (#11837) (fb01b40)
⚡ Performance
- reduce job queue db calls (#11846) (a5c3aa0)
- drizzle: remove unnecessary db.select call in updateOne operation (#11847) (73fc3c6)
🛠 Refactors
🧪 Tests
⚙️ CI
🏡 Chores
- admin-bar: enable TypeScript strict (#11834) (8d374cb)
- db-sqlite: enable TypeScript strict (#11831) (fe9317a)
- db-vercel-postgres: enable TypeScript strict (#11833) (de0aaf6)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Diego Satelier (@SatelierDiego)
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Patrik (@PatrikKozak)
- Germán Jabloñski (@GermanJablo)
v3.30.0 (2025-03-24)
⚠️ Next.js Peer Dependency Bump
This release bumps the peer dependency version of Next.js to 15.2.3 to address a security vulnerability. Next.js Blog post here for more detail. (PR #11823).
NOTE: This vulnerability does not affect any of the functionality of Payload, as the framework does not leverage anything affected in the vulnerability. This would only affect you if you've built additional functionality on top of Payload using additional Next.js middleware.
🚀 Features
- bump minimum next version to 15.2.3 (#11823) (5f6bb92)
- db-mongodb: support sorting by fields in other collections through a relationship field (#11803) (4081953)
- next: add support for custom props on the html element (#11738) (f9f53a6)
🐛 Bug Fixes
- respect
draft: truewhen querying docs for the join field (#11763) (1b2b6a1) - ui: exclude fields lacking permissions from bulk edit (#11776) (7532c4a)
📚 Documentation
- fix afterErrorHook export name in collection hooks (#11821) (d20f06e)
- fix links to locked document docs (#11770) (85db8ff)
- payload proper nouns (#11792) (5f7202b)
🧪 Tests
⚙️ CI
- sanitize breaking section in release notes (b1469ea)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Matthew Crutchfield (@mtcrutch)
- Philipp Schneider (@philipp-tailor)
- Jacob Fletcher (@jacobsfletch)
- Ivica Batinić (@isBatak)
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 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
forceSelectcollection / global config property (#11627) (5e3d07b) - added support for conditional tabs (#8720) (878dc54)
- db-*: support sort in db.updateMany (#11768) (e96d3c8)
- db-*: allow to thread
idto 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&radiofield 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
- mention correct --disable-transpile flag (#11788) (6640b1c)
- updates docs for
useDocumentInfo(#11686) (ff2df62)
🧪 Tests
🏡 Chores
- export type FieldAccessArgs (#11749) (f31e5e6)
- bump prettier, re-enable prettier for docs (#11695) (9f9db3f)
- deps: bump next.js from 15.2.2 to 15.2.3 in monorepo (#11748) (95821c6)
- examples: add locale to revalidatePath in Pages hook (#11775) (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)
v3.28.1 (2025-03-12)
🐛 Bug Fixes
- exclude plugin-cloud-storage, plugin-sentry and plugin-stripe from bundling optimization (#11673) (0fc70e0)
- incorrect height rounding when resizing images with sharp (#11634) (9d6583d)
- incorrect types for field Label, Description and Error server components (#11642) (88eeeaa)
- storage-s3: ensure s3 sockets are cleaned up (#11626) (3f6699f)
- translations: improve Swedish translations (#11654) (7be0219)
- ui: form state infinite render (#11665) (b81358c)
- ui: add RowLabelProvider context for blocks row labels (#11664) (4defa33)
- ui: prevent fieldErrorsToast from showing empty errors list (#11643) (b44603b)
📚 Documentation
🧪 Tests
📝 Templates
🏡 Chores
- fix typo (rename mognoose to mongoose) (#11653) (885f580)
- infer React context providers and prefer use (#11669) (355bd12)
- deps: bump next.js from 15.2.1 to 15.2.2 in monorepo (#11636) (9c53a62)
- plugin-multi-tenant: remove SELECT_ALL constant (#11660) (39d783a)
- release: eslint/3.28.0 (bc79608)
- translations: polish Swedish (#11353) (1da50f5)
🤝 Contributors
- Germán Jabloñski (@GermanJablo)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Patrik (@PatrikKozak)
- Marcus Forsberg (@marcusforsberg)
- Jesper We (@JesperWe)
v3.28.0 (2025-03-11)
Important
Compilation Performance Improvements
We’ve introduced a new opt-in flag that can cut Payload’s compile times in half during development. To enable it, add the following to your next.config.js:
const nextConfig = {
// ...
}
-export default withPayload(nextConfig)
+export default withPayload(nextConfig, { devBundleServerPackages: false })
In some rare cases, you may see unexpected behavior if your project relies on server-only Payload dependencies being bundled during development. Because of this, we’ve made the feature opt-in for existing projects.
Lexical Version Bump
This release upgrades the lexical dependency from 0.21.0 to 0.27.1. Alongside table improvements and bug fixes, this version bump lays the groundwork for frequently requested features like color pickers.
If you installed lexical manually, update it to 0.27.1. 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
- defaults to noindex nofollow (#11623) (5285518)
- threads path through field validate function (#11591) (3ede7ab)
- allow specification of which JWT extraction methods are supported, and in which order (#10794) (8f6d2e7)
- db-mongodb: strip keys from the data that don't exist in the schema from read results (#11558) (2ad035f)
- next: fully expose Next.js metadata (#11593) (397c1f1)
- richtext-lexical: allow disabling indentation for specific nodes (#11631) (eb09ce9)
- richtext-lexical: upgrade lexical from 0.21.0 to 0.27.1 (#11564) (557ac99)
- richtext-lexical: adds ability to disable auto link creation (#11563) (1e708bd)
- richtext-lexical: new HTML converter (#11370) (36921bd)
- ui: form state queues (#11579) (ac1e3cf)
- ui: adds disable copy to locale option to collection config (#11546) (657ad20)
🐛 Bug Fixes
- ensure only authenticated users can access the
payload-locked-documentscollection (#11624) (8f3d1bd) - upload imageSizes forces original file uploads to be compressed (#11612) (6d0924e)
- add missing auth property to new defaults function (#11561) (3af0468)
- db-mongodb: properly sanitize
updateVersionread result (#11589) (e9afb36) - graphql: sanitize graphql field names for schema generation (#11556) (029cac3)
- plugin-import-export: plugin breaks
i18nconfiguration (#11590) (5d65cb0) - translations: update translation placeholders to not be translated for lithuanian (#11622) (85f88a0)
- ui: adds fallback locale when defaultLocale is unavailable (#11614) (9ac7a3e)
- ui: stale list thumbnails when navigating (#11609) (fc5876a)
- ui: logic for showing copyToLocale button and adds test (#11584) (a53876d)
- ui: upload.displayPreview should affect all previews in the admin panel (#11496) (6f90d62)
- ui: apply consistent styling to custom & default block thumbnails (#11555) (8378654)
- ui: incorrect error states (#11574) (4811531)
⚡ Performance
- 50% faster compilation speed by skipping bundling of server-only packages during dev (#11594) (c7bb694)
🛠 Refactors
📚 Documentation
- fix documentation about custom i18n types (#11386) (38f61e9)
- document
payload migrate:createflags (#11592) (3de1636)
📝 Templates
- fix issue with populateAuthors hook breaking live-preview on website template (#11608) (72efc84)
- allow displaying dynamic error message on forms created via Form Builder plugin (#11275) (814ced4)
⚙️ CI
- adjust paths filter for workflows, only look at main.yml (#11572) (9f7e8f4)
- add canary nightly cron, adjust lock and stale crons (259ea6a)
- use GITHUB_OUTPUT instead of set-output [skip ci] (1ad1de7)
- canary and internal releases [skip ci] (#11565) (1797782)
🏡 Chores
- set all licenses for internal tooling (30af889)
- db-postgres: enable TypeScript strict (#11560) (c8f01e3)
- deps: bump all eslint packages (#11629) (f2da72b)
- deps: bump next.js from 15.2.0 to 15.2.1 in monorepo (#11576) (b0da85d)
- deps: bumps @payloadcms/admin-bar in templates and examples (#11566) (7cef890)
- ui: code/json field full height should include any padding added (#11607) (051c1fe)
- ui: removes margin when row is empty and passes style from props (#11504) (6699844)
🤝 Contributors
- Germán Jabloñski (@GermanJablo)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Rokas Puzonas (@RokasPuzonas)
- Jessica Chowdhury (@JessChowdhury)
- Dan Ribbens (@DanRibbens)
- Jarrod Flesch (@JarrodMFlesch)
- Paul (@paulpopus)
- Sasha (@r1tsuu)
- Md. Tajmirul Islam Akhand (@Tajmirul)
- Elliot DeNolf (@denolfe)
- James Mikrut (@jmikrut)
v3.27.0 (2025-03-05)
🚀 Features
- payload admin bar (#3684) (9724067)
- allow hiding the blockName field visible in blocks' headers via admin.disableBlockName (#11301) (143b6e3)
- threads path through field condition functions (#11528) (ba30d76)
- compound indexes (#11512) (bacc0f0)
- allows overriding import map location (#11532) (f01cfbc)
- plugin-import-export initial work (#10795) (4f822a4)
- ui: improves field error toast messages (#11521) (2163b0f)
🐛 Bug Fixes
- safe auth strategy execution (#11515) (312aa63)
- beforeValidate deleting value when access returns false (#11549) (6939a83)
- collection config deep merge during sanitization causing unpredictable behavior (#11524) (5adb764)
- format admin url inside forgot pw email (#11509) (56dec13)
- next: admin panel fails compiling when fullySpecified is set in next config (#11531) (cc05937)
- richtext-lexical: fix bug in $createAutoLinkNode when the link is preceded by a textnode (#11551) (4ebe673)
- storage-*: client uploads with
disablePayloadAccessControl: true(#11530) (5cc0e74) - storage-gcs: client uploads are enabled even if
clientUploadsis not set (#11527) (e36ab6a) - ui: views rendered in drawers can update step nav (#11548) (04b0468)
- ui: execute client upload handler only when file exists (#11538) (31e2179)
📚 Documentation
🧪 Tests
⚙️ CI
🏡 Chores
- cleanup generated configs (#11536) (8f203bb)
- indexes are not iterable, corrects
indexesdefault value sanitization (#11534) (f0ea918) - add plugin-import-export to publishList release tool (#11535) (672dace)
🤝 Contributors
- Sasha (@r1tsuu)
- Jarrod Flesch (@JarrodMFlesch)
- Jacob Fletcher (@jacobsfletch)
- Paul (@paulpopus)
- Germán Jabloñski (@GermanJablo)
- Said Akhrarov (@akhrarovsaid)
- Patrik (@PatrikKozak)
- Dan Ribbens (@DanRibbens)
- Alessio Gravili (@AlessioGr)
- Elliot DeNolf (@denolfe)
v3.26.0 (2025-03-04)
🚀 Features
- ability to cancel jobs (#11409) (38131ed)
- maintains column state in url (#11387) (3709950)
- db-*: support limit in db.updateMany (#11488) (6a3d58b)
- db-*: add updateMany method to database adapter (#11441) (41c7413)
- richtext-lexical: add htmlToLexical helper (#11479) (cd29978)
- richtext-lexical: add editorConfigFactory helper to streamline getting the editor config (#11467) (e1b3084)
- ui: close the nav when the user navigates away on small screens (#10932) (9bb89b7)
🐛 Bug Fixes
- avif images not converting to
upload.formatOptionsset file types (#11505) (c417e3a) - excludes index files from migration files filtering (#10722) (c828e33)
- response headers from authstrategies are now merged together, even if no user was returned (#10883) (45a7c8b)
- ensures req.origin includes port on localhost (#11454) (a65289c)
- ensure errors returned from tasks are properly logged (#11443) (d53f166)
- incorrect value inside beforeValidate field hooks (#11433) (b3e7a9d)
- examples: ensure working multi-tenant example with pg (#11501) (4ddf965)
- examples: replace depreciated 'mergeHeaders' import in the MultiTenant example (#11306) (48e613b)
- next: incorrect active state for partial matches of collection names in sidebar (#11511) (7d2480a)
- next: active nav item not clickable in edit view (#11457) (83b4548)
- next: properly instantiates req.url on localhost (#11455) (67c4a20)
- next: email verification not working due to incorrect token url parsing (#11439) (f3844ee)
- next: disables active nav item (#11434) (c4bc0ae)
- plugin-multi-tenant: scope access constraint to admin collection (#11430) (9c25e7b)
- richtext-lexical: ensure nested forms do not use form element (#11462) (6d8aca5)
- storage-*: ensure client handler is always added to the import map, even if the plugin is disabled (#11438) (dfddee2)
- storage-s3, storage-azure, storage-gcs: client uploads when a collection has
prefixconfigured (#11436) (fc42c40) - storage-uploadthing: files are duplicated to the storage via client uploads (#11518) (f143d25)
- templates: handle enableLink condition safely (#10728) (f7f5651)
- ui: uses query provider as single source of truth for where builder (#11476) (927078c)
- ui: remove stale thumbnails in bulkUpload after partial success (#10651) (e75d38c)
- ui: bulk editing users throws client-side exception (#11461) (6cbda9e)
- ui: scope rah-static and progress-bar styles to payload-default layer (#11442) (bef98c8)
- ui: use full image url for upload previews instead of thumbnail url (#11435) (96d1d90)
- ui: locale selector in versions view should remove filtered locales (#11447) (9e97319)
- ui: copyToLocale should not pass id in data, throws error in postgres (#11402) (428c133)
- ui: duplicate basePath in Logout Button Link (#11432) (f7b1cd9)
- ui: disable publish button if form is autosaving (#11343) (7118b64)
⚡ Performance
- automatically add index on a relationship field when used as target for a join field (#11463) (90d3c65)
- disable returning of db operations that don't need the return value (#11437) (6ce5e8b)
- db-*: add option to disable returning modified documents in db methods (#11393) (c21dac1)
- db-mongodb: faster join field aggregation by replacing
mongoose-aggregate-paginate-v2with a custom implementation (#10936) (d4d2bf4) - next: reduce initReq calls from 3 to 1 per page load (#11312) (c8c578f)
📚 Documentation
- clarify that image resizing/cropping require
sharpto be specified in payload config (#11470) (d57a786) - fix documentation "CheckListFeature" (#11480) (b9108b4)
- add few notes about DocumentDB and Azure Cosmos DB (#11336) (25e8799)
- fix method useAllFormFields on admin/hooks.mdx (#10935) (8b5bc3d)
- use local API to upload a local file (#10839) (19b4ec2)
- adds info and example for headersWithCors (#11141) (77395b6)
- custom auth strategy requires the collection slug in return value (#11327) (fcaf591)
- broken ' char entity instead of ' in plugins/build-your-own (#11363) (206b4b9)
- replace HTML entity ' with literal apostrophe (#11321) (8b55e7b)
📝 Templates
- fix vercel website template importmap error caused by missing import (#11500) (562acb7)
- bump payload versions, upgrade next.js to 15.2.0, fix eslint errors (#11486) (f03d450)
- improve naming of richtext component import, add 'payload-richtext' classname (#11485) (398d48a)
⚙️ CI
- change custom github actions target back to es5 (fd1a4f6)
- clarify version reporting in issue templates (#11498) (a15c38f)
- repro guide to use
create-payload-app@latestinstead of@beta(#11451) (e055565)
🏡 Chores
- add docker volume directories to gitignore (#10902) (fa8a2f8)
- temporarily disables flaky "should execute a custom script" test (#11487) (1929644)
- db-mongodb: tsconfig uses
strict: trueandnoUncheckedIndexedAccess: true(#11444) (79a7b4a) - deps: bumps payload-admin-bar to v1.0.7 to suppress react 19 warnings (#11499) (bf4fa59)
- eslint: speed up no-imports-from-self rule by ensuring cache is used (#11483) (3774544)
- examples: update multi-tenant example (#11459) (81e8a9d)
- plugin-search: enable TypeScript strict mode (#11508) (efce154)
- richtext-lexical: export LexicalFieldAdminProps (#11464) (dda17f0)
- richtext-lexical: improve UploadData jsdocs (#11292) (4a1b749)
- translations: enable TypeScript strict mode (#11494) (a3fe607)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Germán Jabloñski (@GermanJablo)
- Ondřej Nývlt (@onvlt)
- Jarrod Flesch (@JarrodMFlesch)
- Paul (@paulpopus)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Vincent Vu (@rubixvi)
- Alessio Gravili (@AlessioGr)
- Dmitrii Kuzmin (@ApplY3D)
- Said Akhrarov (@akhrarovsaid)
- Michael Bykovski (@bykof)
- Mike Newberry (@MikeNewXYZ)
- nomad-dev (@n0mad-d3v)
- Liège Arthur (@Thisisjuke)
- Violet Rosenzweig (@6TELOIV)
- Adrian Maj (@AdrianMaj)
- Jessica Chowdhury (@JessChowdhury)
- Martijn Luyckx (@martijnckx)
- Roy Barber (@roybarber)
- Philipp Meyer (@Quppi)
v3.25.0 (2025-02-27)
🚀 Features
- storage-*: large file uploads on Vercel (#11382) (b540da5)
- allow to count related docs for join fields (#11395) (3436fb1)
- add support for not_like operation (#11326) (b014416)
- plugin-multi-tenant: allow customization of selector label (#11418) (958e195)
- plugin-multi-tenant: filter users list and tenants lists (#11417) (45cee23)
- plugin-multi-tenant: export useTenantSelection hook for public usage (#11364) (f477e0e)
- richtext-lexical: allows client features to access components added to the import map by the server feature (#11414) (7e713a4)
- richtext-lexical: support single-quoted jsx property values in mdx converter (#11290) (563c21b)
- ui: threads row data through list drawer onSelect callback (#11339) (d766b19)
- ui: adds support for block groups (#11239) (22f61ad)
🐛 Bug Fixes
- ensure custom IDs are returned to the result when
selectquery exists (#11400) (526e535) - ensure generated types for config.blocks are not undefined if no blocks defined (#11377) (820a6ec)
- safely access config.blocks during type generation (#11320) (3ffc268)
- working
binconfiguration for custom scripts (#11294) (f779e48) - db transaction errors caused by checkDocumentLockStatus (#11287) (9728d80)
- db-mongodb:
hasNextPagewith polymorphic joins (#11394) (6b6c289) - deps: ensure Next.js 15.2.0 compatibility, upgrade nextjs and @types/react versions in monorepo (#11419) (2a3682f)
- next: nested relationship filter options (#11375) (0a1af45)
- next: use correct hmr url if assetPrefix is set in next config (#10859) (1725af5)
- next: uses assetPrefix from next config in webpack-hmr URL (#11229) (26163a7)
- plugin-multi-tenant: user access, thread field names through (#11365) (3778180)
- plugin-nested-docs: fallback to empty string if
useAsTitlefield is undefined (#11338) (09ca514) - plugin-nested-docs: corrects data shape of breadcrumbs returned in hooks (#10866) (d92c000)
- richtext-lexical: incorrect UploadData types (#11288) (2612756)
- ui: skip bulk upload thumbnail generation on non-image files (#11378) (81fd42e)
- ui: allow json fields to be updated externally (#11371) (36e152d)
- ui: bulk upload
DiscardWithoutSavingmodal styles (#11381) (7bb1c9d) - ui: object type field labels not displaying in search filter (#11366) (f1b005c)
- ui: custom block labels stale when reordering blocks (#11367) (2477fc6)
- ui: link element triggering clicks twice (#11362) (f9121c1)
- ui: only show bulk select all when count is less than total (#11329) (a8bec9a)
- ui: confirmation modal should build off of drawerDepth, instead … (#11305) (460d50b)
⚡ Performance
- remove deep copy of the entire sanitized entity config in
configToJSONSchema(#11342) (a13d4fe) - add limit: 1 and pagination: false to various payload queries (#11319) (0058f82)
- ensure fetching and updating preferences doesn't cause transaction errors and is done correctly (#11311) (845c647)
- db-mongodb: remove
JSON.parse(JSON.stringify)copying of results (#11293) (1dc748d) - drizzle: use faster, direct db query for getting id to update in updateOne (#11391) (e4712a8)
- next: reduce getNavPrefs calls from 3 to 1 per page load (#11318) (c7c5018)
- next: avoid unnecessary upsertPreferences call on page load (#11302) (76bd05c)
🛠 Refactors
- simplify collection, global and auth operations (#11374) (4410a49)
- simplify running field hooks (#11372) (dc9e8fa)
- ui: moves bulk edit controls (#11332) (f31568c)
📚 Documentation
- adds Reserved Field Names section to migration guide (#11308) (bcc6857)
- improve lexical code block documentation (#11416) (67b7a73)
- add lexical docs for configuring jsx converters for internal links and overriding them (#11415) (88a2841)
- add info about changes in localized fields to v2 -> v3 migration guide (#11244) (d326086)
- fix links to react hooks (#11344) (4224c68)
- update outdated docs/rich-text/overview feature names (#11324) (6ff380c)
- fix formatting in field hooks table (#11300) (af92c15)
- removes outdated
rateLimitoption (#11291) (c517e7e) - fix invalid jsx in banner block (#11289) (b1e9aa5)
🧪 Tests
📝 Templates
⚙️ CI
🏡 Chores
- cleanup queues test suite (#11410) (c6ab312)
- add JSDoc for globals Local API operations (#11313) (0594701)
- cut down logging noise when file was not found on the disk (#11295) (f6f6a1d)
- add JSDoc for collection Local API operations properties (#11265) (ee5e96a)
- passes allowCreate into list drawer and adds test (#11284) (c05f10a)
- plugin-cloud: refresh session on ExpiredToken error code (#8904) (1e698c2)
- translations: adds missing client keys and removes translated validation errors (#10841) (6fad5d7)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Jacob Fletcher (@jacobsfletch)
- Alessio Gravili (@AlessioGr)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Kendell Joseph (@kendelljoseph)
- Jessica Chowdhury (@JessChowdhury)
- Rafal Sypien (@inuue)
- Paul (@paulpopus)
- Tib (@T1l3)
- Said Akhrarov (@akhrarovsaid)
- Boyan Bratvanov (@bratvanov)
v3.24.0 (2025-02-19)
🚀 Features
- add support for interfaceName on radio and select fields to create reusable top level types (#11277) (acead10)
- join field across many collections (#10919) (6d36a28)
- add
pagequery parameter forjoins(#10998) (847d8d8) - view component types (#11126) (b80010b)
- route transitions (#9275) (3f550bc)
- add siblingFields arg to field hooks (#11117) (155f9f8)
- richtext-lexical: export INSERT_BLOCK_COMMAND and INSERT_INLINE_BLOCK_COMMAND (#11193) (dc36572)
- translations: add support for lithuanian (#11243) (8bbe7bc)
- ui: enable specific css selectors on the localizer per locale (80b33ad)
- ui: confirmation modal (#11271) (bd8ced1)
- ui: adds admin.components.listMenuItems option (#11230) (8a2b712)
- ui: add
hideFileInputOnCreateandhideRemoveFileto collectionuploadconfig (#11217) (daaaa5f) - ui: refines progress bar animation curve (#11167) (16d75a7)
🐛 Bug Fixes
- versions not loading properly (#11256) (0651ae0)
- db transaction errors caused by checkDocumentLockStatus (#11273) (9b8f8d7)
- localized fields within block references were not handled properly if any parent is localized (#11207) (e6fea1d)
- upload and auth endpoints are mounted for all collections (#11231) (749962a)
- populate is ignored for nested relationships (#11227) (938472b)
- ensure leavesFirst option works correctly in traverseFields utility (#11219) (6b9d81a)
- join field does not show validation error (#11170) (dd28959)
- db-mongodb: properly handle document notfound cases for update and delete operations (#11267) (7922d66)
- db-mongodb: remove duplicative indexing of timestamps (#11028) (12f51ba)
- db-postgres: querying other collections via relationships inside blocks (#11255) (88548fc)
- db-postgres: ensure
countDistinctworks correctly and achieve better performance when the query has table joins (#11208) (513ba63) - next: imports toast from @payloadcms/ui (#11279) (cd48904)
- next: document header padding on tablet sized screens (#11192) (70db44f)
- next: pre-flight OPTIONS request errors from the graphql endpoint (#11103) (ececa65)
- plugin-multi-tenant: corrects default value for tenantsArrayTenantFieldName (#11189) (b65ae07)
- plugin-seo: add missing supported languages (#11254) (74ce889)
- richtext-lexical: add container div to table element to allow horizontal scroll in HTML and JSX converters (#11119) (9068bda)
- richtext-lexical: reliably install exact lexical version by removing it from peerDeps (#11122) (2056e9b)
- richtext-lexical: unindent button in toolbar is never active (#11089) (7a400a7)
- ui: minor issues with tabs and publish buttons when in RTL (#11282) (e83318b)
- ui: turbopack with the latest next.js canary [skip lint] (#11280) (009e908)
- ui: disabledLocalStrategy.enableFields missing email/username fields (#11232) (9fc1cd0)
- ui: unsaved changes allows for scheduled publish missing changes (#11001) (618624e)
- ui: timezone issue related to date only fields in Pacific timezones (#11203) (8b0ae90)
- ui: database errors when running autosave and ensure autosave doesn't run unnecessarily (#11270) (1328522)
- ui: do not pass req in handleFormStateLocking (#11269) (7f5aaad)
- ui: issues with prevent leave and autosave when the form is submitted but invalid (#11233) (06debf5)
- ui: allow selectinputs to reset to their initial values if theres no provided value (#11252) (1c4eba4)
- ui: selection status not updating after toggleAll in useSelection hook (#11218) (5817b81)
- ui: properly handle singular and plural bulk edit labels (#11198) (779f511)
- ui: hide edit button on deleted relationship options (#11005) (cba5c7b)
- ui: respect locale in buildTableState (#11147) (077fb3a)
- ui: hide array field "add" button if
admin.readOnly: trueis set (#11184) (b1734b0) - ui: unable to use browser back navigation after visiting list view (#11172) (0a3820a)
- ui: url encode imageCacheTag for media on dashboard (#11164) (d47c980)
- ui: json schema (#11123) (7f124cf)
- ui: prevent omitting fileSize from non-images (#11146) (6901b26)
- ui: adds delay to progress bar for fast networks (#11157) (de68ef4)
- ui: safe call within useEffect teardown (#11135) (30c77d8)
- ui: relationship filterOptions not applied within the list view (#11008) (2a0094d)
⚡ Performance
- optimize permissions calculation with lots of blocks (#11236) (313ff04)
- do not populate globals when calculating permissions, cleanup getEntityPolicies (#11237) (d49de7b)
- deduplicate blocks used in multiple places using new config.blocks property (#10905) (4c8cafd)
🛠 Refactors
- ui: simplifies confirmation modal callback (#11278) (af55549)
- ui: deprecates Link props (#11155) (cd11175)
📚 Documentation
- fix variable name typo in usePayloadAPI (error → isError) (#11249) (7024da8)
- fix typo in cors (#11266) (bf103cc)
- remove outdated
resparameter inloginandresetPasswordoperations (#11268) (38c1c11) - update join field docs (#11264) (0d7cf3f)
- add missing jsdocs to version config (#11258) (ede7bd7)
- dedicated custom components docs (#10987) (3229b9a)
- adds onInit to payload config options (#11069) (b646485)
- fix typo in readme (#11196) (35d845c)
- remove file extension from import statement in useLexicalComposerContext (#11188) (480113a)
- fix importMap.baseDir path (#11076) (84c838c)
- fix invalid link (#11174) (152a9b6)
- add inlineBlock converter example to the converters configuration in Converters.mdx (#11158) (24da30a)
- filterAvailableLocales (#11031) (3131dba)
- explains i18n language changing (#10964) (3098f35)
- explains i18n installation (#10963) (d7dee22)
- fixes misc grammar and spelling errors (#10996) (c31bff7)
🧪 Tests
- blocks field helpers (#11259) (8166784)
- regenerate
payload-types.tsfor all test suites (#11238) (117949b) - resolves
selecttype errors (#11235) (e78500f) - resolves
locked-documentstype errors (#11223) (ee0ac7f) - add types testing for select and joins (#11138) (4be410c)
- db-mongodb: unit test assertion for relationship sanitization inside
blockReferences(#11195) (2ae670e)
📝 Templates
- allow to pass
resource={null}toMediacomponent (#11228) (64d0217) - add new readme for quick start on vercel platform (#11131) (707e85e)
- add packageManager to website template instead of engines.pnpm (#11121) (44be433)
- bump for v3.23.0 (#11115) (5d19958)
🏡 Chores
- move dequal to devDependencies (#11220) (d126c2b)
- update codeowners (#11151) (706410e)
- typo in migrate:fresh command (#11140) (6bfa66c)
- add typescript-strict-plugin to the payload package for incremental file-by-file migration [skip lint] (#11133) (6eee787)
- tsconfig.base.json reset (48471b7)
- deps: bumps @monaco-editor/react to v4.7.0 to suppress react 19 warnings (#11161) (f4639c4)
- richtext-lexical: fix unchecked indexed access, make richtext-lexical full ts strict (part 5/5) (#11132) (09ada20)
- richtext-lexical: improve types of UploadData (#10982) (002e921)
🤝 Contributors
- Paul (@paulpopus)
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Jarrod Flesch (@JarrodMFlesch)
- felismargarita (@felismargarita)
- Fredrik (@Livog)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Germán Jabloñski (@GermanJablo)
- Tib (@T1l3)
- Said Akhrarov (@akhrarovsaid)
- Patrik (@PatrikKozak)
- Jessica Chowdhury (@JessChowdhury)
- Riley Langbein (@rilrom)
- annes (@annesnour03)
- Max Malm (@benjick)
- lucasbajoua (@lucasbajoua)
- Kendell Joseph (@kendelljoseph)
- Adit (@ioExpander)
- Hulpoi George-Valentin (@GeorgeHulpoi)
- David Hu (@davidhu2000)
- Alejandro Martinez (@ja-martinez)
- Cody Stallings (@ydocsgnillats)
- Elliot DeNolf (@denolfe)
v3.23.0 (2025-02-11)
🚀 Features
- adds new jobs.shouldAutoRun property (#11092) (5dadcce)
- add timezone support on date fields (#10896) (430ebd4)
- richtext-lexical: expose client config to client features (#11054) (d7a7fbf)
- ui: add timezone support to scheduled publish (#11090) (c18c58e)
🐛 Bug Fixes
- set initialValues alongside values during onSuccess (#10825) (fde526e)
- unhelpful "cannot overwrite model once compiled" errors swallowing actual error (#11057) (6a99677)
- error when passing functions to array or block fields labels property (#11056) (6d48cf9)
- db-mongodb: ensures same level operators are respected (#11087) (d2fe9b0)
- db-postgres: incorrect pagination results when querying hasMany relationships multiple times (#11096) (98fec35)
- next: allows relative live preview urls (#11083) (91a0f90)
- payload-cloud: handle socket closures (#11113) (da77f99)
- richtext-lexical: improve keyboard navigation on DecoratorNodes (#11022) (fa18923)
- richtext-lexical: toggling between internal and custom links does not update fields (#11074) (9fb7160)
- richtext-lexical: fixed the positioning of the button to add columns or rows in tables (#11050) (886bd94)
- storage-s3: sockets not closing (#11015) (95ec575)
- ui: relationship filter renders stale values when changing fields (#11080) (da6511e)
- ui: incorrectly incrementing version counts if maxPerDoc is set to 0 (#11097) (3616818)
📚 Documentation
- update custom endpoints docs,
handlerdoes not accept array of functions anymore (#11110) (1f3ccb8) - adds options table to payload-wide upload options (#10904) (d6a03ee)
- fixing 3 dead internal links (#11100) (3f80c59)
- adds
usePayloadAPIhook to React Hooks documentation (#11079) (d56de79) - fix typo in
BlockquoteFeaturename (#11078) (87ba7f7) - typo in jobs queue workflows (#11063) (dc56acb)
- plugin-multi-tenant: update tenantsArrayField config options (#11045) (ac6f4e2)
📝 Templates
🏡 Chores
- updates CODEOWNERS (#11088) (3415ba8)
- ensure jest respects PAYLOAD_DATABASE env variable (#11065) (c6c65ac)
- richtext-lexical: add test converage for internal links (#11075) (b15a7e3)
- richtext-lexical: fix unchecked indexed access (part 4) (#11048) (5a53854)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Paul (@paulpopus)
- Jacob Fletcher (@jacobsfletch)
- Sasha (@r1tsuu)
- Said Akhrarov (@akhrarovsaid)
- Jonathan Bredo (@Bredo)
- Jarrod Flesch (@JarrodMFlesch)
- James Mikrut (@jmikrut)
- Markus (@Ma-Kas)
- Germán Jabloñski (@GermanJablo)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Nathan Clevenger (@nathanclevenger)
- Boyan Bratvanov (@bratvanov)
v3.22.0 (2025-02-07)
🚀 Features
- ui: adds filtering config option and implementation for filtering a… (#11007) (a63a3d0)
- ui: improve hasMany TextField UX (#10976) (d8cfdc7)
🐛 Bug Fixes
- db-postgres: ensure globals have
createdAt,updatedAtandglobalTypefields (#10938) (57143b3) - db-postgres: select
hasMany: truewith autosave doesn't work properly (#11012) (3ad56cd) - next: viewing modified-only diff view containing localized arrays throws error (#11006) (09721d4)
- plugin-multi-tenant: correctly set doc default value on load (#11018) (f25acb8)
- richtext-lexical: duplicative error paths in validation (#11025) (2b76a04)
- richtext-lexical: ensure sub-fields have access to full document data in form state (#9869) (ae32c55)
- ui: removing final condition closes where builder (#11032) (b820a75)
- ui: clearing value from relationship filter leaves stale query (#11023) (7a73265)
- ui: relationship filter clearing on blur (#11021) (8940726)
- ui: improve useIgnoredEffect hook (#10961) (8ed4104)
- ui: allow schedule publish to be accessed without changes (#10999) (bdbb999)
- ui: apply cacheTags upload config property to other admin panel image components (#10801) (e29ac52)
🛠 Refactors
🧪 Tests
🏡 Chores
pnpm devdefaults to the _community test suite (#11044) (49d94d5)- find and use an available port in tests (#11043) (feea444)
- fix eslint wasn't running in test dir (#11036) (257cad7)
- fix flaky lexical test (#11035) (04dad9d)
- deflake joins e2e tests (#11034) (098fe10)
- fix lexical tests that are failing on main branch (#11024) (6631869)
- cpa: add ts strict mode (#10914) (824f9a7)
- plugin-multi-tenant: add better defaults for imported components (#11030) (ec593b4)
- richtext-lexical: fix unchecked indexed access (part 3) (#11014) (5f58daf)
- richtext-lexical: fix unchecked indexed acess in lexical blocks feature (#11013) (e413e1d)
🤝 Contributors
- Dan Ribbens (@DanRibbens)
- Jacob Fletcher (@jacobsfletch)
- Germán Jabloñski (@GermanJablo)
- Alessio Gravili (@AlessioGr)
- Jessica Chowdhury (@JessChowdhury)
- Jarrod Flesch (@JarrodMFlesch)
- Sasha (@r1tsuu)
- Simon Vreman (@SimonVreman)
- Tobias Odendahl (@tak-amboss)
v3.21.0 (2025-02-05)
🚀 Features
- exposes helpful args to ts schema gen (#10984) (2118c6c)
- adds auto resize feature to textarea (#10786) (7d429f8)
- plugin-multi-tenant: allow opting out of tenant access control merge (#10888) (be790a9)
🐛 Bug Fixes
- allow public errors to thread through on response (#10419) (ea9abfd)
- db-postgres: select hasMany inside arrays and blocks with versions (#10829) (68a7de2)
- db-postgres: write operations on polymorphic joined collections throw error (#10854) (e1dcb95)
- plugin-multi-tenant: incorrect tenant selection with postgres (#10992) (2a1ddf1)
- plugin-multi-tenant: fixed hardcoded user tenants field (#10782) (9638dbe)
- plugin-search: deleting docs even when there's a published version (#10993) (42da87b)
- plugin-search: generates full docURL with basePath from next config (#10910) (0f85a6e)
- plugin-search: gets api route from useConfig (#10632) (6353cf8)
- richtext-lexical: removes css from jsx converter (#10997) (45913e4)
- richtext-lexical: link drawer has no fields if parent document
createaccess control isfalse(#10954) (136c90c) - ui: client should add back default values for valid and passesCondition form field properties (#10709) (35e5be8)
- ui: revert unrelated code (#10897) (3985893)
- ui: error in version view if document contains localized arrays or blocks (#10893) (85c0842)
- ui: create-first-user crashes when users collection has join field (#10871) (2f66bdc)
📚 Documentation
- fixes dynamic, fully qualified live preview url args (#10985) (a07fd9e)
- correct broken NPM badge images on plugin documentation (#10959) (1a68fa1)
- correct grammar and improve clarity on preventing-abuse.mdx (#10937) (8ace0ca)
- fix typo on overview.mdx (#10877) (8f27f85)
- admin preview and draft preview (#10875) (d7c3b4e)
🧪 Tests
📝 Templates
- set pnpm engines to version 9 (#10979) (b671fd5)
- use typed functions in website template seed endpoint (#10420) (0a1cc6a)
- add
@ts-ignorein seed to allow initial build on vercel (#10889) (2043b4a) - remove unknown CSS values (#10891) (ebb5173)
📓 Examples
- multi-tenant seed script, readme and other improvements (#10702) (ae0736b)
- added missing sharp dependency to the remix website package (#10931) (58666fb)
⚙️ CI
- increase closed issue lock for inactivity to 7 days (8af8bef)
🏡 Chores
- deps: bump packages used to build payload (#10950) (109de8c)
- deps: bumps @faceless-ui/window-info to v3.0.1 and @faceless-ui/scroll-info to 2.0.0 (#10913) (2f787a9)
- deps: deprecates body-scroll-lock (c7ad46c)
- examples: misc improvements to the draft preview example (#10876) (2b9ee62)
- plugin-search: improves types (#10955) (1771271)
- plugin-search: deprecates apiBasePath from config (#10953) (4a4e90a)
- templates: improves and simplifies draft preview (#10895) (8a79e59)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- James Mikrut (@jmikrut)
- Paul (@paulpopus)
- Jarrod Flesch (@JarrodMFlesch)
- Jacob Fletcher (@jacobsfletch)
- Boyan Bratvanov (@bratvanov)
- Tylan Davis (@tylandavis)
- Said Akhrarov (@akhrarovsaid)
- Jessica Chowdhury (@JessChowdhury)
- Steve Kuznetsov (@stevekuznetsov)
- Alessio Gravili (@AlessioGr)
- Suphon T. (@suphon-t)
- Alexander Cato (@alexander-cato)
- Marwin Hormiz (@marwinhormiz)
- Sasha (@r1tsuu)
- Franco D'Agostino (@francodgstn)
- David Murdoch (@dsm23)
- Pavel B. (@inlinecoder)
- Amelia (@LimChorngUan)
- Robert Clancy (Robbo) (@robclancy)
v3.20.0 (2025-01-29)
🚀 Features
- allow publish and publish specific locale buttons to be swapped (#9438) (9b49741)
- allows fields to be collapsed in the version view diff (#8054) (828b3b7)
- ui: allows customizing version diff components, render versions ui on the server (#10815) (c562fbf)
- ui: toggle showing only modified fields in version diff view (#10807) (33ac13d)
🐛 Bug Fixes
- checks for localization to prevent publish button breaking (#10844) (9c31a52)
- field paths within hooks (#10638) (0acaf8a)
- next: remove toString coercion inside getDocumentPermissions (#10828) (9f9919d)
- plugin-form-builder: type of MessageField to object (#10792) (92e6beb)
- plugin-form-builder: type of MessageField to SerializedEditorState (#10789) (5603c1c)
- plugin-multi-tenant: issue #10740 - "The following field is invalid: Assigned Tenant" (#10764) (c1c64a0)
- plugin-multi-tenant: remove tenant cookie on logout (#10761) (22633a6)
- plugin-nested-docs: update draft and published child docs on resave (#10454) (7a39870)
- richtext-lexical: preserve selection in Firefox when using LexicalMenu (#10867) (0e5ff24)
- richtext-lexical: afterRead hooks were not awaited (#10747) (9f2bca1)
- translations: adds et to import file (#10823) (ffe8020)
- ui: adds title attribute to Logout button for tooltip (#10851) (989140b)
- ui: correctly reset blocksDrawer search state after close (#10847) (8a6d995)
- ui: adds prev value on form state validat functions (#10832) (a835518)
- ui: hide the restore button's empty submenu in a draft version (#10756) (0d81ff2)
- ui: include check for parent permissions in renderField (#10729) (8289588)
⚡ Performance
- skips field validations until the form is submitted (#10580) (82f1bb9)
- only validate filter options on submit (#10738) (a05240a)
📚 Documentation
- add missing full stop, fix SlateNodeConverter import (#10860) (a47139a)
- fix links and formatting (#10835) (8952662)
- fix typo (#10824) (95e81d8)
- improvements in rich text section (#9954) (6a39279)
- adds limit, page, sort, where, and joins to list of rest query params (#10751) (ec1a441)
📝 Templates
- fix compatibility with pnpm 10 (#10830) (3094c92)
- fix website template not building (#10858) (219a369)
- adds landing page to blank template (#10769) (e65a04a)
- ensure lexical link validation does not break for internal links (#10771) (59545b5)
⚙️ CI
- remove docker login, not functional for external contributors (eca4f47)
- update CODEOWNERS (d6ae07d)
- fix run e2e command (#10779) (344b231)
🏡 Chores
- improves routeError log safety (#10793) (ace7557)
- uncomment collectionSlugs array in fields test suite, for resetDB to work properly (#10778) (72a5c02)
- migrate outdated @payloadcms/next/utilities imports (#10777) (b9d3250)
- disable bun run test buttons if bun extension is installed (#10775) (03f7bdf)
- cpa: re-pin template versions (#10857) (c08f012)
- deps: upgrades react-diff-viewer-continued to v4.0.4 to suppress react 19 warnings and use ESM imports (#10834) (57f7218)
- templates: update missing changes in vercel website template (#10827) (c75c6ce)
- templates: fix eslint errors in vercel templates (#10768) (52f86c7)
- templates: fix: the contact page of the website template throws an error in live preview (#10785) (d6658b5)
- templates: fix eslint errors in plugin template (#10770) (b76401c)
🤝 Contributors
- Germán Jabloñski (@GermanJablo)
- Sasha (@r1tsuu)
- Elliot DeNolf (@denolfe)
- Seno (@s-en-o)
- Alessio Gravili (@AlessioGr)
- Tsemach Hadad (@tsemachh)
- Dan Ribbens (@DanRibbens)
- Patrik (@PatrikKozak)
- Said Akhrarov (@akhrarovsaid)
- Jacob Fletcher (@jacobsfletch)
- Jessica Chowdhury (@JessChowdhury)
- Jarrod Flesch (@JarrodMFlesch)
- Tib (@T1l3)
- felismargarita (@felismargarita)
- Wallerand Delevacq (@wallforfry)
- James Mikrut (@jmikrut)
- Francisco Lourenço (@franciscolourenco)
v3.19.0 (2025-01-23)
🚀 Features
- richtext-lexical: make decoratorNodes and blocks selectable. Centralize selection and deletion logic (#10735) (4aaef5e)
- ui: adds edit many option for bulk uploads (#10646) (be2c482)
🐛 Bug Fixes
- next.js rewrites were not respected for rest api (#10759) (c0ae994)
- browser validation error when visiting account page (#10717) (c1b912d)
- custom blocks field label component missing from config (#10692) (a5695ba)
- apply CORS response headers without
headersWithCors(#10597) (be98eda) - rest api with
?locale=*doesn't return full localized data (#10619) (7f8f2f0) - join field with the target relationship inside localized array (#10621) (25a70ab)
- properly handle nullable
minDistanceandmaxDistanceinnearquery (#10622) (46c1b37) - db-mongodb: v2-v3 migration versions docs of collections and globals without relationship fields (#10755) (2d8ff72)
- db-mongodb: querying polymorphic relationships with the
alloperator (#10704) (d601300) - db-mongodb: beginTransaction invalid type without replicaset (#10690) (90f88f8)
- next: admin panel UI not rendering custom upload components (#9925) (e4fa171)
- plugin-multi-tenant: selected tenant could become incorrect when navigating out of doc (#10723) (e6d0260)
- plugin-multi-tenant: corrects user type in userHasAccessToAllTenants fn (#10707) (2a98c84)
- plugin-multi-tenant: prevent throwing when no user exists (#10699) (a9c0832)
- plugin-nested-docs: cannot update more than 10 child docs (#10737) (3501d47)
- richtext-lexical: improved regex matchers for absolute and relative URLs to make autolinking more reliable (#10725) (9bb27af)
- richtext-lexical: incorrect table action menu placement (#10627) (9684d31)
- ui: filters out upload specific fields for bulk editing (#10726) (f181f97)
- ui: admin description not being respected on tabs and padding issues with tab descriptions (#10710) (67f7c95)
- ui: issue with thumbnail component crashing the UI if the image didnt exist (#10689) (ddeb29f)
📚 Documentation
- moves collection and globals admin docs to their respective config overviews (#10743) (e5b3da9)
- moves customizing fields doc to fields overview (#10742) (0ca3736)
- adds examples of typed custom field components (#10741) (8b3e2ff)
- adds info on useSelection and useStepNav hooks (#10683) (d8682f2)
- multi-tenant plugin - remove @beta and fix npm url (#10697) (6d43910)
📝 Templates
- update website readmes for additional information on jobs and revalidation (#10758) (61a2a9c)
- fix potential error in the initial form state caused by type mismatch (#10713) (5e4a1d4)
⚙️ CI
🏡 Chores
- temporarily revert 10597 (#10718) (0c5321e)
- adds plugin-multi-tenant scope for pr title (#10706) (3e0baf5)
- examples: change to useClickableCard to use AbortController (#10680) (b55342d)
- plugin-multi-tenant: test suite enhancements (#10732) (9a87699)
- templates: fix eslint errors in website template (#10752) (5689c65)
🤝 Contributors
- Sasha (@r1tsuu)
- Germán Jabloñski (@GermanJablo)
- Paul (@paulpopus)
- Jacob Fletcher (@jacobsfletch)
- Dan Ribbens (@DanRibbens)
- Patrik (@PatrikKozak)
- Alessio Gravili (@AlessioGr)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Boyan Bratvanov (@bratvanov)
- David Murdoch (@dsm23)
- Riley Langbein (@rilrom)
v3.18.0 (2025-01-20)
🚀 Features
- adds support for both client-side and server-side remote URL uploads fetching (#10004) (38a06e7)
- support JPEG XL image size calculation (#10624) (6ebcbe4)
- adds multi-tenant plugin (#10447) (813e70b)
- examples: add example with Remix + Payload Local API (#10171) (5a9cf89)
- richtext-lexical: add jsx and html converters for tab nodes (#10565) (2e09da8)
- ui: exposes context of the view being rendered on the server (#10620) (e80d679)
🐛 Bug Fixes
- updates field validation error messages to use labels if applicable (#10601) (ad553e9)
- delete scheduled publish jobs when deleting documents (#10584) (05b9d94)
- UpsertArgs is not exported in payload (#9347) (7a392dd)
- form state read access control args (#10576) (05b03b2)
- missing find collection versions REST endpoint (#10573) (120735c)
- basePath was not passed through if method was overriden (#10562) (90e1843)
- db-mongodb: incorrect errors logging due to invalid logic in
handleError(#10575) (9043b10) - payload-cloud: add ts strict mode and fix a couple of wrong runtime behaviors (#10570) (16ad7a6)
- plugin-seo: loosen some types to restore compatibility between minor versions (#10670) (9c29541)
- plugin-stripe: hooks did not use api key from plugin config (#10671) (d2f63dc)
- richtext-lexical: setting hideInsertParagraphAtEnd to true did not hide insert paragraph button (#10581) (8ab05b0)
- richtext-lexical: inline blocks did not store nested fields correctly (#10578) (61117ee)
- richtext-lexical: ensure jsx and html converters do not output linebreak if editor is empty (#10563) (df4af70)
- richtext-slate: link and upload extra field drawers did not render fields if collection has unrelated access control set (#10583) (ecf0572)
- ui: renders custom block row labels (#10686) (6c19579)
- ui: fixed many bugs in the WhereBuilder relationship select menu (#10553) (56667cd)
- ui: replace hard coded path to API with
serverURLandroutes.api(#10618) (5a95237) - ui: placement issue with sonner toasts (#10641) (f1cc8bd)
- ui: show outline on focus for sort column buttons (#9557) (818467d)
⚡ Performance
- list view table should not send duplicative client CollectionConfig to client (#10664) (823e223)
- ensure deepCopy in beforeValidate hook does not run unnecessarily for rest and graphQL API (#10666) (b69fe99)
- optimize getEntityConfig lookups (#10665) (c07c9e9)
- remove deepCopying in sanitizeJoinQuery, optimize flattenWhereToOperators (#10663) (91ed882)
- operations performance optimizations (#10609) (42382b6)
- reduce document data deepCopying in field hooks (#10610) (116fd99)
- do not send minRows and maxRows undefined values to client (#10600) (0a1cf7b)
- ensure unnecessary config translations are not sent to the client (#10524) (3fb6ac3)
- significantly reduce form state response size by up to 3x (#9388) (31ae27b)
- richtext-lexical: ensure internal link nodes do not store url field, and vice versa (#10564) (5d6c29f)
- ui: remove unnecessary deepCopy in reduceToSerializableFields (#10667) (a98a398)
- ui: speed up list view rendering, ensure root layout does not re-render when navigating to list view (#10607) (fafe37e)
📚 Documentation
- react hooks - update useForm import path (#10658) (ef44bdd)
- removes live preview image placeholder comment (#10643) (64fc2df)
- update wording for sentence (#10599) (22f3c79)
- add section on localized access control (#10567) (8217842)
🧪 Tests
📝 Templates
- form fields will now respect 'required' flag from config on website template (#10681) (2d70269)
- add cache tag to images so that they can be revalidated along with the page on website templates (#10647) (7d10e1b)
- bump for v3.17.1 (#10560) (592f02b)
📓 Examples
🔨 Build
⚙️ CI
- update canary script for tools dir (711febc)
- add multi-tenant plugin to publish list (076ffa2)
- disable integration tests retrying (#10615) (28b7c04)
- access sha in dispatch event (5ee36fc)
- dispatch event (f306785)
- scripts: publish-canary script always bump minor, more realistic [skip ci][skip lint] (4629784)
🏡 Chores
- set save-prefix='' for repo [skip ci] (ef4b8d9)
- run pnpm dev without dev - this improves error logging on init (#10669) (9215f03)
- adjust multi tenant version (#10640) (baad382)
- multi-tenant plugin updates (#10598) (0d47a5d)
- enable noUncheckedIndexedAccess in all packages except richtext-lexical (#10592) (d4039f2)
- enable noImplicitOverride in all packages (#10588) (d55b6a3)
- update mongodb-memory-server v9 -> v10 (#10556) (918bd72)
- make TypeScript strict in test folder. Simplify tsconfig (#10582) (a304dc4)
- make TypeScript strict by default in packages and 7 packages stricter (#10579) (085c1d0)
- db-mongodb: update mongoose and mongodb deps (#10644) (00cc10c)
- deps: upgrade various dependencies (#10657) (b6e9c3b)
- deps: bumps path-to-regexp (8c3f6e1)
- examples: bumps custom components example to latest and runs seed on init (#10661) (9f5ffed)
- richtext-lexical: add unit test that ensures lexical dependency checker is updated (#10561) (6a6ef8f)
- templates: make TypeScript strict in website template (#10587) (2ce3829)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Sasha (@r1tsuu)
- Germán Jabloñski (@GermanJablo)
- Paul (@paulpopus)
- Boyan Bratvanov (@bratvanov)
- Dan Ribbens (@DanRibbens)
- Jarrod Flesch (@JarrodMFlesch)
- Patrik (@PatrikKozak)
- Riley Langbein (@rilrom)
- Said Akhrarov (@akhrarovsaid)
- Greg Presland (@gpresland)
- DracoBlue (@DracoBlue)
- Jessica Chowdhury (@JessChowdhury)
- Suphon T. (@suphon-t)
v3.17.1 (2025-01-14)
Important
This release upgrades the lexical dependency from 0.20.0 to 0.21.0. If you installed lexical manually, update it to 0.21.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, delete node_modules and your lockfile (e.g. pnpm-lock.json), then reinstall (e.g. pnpm install). Some package managers do not update the lexical peerdep automatically, likely due to a bug on their end.
🐛 Bug Fixes
🤝 Contributors
- Alessio Gravili (@AlessioGr)
v3.17.0 (2025-01-13)
Important
Please upgrade to 3.17.1. In 3.17.0, you may encounter richtext-lexical dependency checker errors during development.
🚀 Features
- delete scheduled published events (#10504) (f95d6ba)
- add ability to disable cache tags for admin thumbnails (#10319) (6b051bd)
- consolidates logic in update and updateByID operations (#9998) (690e99f)
- richtext-lexical: add new paragraph button below the editor (#10530) (6757f7d)
- richtext-lexical: respect imageURL for blocks and inline blocks (#10532) (ab564d3)
- richtext-lexical: upgrade lexical from 0.20.0 to 0.21.0. Fixes table selection & scrollable table bugs (#10501) (04733f0)
🐛 Bug Fixes
- respect res header immutability (#10554) (5cfb1da)
- better messaging when no arg passed to payload cli (#10550) (9278eec)
- aligns first render for hydration of dates in list view (#10541) (cc13ae7)
- rest api with Next.js
basePathoption (#10535) (04a8083) - localized tabs with empty data and an array field inside lead to crash in
afterChange(#10410) (1af7d87) - cpa: proper debug logging (#10549) (9004205)
- next: ensures req.locale is populated before running access control (#10533) (afcc970)
- richtext-lexical: error when deleting links (#10557) (9631060)
- richtext-lexical: insert paragraph at end button overlaps floating link toolbar (#10552) (6ada450)
- richtext-lexical: remove alteration of lexical text format constant (#10415) (69fac59)
- richtext-lexical: combine 2 normalizeMarkdown implementations and fix code block regex (#10470) (0252681)
- richtext-lexical: editor placeholder had incorrect padding set for small viewports (#10531) (26711a7)
- richtext-lexical: adds support for localized placeholder (#10523) (dc6d79e)
- richtext-lexical: lexical editor behind a drawer was incorrectly registered as parent editor of lexical editor within drawer (#10502) (fd96a9a)
- translations: update etTranslations type to DefaultTranslationsObject (#10358) (2e0595b)
- ui: reset pagination when typing in WhereBuilder select menu (#10551) (a3ef5ee)
- ui: passes serverProps to custom label components within table columns (#10547) (6848cf4)
- ui: scheduled publish not showing related events in postgres (#10481) (c9584a9)
- ui: table custom label missing client field props (#10540) (415fbf1)
- ui: fixed issue with updatedAt timestamps not updating in the UI when drafts are updated (#10503) (082c4f0)
🛠 Refactors
- improve error logging during onInit and website template seed (#10528) (142c504)
- next: cleans up initPage through initReq overrides and consolidated return types (#10449) (c850bd4)
📚 Documentation
- improves grammar in vercel postgres usage note (#10365) (5043a8a)
- updates docs to reflect correct array hook usage (#10546) (43b40f0)
📝 Templates
- fix issue with shadcn utilities alias across website template and localization example (#10507) (d20dc58)
- bump for v3.16.0 (#10499) (a49f782)
⚙️ CI
🏡 Chores
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Elliot DeNolf (@denolfe)
- Germán Jabloñski (@GermanJablo)
- Dan Ribbens (@DanRibbens)
- Anthony Mifsud (@amifsud02)
- Ben Löffel (@benloeffel)
- Jacob Fletcher (@jacobsfletch)
- Tristan (@tristankrass)
- Jarrod Flesch (@JarrodMFlesch)
- Paul (@paulpopus)
- Simon Vreman (@SimonVreman)
- Amelia (@LimChorngUan)
- Sasha (@r1tsuu)
- Said Akhrarov (@akhrarovsaid)
v3.16.0 (2025-01-10)
🚀 Features
- consolidates REST API handling, decouple from next.js (#10466) (686e48d)
- exports ListPreferences from payload (#10474) (ae1542b)
- export the default JWTAuthentication strategy (#10430) (81c1e47)
- autoRun jobs (#10401) (c0dc0cc)
- payload-cloud: set up cron jobs on init (#10106) (36e50dd)
🐛 Bug Fixes
- collection access endpoint optional ID and use 404 for not found response (#10487) (225c24d)
- do not autorun jobs during next build process (#10483) (d8f4f06)
- properly validates preferences json (#10465) (6a262ab)
- schedule publish allowed before saving draft (#10461) (3349a4c)
- next: properly instantiates locale context (#10451) (a78bc6c)
- payload-cloud: infinite recursion on init (#10467) (34a0d00)
- richtext-lexical: respect defaultValue config of link feature url and linkType fields (#10498) (4fc6956)
- richtext-lexical: properly handle error if blocks or inline blocks are not found (#10497) (e0df0d6)
- richtext-lexical: update Thai translations for blockquote and horizontal rule (#10469) (8d5d2d1)
- richtext-lexical: allow external state mutation of block node from outside the form (#10486) (4c96028)
- richtext-lexical: inline Block drawers opened when document mounts (#10480) (bdb96dd)
- ui: disables form during locale change (#8705) (f4596fc)
- ui: stale doc status when publishing, reverting and unpublishing (#10405) (17e7ee2)
- ui: removes edit drawer button from
uploadscollection edit view (#10426) (9701fc6)
📚 Documentation
- update beforeValidate documentation (#10367) (21eec87)
- update draft doc for formatting (#10393) (a8d6f3f)
- removed unnecessary visible
tag in fields/blocks (#10456) (83bd0e2)
📝 Templates
- adjusted the cron job schedule so its compatible with hobby tiers as well (#10457) (d9ff2e0)
- add support for scheduled publish to the website template [no lint] (#10455) (7321f9f)
🏡 Chores
- update year in licenses (#10463) (e46ad67)
- import copy icon from nested folder (#9223) (ac97bfd)
- templates: generate new migrations for vercel (#10458) (5318d24)
🤝 Contributors
- Sasha (@r1tsuu)
- Jacob Fletcher (@jacobsfletch)
- Alessio Gravili (@AlessioGr)
- Sepiolina (@TidalCare)
- Steve Kuznetsov (@stevekuznetsov)
- Adrian Maj (@AdrianMaj)
- Germán Jabloñski (@GermanJablo)
- Dan Ribbens (@DanRibbens)
- Paul (@paulpopus)
- Jarrod Flesch (@JarrodMFlesch)
- Patrik (@PatrikKozak)
v3.15.1 (2025-01-08)
🐛 Bug Fixes
- vercel upload adapter warning false positive (#10434) (7a21b44)
- deprecates admin.disable property (#10429) (b092754)
- richtext-lexical: fix default arg in normalizeMarkdown (#10424) (4d7587d)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Jacob Fletcher (@jacobsfletch)
- Germán Jabloñski (@GermanJablo)
v3.15.0 (2025-01-07)
🚀 Features
- allow running sub-tasks from tasks (#10373) (08fb159)
- warn if deploying to vercel and any upload collection missing storage adapter (#10391) (22c4dee)
- next: pass through query params from document view to find operations (#10343) (4a15b86)
- next: adds support for resetting preferences (#10304) (1cade17)
🐛 Bug Fixes
- extends type
allto the locale type definition in req (#10399) (eadce5e) - increase safety of findConfig (#10400) (f629709)
- handle
withoutEnlargementfor undefinedheightorwidth(#10078) (d212733) - allow to set
maxDepth: 0for join fields, improve join field JSDoc (#10336) (ba228dd) - copy to locale with localized arrays and blocks generate new IDs to prevent errors in postgres (#10292) (c7b3204)
- adds path to server field component prop types (#10330) (e97c43e)
- cpa: ensures .env & .env.example file modifications occur before git initialization (#10312) (3847718)
- db-postgres: handle
undefinedfallback foradapter.schemaNamein relationships migration (#10384) (1525cc6) - db-postgres: added missing quotes and schema name to sql statement in v2-v3 migration (#10322) (556b8ed)
- email-resend: add reply_to to the API when sending emails (#10407) (c7f21fc)
- live-preview-react: allows react peer deps of v16.8.0 or later (#10328) (f2fab39)
- next: live preview tab did not display custom edit view components (#10412) (ef7191b)
- richtext-lexical: make div container optional (#10383) (7fc6227)
- richtext-lexical: formatted inline code resulted in incorrect markdown export (#10413) (827c75a)
- richtext-lexical: modify JSXConvertersFunction type to support block types in strict mode (#10398) (d772b2b)
- richtext-lexical: open inline block drawer on mount (#10318) (5997aa1)
- storage-vercel-blob: return 404 when file is not found (#10327) (d68a1ea)
- ui: drawer component missing closing bracket in style calc (#10411) (ab53aba)
- ui: sort resets columns (#10402) (a83a430)
- ui: make relationship fields update the collection when it is changed in the drawer dropdown (#10338) (be84ad7)
- ui: properly reflects hook changes in ui (#10268) (3ea1d39)
- ui: ensures list drawer does not change underlying step nav (#10339) (b44aade)
📚 Documentation
- minor lexical docs improvements (#10414) (b774f55)
- fix all other links to live-preview example (#10385) (53aea62)
- fix CORS anchor link (#10333) (fd52de6)
- fix link to live-preview example and remove empty placeholder (#10380) (1e247f8)
- fix links and formatting (#10346) (5e4e274)
🧪 Tests
📝 Templates
- fix nested docs url generation for categories (#10403) (398b609)
- use
cross-envin the plugin template to achieve compatibility with Windows (#10390) (c1abd16) - prevent plugin template from including nested next folder in git (#10364) (0ce7c66)
- bump for v3.14.0 (#10324) (3d5b9f0)
⚙️ CI
- scripts: create draft release with release script, cleanup [skip ci] (6dcf817)
🏡 Chores
- export RunInlineTaskFunction type (#10372) (1a9fba5)
- change base image for template base dockerfile [skip ci] (daf314c)
- deps: bumps react-datepicker to v7.6.0 to suppress react 19 warnings (#10366) (8d24528)
- examples: set HTML dir attribute for RTL locales #10344 (#10345) (df827c0)
- examples: remove outdated testing example (#10370) (5ba477b)
- examples: removes all instances of React.forwardRef (#10334) (1f4790a)
- richtext-lexical: improve block not found error message (#10348) (09d6c60)
- templates: unpin payload packages (#10386) (422e8e3)
- templates: removes all instances of React.forwardRef (#10331) (47e8158)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Boyan Bratvanov (@bratvanov)
- Jacob Fletcher (@jacobsfletch)
- Amir Aryan (@amiraryan1996)
- Patrik (@PatrikKozak)
- Elliot DeNolf (@denolfe)
- Germán Jabloñski (@GermanJablo)
- Sasha (@r1tsuu)
- bakaptr (@Zhousiru)
- Nacho Martin (@nachomglz)
- Said Akhrarov (@akhrarovsaid)
- Danilo Lemes (@Danil0v3s)
- James Mikrut (@jmikrut)
- Anders Semb Hermansen (@andershermansen)
- Jarrod Flesch (@JarrodMFlesch)
v3.14.0 (2025-01-03)
🚀 Features
🐛 Bug Fixes
- ensure scheduled publish restriction (#10317) (4e57054)
- ensure
loggingLevelsis respected (#10308) (2e58a4a) - 'oldValue' must be a string error when viewing version diffs in postgres (#10313) (d9e0cd3)
- safely executes form state conditions, validations, and default values (#10275) (7928eca)
- next: returns proper verb tenses from update and delete routes (#10307) (d38ca83)
- richtext-lexical: allow any priority of FOCUS_COMMAND (#10128) (018c193)
- ui: unable to find user field schemas when updating password (#10305) (b14935c)
- ui: properly instantiates abort controllers (#10309) (abb51b9)
- ui: gracefully handle deletions in collection with upload hasMany (#9426) (2ae7d8e)
- ui: disable save button until the upload file is uploaded / ready (#10083) (bd7f705)
📚 Documentation
- warn when using
defaultPopulateon collections with uploads enabled (#10138) (d6d9edc) - fix typo in join.mdx (#10190) (b2042c5)
📝 Templates
- fix media block generating an error if referenced media is missing (#10310) (951c38e)
- reorders postcss plugins in the website template for tailwind compatibility (#10176) (a000e4a)
🏡 Chores
- examples: fix JSX rendering of internal links (#10303) (510968f)
- translations: adjust Norwegian translation of events (#10300) (c658022)
🤝 Contributors
- Sasha (@r1tsuu)
- Angel P. (@PlagueFPS)
- Jacob Fletcher (@jacobsfletch)
- Paul (@paulpopus)
- Alexander Cato (@alexander-cato)
- Tristan (@tristankrass)
- Dan Ribbens (@DanRibbens)
- Said Akhrarov (@akhrarovsaid)
- Sondre Ørland (@sondreorland)
- Germán Jabloñski (@GermanJablo)
- Grant Kennedy (@gkennedy87)
- Patrik (@PatrikKozak)
v3.13.0 (2025-01-02)
🚀 Features
- adds more control over how to disable graphql for collections /… (#10265) (7a59e7d)
- richtext-lexical: ability to override default placeholder (#10278) (182eaa3)
- translations: add Catalan translations (#10260) (5188a9b)
- ui: expose onMount to CodeField (#10223) (68a5f5c)
🐛 Bug Fixes
- close db connections after running jobs from command line. (#9994) (eb69885)
- cpa: do not overwrite custom.scss file on update (#10285) (c3eb272)
- graphql: Change config from raw path to
file:url (#9311) (16c6abe) - plugin-cloud-storage: actually deprecate adapters (#9640) (c4b31c0)
- plugin-search: respect custom api route in reindexButton (#10258) (cdaebcc)
- richtext-lexical: empty lines were incorrectly stripped from mdx blocks if doNotTrimChildren was set to true (#10287) (ee3c2cc)
- richtext-lexical: throw toast error when attempting to create upload node without any upload collections enabled (#10277) (07e86c0)
- richtext-lexical: various issues for lexical sub-fields due to incorrectly generated client field schema map (#10276) (35df899)
- richtext-lexical: formatted link markdown conversion not working (#10269) (885e966)
- richtext-lexical: ensure markdown normalization does not merge escaped code block lines (#10230) (c01b4bf)
- translations: adds missing max validations keys to client (#10266) (5d6064a)
- ui: checkboxes as first field were crashing WhereBuilder (#10290) (f3f36d8)
- ui: relationship edit drawers now respect current locale (#10262) (6dac4c5)
- ui: properly filters fields from list view columns and conditions (#10246) (f5a955d)
- ui: disableListColumn on first field breaks filter condition selection (#10267) (039b489)
- ui: removes useless verified checkbox on user create (#10252) (8671e85)
- ui: autosave wasnt firing on first change (#10256) (ef7242c)
📚 Documentation
- explicit
payloadusage fromreqto avoidimport payloadconfusion (#10291) (76e4402) - fix all missing vertical lines in tables (#10288) (b6de432)
- add missing vertical line to Collection Upload options table (#10282) (950f8ce)
- adds useListQuery to list of React hooks and updates useDocumentInfo (#10186) (be87ba0)
- fix dispatch actions link for useFormFields and useAllFormFields (#10273) (313b4ba)
- fix incorrect escaping of * (#10274) (5b4730d)
- fix docs for generate db schema (#10251) (63bca12)
- adds notes about importance of serverURL for verify / forgot-pa… (#10248) (6af6e44)
- add clarity about forgot-password and verify tokens (#10247) (363a24c)
- richtext-lexical: minor improvements (#10280) (943798a)
- richtext-lexical: improve building custom feature docs, add example for custom blocks (code field within lexical) (#10279) (6e19e82)
🧪 Tests
- consolidates list view e2e tests (#10263) (270ac10)
- adds custom pagination e2e tests (#10240) (6f5a1e3)
🏡 Chores
- cpa: remove success message outline (#10233) (2111a86)
- translations: fine-tune some Swedish texts (#10224) (c5b1cd6)
🤝 Contributors
- Sasha (@r1tsuu)
- James Mikrut (@jmikrut)
- Alessio Gravili (@AlessioGr)
- Said Akhrarov (@akhrarovsaid)
- Boyan Bratvanov (@bratvanov)
- Elliot DeNolf (@denolfe)
- Jacob Fletcher (@jacobsfletch)
- Gerard Du Pre (@GerardPolloRebozado)
- Jesper We (@JesperWe)
- Dan Ribbens (@DanRibbens)
- Violet Rosenzweig (@6TELOIV)
- Anders Semb Hermansen (@andershermansen)
v3.12.0 (2024-12-28)
🚀 Features
- scheduled publish / unpublish (#10203) (37d1f2d)
- adds req to filterOptions args (#10204) (cf8c0ae)
- export defaultLoggerOptions (#10133) (7e0975f)
- plugin template (#10150) (d8a62b7)
- cpa: create project from example using
--exampleCLI arg (#10172) (6b4842d) - richtext-lexical: multiline string support for objects in MDX parser (#10208) (181fc41)
- richtext-lexical: more lenient MDX JSON object parser that allows unquoted property keys (#10205) (a46609e)
🐛 Bug Fixes
- deep querying, handle
getLocalizedPathsfor blocks (#10187) (eff75f9) - generate types when no
enlanguage is defined in i18n (#10181) (8debb68) - ensure tab label and description are serializable (#10115) (68b5f61)
- db-postgres: prevent indexes from changing name on HMR (#10154) (374b79d)
- db-postgres: joins to self
collection(#10182) (a0d8131) - richtext-lexical: newlines in mdx props were stripped, even though objects inside props may expect there to be newlines (#10215) (67db04c)
- richtext-lexical: restore selection (#10129) (154ad9d)
- ui: pagination resets perPage (#10199) (fad4ee6)
- ui: prevent many upload fields overwriting bulkUpload onSuccess (#10189) (ebf3cee)
- ui: public users unable to log out (#10188) (f3aebe3)
- ui: infinite loading states when adding blocks or array rows (#10175) (b33f4b0)
⚡ Performance
📚 Documentation
- fix backtick escaping in TableWithDrawers blocks (#10220) (3218b0d)
- correctly escape backticks (#10217) (466ea29)
- correctly escape backticks (#10216) (3278f45)
- fix typo (#10214) (da518f5)
- fix incorrect docs for complex mdx components (#10212) (78b6d51)
- fix syntax that couldn't be parsed (#10207) (29c5bcd)
- fix incorrect mdx (#10201) (bb0c8a8)
- fix arg name in live preview code example (#10127) (a49e63c)
- fix broken links to csrf and e-mail verification docs (#10140) (0588394)
🧪 Tests
📝 Templates
- use
publishConfigfor the plugin template (#10196) (a5b9adc) - update
Dockerfilefor the website template, use the LTS version for Node.js image (#10184) (5613a7e) - bump for v3.11.0 (#10121) (235eade)
⚙️ CI
- only label stale issues/prs, disable closing (1372f24)
🏡 Chores
- bump
nextto15.1.3in the monorepo (#10211) (7a4d53a) - update rimraf and fix windows compatible clean script (#10152) (326b720)
- UnauthorizedError file misspelled as UnathorizedError (#10157) (6b45b2d)
- examples: localization example (#10134) (3bbc5bf)
- live-preview: strongly types message events (#10148) (466f109)
- richtext-lexical: export $createServerBlockNode, $isServerBlockNode and ServerBlockNode for the server (#10192) (1dc4b2c)
- ui: exports parseSearchParams (#10185) (5d3b816)
🤝 Contributors
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Seno (@s-en-o)
- James Mikrut (@jmikrut)
- Elliot DeNolf (@denolfe)
- Tobias Arends (@1b0t)
- Said Akhrarov (@akhrarovsaid)
- Dan Ribbens (@DanRibbens)
- Kethan Vegunta (@kethan1)
- Marcus Forsberg (@marcusforsberg)
- Germán Jabloñski (@GermanJablo)
v3.11.0 (2024-12-21)
🚀 Features
🐛 Bug Fixes
- ensures generated IDs persist on create (#10089) (957867f)
- db-mongodb: mongodb optimizations (#10120) (b08ff88)
- ui: join table row still shows after deletion (#9783) (a58b9fc)
- ui: ensure unpublish confirmation is reachable when opened in drawers (#10109) (ec853c4)
📚 Documentation
- remove stray backtick from Nested Docs Plugin page (#10118) (08eb13d)
- fix broken links (#10010) (2175451)
📝 Templates
🤝 Contributors
- Sasha (@r1tsuu)
- Sam (@damnsamn)
- Alessio Gravili (@AlessioGr)
- Said Akhrarov (@akhrarovsaid)
- zuccs (@zuccs)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
v3.10.0 (2024-12-20)
🚀 Features
-
jsdocs for generated types, by using admin.description (#9917) (b330873)
-
db-postgres, db-sqlite: drizzle schema generation (#9953) (23f1ed4)
Full type safety on payload.drizzle with a single command
pnpm payload generate:db-schemahttps://github.com/user-attachments/assets/96bddfe6-b598-42ae-8efd-eae7dab7a4e8
-
make
reqpartial and optional in DB / Local API operations (#9935) (0e5bda9) -
db-postgres, db-sqlite: drizzle schema generation (#9953) (23f1ed4)
🐛 Bug Fixes
- unique error message regression (#10064) (0c57eef)
- commit transaction if a user isnt found in forgotPassword operation (#10055) (439dd04)
- db-mongodb: querying by localized polymorphic relationships using objects (#10037) (5753efb)
- db-postgres: relationships v2-v3 migration errors when migrating from v2 to stable v3 (#10080) (07be617)
- db-postgres: query has many relationships nested in row fields (#9944) (#9944) (eee6432)
- examples: awaits getHeaders in auth example (#10100) (7bedd6d)
- examples: add missing header component in auth example (#10088) (dd3c2eb)
- richtext-*: use correct
"for"attribute for label (#10036) (97c120a) - richtext-lexical: incorrect string interpolation in the upload converter (#10069) (6a8aeca)
- richtext-lexical: ui bug when zooming in Safari (#10072) (12dad35)
- storage-vercel-blob: fixes issue where files with spaces in their name would not be retrieved correctly (#10062) (ce74f1b)
- templates: broken preview if alternative auth strategy was used, invalid error handling (#9785) (d8c106c)
- ui: close copy locale modal after locale is changed (#10096) (59fc9d0)
- ui: join field "add new" calculate initial drawer data with relationship inside blocks (#10057) (1d46b6d)
⚡ Performance
🛠 Refactors
- consistent caps for acronyms in variable names (#10101) (a7109ed)
- optimize database schema generation bin script (#10086) (7c4ea5b)
🧪 Tests
- revert default db adapter in integration tests to mongodb (#10079) (034b442)
- consolidates custom id e2e tests (#10061) (97a1f4a)
📝 Templates
- removes
DATABASE_URIenv var fromwith-vercel-websitetemplate .env.example (#10098) (52b1a9a) - update dockerfiles (#10073) (997aed3)
- add Posts to internal links in website template (#10063) (605cf42)
🏡 Chores
- proper docker-compose postgres url (ba0e7ae)
- deps: bump turbo (044c22d)
- examples: updates auth example to latest (#10090) (7292220)
- richtext-slate: exports useElementButton, useLeafButton (#10047) (a501e60)
- templates: remove console.log that logs payload secret for security (#10095) (dec87e9)
🤝 Contributors
- Sasha (@r1tsuu)
- Shrinidhi Shastri (@shrinidhi4u)
- James Mikrut (@jmikrut)
- Dan Ribbens (@DanRibbens)
- Elliot DeNolf (@denolfe)
- Patrik (@PatrikKozak)
- Jacob Fletcher (@jacobsfletch)
- Mason Yekta (@masonyekta)
- Alessio Gravili (@AlessioGr)
- Andrzej Kłapeć (@klapec)
- Germán Jabloñski (@GermanJablo)
- Paul (@paulpopus)
v3.9.0 (2024-12-18)
🚀 Features
- add shouldRestore config to job queue tasks (#10059) (194a8c1)
- join field support relationships inside arrays (#9773) (b0b2fc6)
- db-mongodb: allow to customize mongoose schema options with
collectionsSchemaOptions(#9885) (198763a) - storage-*: add support for browser-based caching via etags (#10014) (ef90ebb)
🐛 Bug Fixes
- encodes upload filename urls (#10048) (1446fe4)
- passes field permissions to custom fields (#10024) (eb037a0)
- beforeValidate previousValue argument (#10022) (99ca1ba)
- cpa: updates CPAs w/
vercel-postgresdb types to usePOSTGRES_URL& updates.env.exampleto use generic env var strings (#10027) (70666a0) - db-postgres:
selectquery on upload fields withhasMany: true(#10029) (2ee3e30) - payload-cloud: improve not found logging (#10058) (f29e633)
- plugin-search: prevent error on undefined value in linkToDoc component (#9932) (29ad1fc)
- templates: prevent image priority and lazy loading incompatibility (#10023) (7037983)
- ui: properly allows configuring
rowsfor thetextareafield (#10031) (61c5e0d) - ui: properly sync field values in bulk upload preventing stale data overriding old docs (#9918) (7787105)
📚 Documentation
📝 Templates
- document local development (#10032) (4bfa329)
- improve gen-templates script (#10015) (e04be4b)
- bump for v3.8.0 (#10013) (2d2a52b)
🔨 Build
⚙️ CI
🏡 Chores
🤝 Contributors
- Paul (@paulpopus)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Elliot DeNolf (@denolfe)
- Javier (@javierlinked)
- Jacob Fletcher (@jacobsfletch)
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Because789 (@Because789)
- Jarrod Flesch (@JarrodMFlesch)
- urquico (@urquico)
- Said Akhrarov (@akhrarovsaid)
- Hugo Knorr (@hkn-wt)
v3.8.0 (2024-12-17)
🚀 Features
- expose
reqtodefaultValuefunction arguments (#9937) (6dea111) - join field admin.defaultColumns (#9982) (2ec4d0c)
- db-vercel-postgres: allow to use a local database using
pginstead of@vercel/postgres(#9771) (41167bf) - graphql: graphQL custom field complexity and validationRules (#9955) (36e21f1)
- storage-vercel-blob: allow fallback to disk if token not set (#10005) (fa49e04)
🐛 Bug Fixes
- remove
localizedproperty fromRowFieldandCollapsibleField(#9672) (c187bff) - edit join field not rendering (#9971) (f5516b9)
- job collection was not added if job config only has workflows and no predefined tasks (#9963) (f48f981)
- db-sqlite: working point field CRUD and default value (#9989) (00909ec)
- templates: adds priority to hero images (#10003) (f54e180)
- ui: does not render row labels until form state returns (#10002) (ed44ec0)
- ui: automatically subscribes custom fields to conditional logic (#9928) (1502e09)
⚡ Performance
🛠 Refactors
- deduplicate and abstract SQL schema building (#9987) (727fba7)
- plugin-seo: strongly type collection and global slugs in plugin config (#9962) (c167365)
📚 Documentation
- fix links in rich-text referencing old lexical sections (#9972) (c50f423)
- broken lexical link (#9991) (b0d648b)
🧪 Tests
📝 Templates
- fix missing ts-ignore in seed script causing build errors (#10001) (8258d5c)
- bump for v3.7.0 (#10000) (0f63db0)
- add hero image field to posts instead of using the meta image for the hero as well (#9999) (12fa4fd)
- conditionally render the live preview listener component (#9973) (050ff84)
- fixes formatting issue with authors and footer not being at the bottom in the website template (#9969) (c2adf38)
- bump for v3.7.0 (#9966) (1d6a935)
⚙️ CI
🏡 Chores
🤝 Contributors
- Sasha (@r1tsuu)
- Dan Ribbens (@DanRibbens)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- zuccs (@zuccs)
- Paul (@paulpopus)
- Jarrod Flesch (@JarrodMFlesch)
- Alessio Gravili (@AlessioGr)
v3.7.0 (2024-12-13)
🚀 Features
- expose
pagination: falseto REST / GraphQL (#9952) (b101fec) - add waitUntil property to payload.jobs.queue (#9950) (0d07ce2)
- allow loading predefined migrations from proper exports (#9872) (d4d79c1)
- allows excluding entities from the nav sidebar / dashboard without disabling its routes (#9897) (b1d92c2)
- ui: allow customizing min height of code editor (#9920) (bae2fe5)
🐛 Bug Fixes
- updates username validation to allow for all special character usage (#9946) (7a8b464)
- join collection read access (#9930) (5af71fb)
- db-postgres:
payload.db.upsertinserts new rows instead of updating existing ones (#9916) (5e39634) - plugin-nested-docs: publishing parent doc should not publish child doc (#9958) (50e7c24)
- translations: capitalized swedish 'collapseAll' translation (#9908) (821bd35)
- ui: awaits form state before rendering conditional fields (#9933) (796df37)
- ui: properly passes
readOnlyprop to email & username auth fields (#9938) (a582431) - ui: truncates richtext fields when displaying within a joins field (#9911) (d9efd19)
🛠 Refactors
- ui: migrates away from React.forwardRef (#9907) (4c57df6)
- ui: export TableColumnsProvider, documentDrawerBaseClass and SelectMany (#9899) (00d438e)
📚 Documentation
- fix mdx error (#9945) (7e3fd5d)
- refactor and improve rich text docs (#9929) (abee24e)
- update Lexical to JSX documentation for RichText component (#9926) (9d324ff)
- fix typo (#9886) (e78b542)
🧪 Tests
📝 Templates
- fix build by reducing strictness of eslint rules (#9943) (d78550c)
- set up prettier, bump next to 15.1.0, bump eslint to v9, set up .vscode configs (#9936) (c7272bb)
- change names of data variables to improve clarity between data and elements (#9912) (23e2f7b)
- fix preview path protocol not being https in production environments (#9910) (6a09fe1)
- fix live preview relative URLs on website template (#9906) (afa08d0)
- bump nextjs version to 15.1 (#9903) (d97d7ed)
- bump for v3.6.0 (#9900) (5c2f72d)
⚙️ CI
- update lint skip rules (0d8643a)
🏡 Chores
- use non-permanent / => /admin redirect so that the browser doesn't cache it for projects that don't redirect (#9948) (d57cad6)
- update what-is-payload.mdx (#9942) (9eb1b50)
- deflake postgres and sqlite integration joins test (#9939) (c298cbc)
- export JobLog and importHandlerPath, add missing id type to JobLog (#9921) (fffab66)
- payload-cloud: improve error log of staticHandler (#9934) (4334940)
- translations: improve password reset message (#9931) (6fffbdb)
- ui: export SearchFilter, EditUpload, FileDetails, PreviewSizes, PreviewButton, ErrorIcon, InfoIcon, SuccessIcon, WarningIcon (#9919) (c8046ca)
🤝 Contributors
- Jessica Chowdhury (@JessChowdhury)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Sasha (@r1tsuu)
- Alessio Gravili (@AlessioGr)
- Patrik (@PatrikKozak)
- Germán Jabloñski (@GermanJablo)
- Nate (@ncaminata)
- Dan Ribbens (@DanRibbens)
- Paul (@paulpopus)
- Marwin Hormiz (@marwinhormiz)
- Joachim Damsgaard (@nrone)
v3.6.0 (2024-12-11)
🚀 Features
- expose
session,dbin migrations to use the active transaction with the database directly (#9849) (b73fc58) - consolidates create and duplicate operations (#9866) (ca52a50)
- allow
wherein payload.jobs.run (#9877) (b1ef28d) - add payload.jobs.runByID (#9875) (09246a4)
- next: adds
suppressHydrationWarningproperty to payload config admin options (#9867) (5223990)
🐛 Bug Fixes
- cannot pass function to client error when defining server-only props in custom field components (#9898) (91e8acc)
- ensures autosave only runs sequentially (#9892) (a0f0316)
- forgotPassword set expiration time (#9871) (306b5d2)
- upgrade pg snapshot during v3 upgrade if needed (#9837) (1e5364f)
- next: thread default ServerProps to view actions and other components that were missing (#9868) (0303b78)
- next: next.js 15.1.0 compatibility by not importing isRedirectError from next/dist (#9878) (5bfc92d)
- next: does not format top-level domains within admin.preview or livePreview.url functions (#9831) (e095222)
- richtext-*: field errors and descriptions were not displayed (#9824) (60ceeb0)
- richtext-lexical: lexical-html export (#9793) (d791db2)
- templates: website infinite reload bug with 404s in production mode (#9843) (d3b8d0c)
- ui: ensures admin.disableListFilter is disabled despite url search params (#9874) (da6bc55)
- ui: refreshes column state during hmr and respects admin.disableListColumn despite preferences (#9846) (f7172b5)
- ui: prevents unwanted data overrides when bulk editing (#9842) (563694d)
🛠 Refactors
- richtext-lexical: export useBlockComponentContext and useInlineBlockComponentContext (#9896) (b83ea84)
- richtext-lexical: export JSXConverter type (#9815) (7599ede)
📚 Documentation
- properly capitalize SQLite and Next.js (#9848) (7642837)
- add missing types, prefer pnpm, fix various typos, discourage using payload from import (#9847) (254d888)
- fix typo (#9845) (36c2714)
🧪 Tests
📝 Templates
- bump for v3.5.0 (#9844) (43a0ce7)
- website template added changes for seed script, relative live preview URLs and fixed endpoint status code (#9808) (b0c9b41)
- bump for v3.5.0 (#9804) (1fdc7cc)
⚙️ CI
- add missing tests to all-green dependency array (#9825) (84abfdf)
- add PR co-authors to contributors section of release notes (e236c28)
- add types testing with
tstyche(#9803) (f09ee0b) - adjust tag detection for post-release-templates (67a35d3)
🏡 Chores
- better default for useAsTitle with custom auth collections (#9841) (fee1744)
- post-release-templates fetch tags (2c0bea8)
- update template lockfiles (a80de3f)
- deps: upgrade dataloader dependency from 2.2.2 to 2.2.3 (#9823) (dc741bb)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Sasha (@r1tsuu)
- Said Akhrarov (@akhrarovsaid)
- James Mikrut (@jmikrut)
- Patrik (@PatrikKozak)
- Dan Ribbens (@DanRibbens)
- Jarrod Flesch (@JarrodMFlesch)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
- Paul (@paulpopus)
- Jayce Pulsipher (@jaycetde)
- Riley Pearce (@rilrom)
- Tom Mrazauskas (@mrazauskas)
v3.5.0 (2024-12-06)
🚀 Features
-
upgrade to React 19 stable and Next.js 15.0.4 (#9801) (8f3f449)
It is recommended to upgrade to React 19 stable and Next.js 15.0.4 in your existing project. The
pnpm.overridesandoverrideskeys are not needed anymore!To do that, change the following in your
package.json:
...
"dependencies": {
- "next": "15.0.3",
+ "next": "15.0.4",
- "react": "19.0.0-rc-66855b96-20241106",
- "react-dom": "19.0.0-rc-66855b96-20241106",
+ "react": "19.0.0",
+ "react-dom": "19.0.0",
...
},
"devDependencies": {
- "@types/react": "npm:types-react@19.0.0-rc.1",
- "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1".
+ "@types/react": "19.0.1",
+ "@types/react-dom": "19.0.1",
},
- "pnpm": {
- "overrides": {
- "@types/react": "npm:types-react@19.0.0-rc.1",
- "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
- }
- },
- "overrides": {
- "@types/react": "npm:types-react@19.0.0-rc.1",
- "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
- }
- export
sanitizeSelectParam,sanitizePopulateParam,senitizeJoinParamsutils (#9777) (afd0b54) - allow to define global label as function (#9759) (0829a35)
- live-preview: supports relative urls for dynamic preview deployments (#9746) (f12b4dc)
- next: supports relative preview URLs (#9755) (1fc9c47)
🐛 Bug Fixes
defaultPopulateandpopulatewith nested to arrays/blocks properties (#9751) (7def6b7)getPayloadgenerate import map only when used in Payload Admin Panel (#9371) (d8f7034)- db-mongodb: bump
mongooseto8.8.3(#9747) (840dde2) - db-postgres: handle
selectquery on select fields (#9607) (dff71ee) - ui: collapsed array state on input change (#9800) (62fc2f5)
- ui: join field ignoring defaultSort and defaultLimit (#9766) (a11243e)
- ui: disable doc submenu when parent button is disabled (#9750) (1ab3be6)
- ui: stale locale value from useLocale (#9582) (fa7ed3f)
- ui: only render header dom node if needed (#9742) (8e26824)
- ui: incorrect label size for group field (#9740) (4a324a9)
📚 Documentation
- adds missing "to" in jobs-queue/overview (#9778) (de53f2a)
- plugin-search: add info on collection reindexing (#9764) (c9ce350)
📝 Templates
- bump for v3.4.0 (#9780) (d3232b9)
- improvements to seed speed on website template and updated hero and collapsible fields (#9779) (19ddd3c)
- fixes the seeding for the website template when using postgres (#9758) (3d1305d)
- improve speed of seed script (#9748) (2321970)
- website: add next sitemap robots disallow config for /admin (#9761) (97d3bb1)
⚙️ CI
- add nightly stale cron (#9802) (a1a0a07)
- explicitly use ubuntu-24.04 instead of latest to ensure compat (#9786) (bbf35a6)
- fetch-depth 0 needed for lint job (a108986)
- main workflow improvements (#9784) (4cc6f4c)
- only run tests when needed via needs_tests filter (#9781) (cb691e0)
- post-release-templates assign PR to user that triggered (ef8d3c9)
- post-release-templates always use latest tag with workflow_dispatch (28c6b2a)
- use PAT for post-release-templates (c2ff9b1)
- ensure clean all script does not error after retrying step, by installing globby and chalk globally (#9745) (84a5b40)
- ensure triage actions work for PRs from forks (12a8bba)
🏡 Chores
- cpa: updates
.env.exampleenv vars along side.envvars based on selected DB (#9757) (1aa23d3) - richtext-lexical: remove outdated custom block component examples (#9754) (61a4656)
- templates: migrate to new richtext component in website template (#9615) (89db8fb)
- translations: improved serbian translations for the lexical editor (#9795) (10eab87)
- ui: expose onInputChange from react-select in SelectInput component (#9728) (8f785e1)
v3.4.0 (2024-12-04)
🚀 Features
🐛 Bug Fixes
- hidden and disabled fields cause incorrect field paths (#9680) (a53c1d5)
- join field description, custom components and loading state (#9703) (67179a7)
- error after view is left idle on edit views (#9709) (fbb59ba)
- copy data from locale transaction error (#9673) (d047f01)
- richtext-lexical: ensure hooks from sub-fields receive document data and doc props, and not node data and doc props (#9406) (50823be)
- ui: copy to locale incorrect label when locale label is defined as object (#9705) (18f9f35)
📚 Documentation
- add output standalone in docker deployment section (#9738) (340bc85)
- sqlite is also supported (#9690) (d118544)
- fix typo in Collections.mdx (#9696) (0f2feac)
📝 Templates
- vercel migrations (#9730) (32f0f34)
- website template copy code button darkmode behavior (#9715) (fd9a007)
- vercel website template migrations wrong adapter import (#9708) (01d5746)
- website: add sitemap support to website template (#9727) (fce210b)
- website: add new favicons and og images to website template (#9716) (1bd689b)
- website: website remove maxDepth from references in link field (#9702) (d2007b1)
⚙️ CI
- template bump workflow (#9733) (f5aad49)
- create separate post-release-templates workflow (0c34f27)
- pin specific github-releases-to-discord version (7bd1a16)
🏡 Chores
- adds jsdocs for
auth.forgotPassword.expirationprop (#9739) (c7218c0) - fix broken links in collections.mdx (#9697) (2ef7de5)
- workflow rename (188466d)
- change deprecation warning for getPayloadHMR to warning (#9700) (643c92d)
- next: remove unused sanitizeEditViewProps fn (#9569) (92a01c2)
- templates: add initial migrations for vercel with website template (#9706) (3f32224)
🤝 Contributors
- Patrik (@PatrikKozak)
- Elliot DeNolf (@denolfe)
- DracoBlue (@DracoBlue)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Nate (@ncaminata)
- Jacob Fletcher (@jacobsfletch)
- DesertShadow (@MotorcycleEnjoyer)
- Dan Ribbens (@DanRibbens)
- Jarrod Flesch (@JarrodMFlesch)
- Sasha (@r1tsuu)
- Francisco Lourenço (@franciscolourenco)
v3.3.0 (2024-12-03)
🚀 Features
- disableLocalStrategy with auth fields still enabled (#9579) (6104fe5)
- export built-in field validations (#9622) (519752f)
- examples: add custom server example [skip-lint] (#9641) (fdfa07b)
- ui: adds
beforeInput&afterInputprops forarrays,blocks,collapsible,group,radio, &relationshipfields. (#9674) (58b7415) - ui: upgrade react-datepicker dependency from 6.2.0 to 7.5.0 (#9654) (9d72408)
- ui: export CodeEditor (#9650) (963387f)
- ui: export TabsProvider and TabComponent (#9647) (f151723)
🐛 Bug Fixes
- throw proper error if import handler paths are not able to be imported, improve import handler path docs (#9679) (0dbfc23)
- ensure jobs do not retry indefinitely by default, fix undefined values in error messages (#9605) (a89d544)
- latest: true version disappear on parallel writes (#9032) (631edd4)
- duplicate afterRead collection hook call on loginOperation (#9664) (c5fe021)
- job task output data was not fetched and restored, if task failed previously (#9651) (f076797)
- prevent workflow destructuring errors for failing tasks (#9649) (4cd31ce)
- ensure job errors are saved in payload (#9644) (e6ea68e)
- live-preview: populates localized relationships in client-side live preview (#9617) (3d1a065)
- next: remove keyboard focus for closed nav items (#9558) (2d2e7d5)
- plugin-search: delete proper search document when
dochas the samevaluebut differentrelationTo(#9616) (b896507) - richtext-lexical: ensure lexical doesn't break if used without react installed (#9620) (030b759)
- richtext-lexical: add form id to drawSlug (#9613) (9892303)
- translations: changes rs and rs-Latin dateFNSkey to proper locale instead of en-US (#9621) (2b4522b)
- ui: data disappearing when form state updates in globals (#9682) (d1de106)
- ui: properly animates height for dynamically rendered children (#9665) (d04cea1)
- ui: upgrade sonner from 1.5.0 to 1.7.0 (#9666) (24c75b0)
- ui: upgrade react-select, fixes type issues with select input (#9653) (73e0e25)
🛠 Refactors
📚 Documentation
- add payload.auth to local api (#9632) (cf34d3a)
- add upgrade from previous beta section to migration guide (#9642) (1e8c9d3)
- fix links to
/access-control/overview(#9619) (bc2d7c9) - adds missing comma to example config in localization.mdx (#9618) (aa5dd8a)
⚙️ CI
- allow more commit types in release notes (#9677) (e4c3c5b)
- add back CI-level automatic retrying for failing int and e2e tests (#9652) (0b445c8)
- add github-releases-to-discord (702df1f)
- small tweaks to post-release (f150a68)
🏡 Chores
- upgrade all dependencies used to build payload (swc, esbuild, react compiler, babel) (#9658) (877b899)
- upgrade all react and next-related packages (#9655) (71ba4a8)
- add contributor count badge to readme (0716128)
- examples: migrates form-builder example to 3.0 (#9681) (40f5c72)
- scripts: fix generate template variations script (#9671) (5b3079a)
🤝 Contributors
- Paul (@paulpopus)
- Dan Ribbens (@DanRibbens)
- Patrik (@PatrikKozak)
- Harley Salas (@HarleySalas)
- Alessio Gravili (@AlessioGr)
- Elliot DeNolf (@denolfe)
- Tobias Arends (@1b0t)
- Jacob Fletcher (@jacobsfletch)
- Said Akhrarov (@akhrarovsaid)
- Riley Pearce (@rilrom)
- Yunsup Sim (@SimYunSup)
- Sasha (@r1tsuu)
- Vasileios Drosatos (@drosi94)
v3.2.2 (2024-11-29)
🚀 Features
🐛 Bug Fixes
- add generic to LabelFunction to prevent type error for custom translation keys (#9335) (27eeac2)
- do not send admin dependencies to client (#9583) (3da9be0)
- incorrect formState after doc save (#9573) (4b302f2)
- plugin-sentry: capture non
APIErrorerrors to sentry (#9595) (61a51ca) - richtext-lexical: allow exiting the RTE with the keyboard in Firefox (#8654) (3c35d81)
- richtext-lexical: various JSX converter issues (#9570) (17c7945)
- ui: ensure UI is reactive to HMR changes, without having to refresh the page (#9602) (c4327f2)
- ui: css is not defined error in production build (#9603) (36a6a19)
- ui: retains search params when navigating back (#9576) (3961223)
- ui: ensure Form submit button only uses onClick handler when needed, as that was causing issues with password manager extensions (#9572) (ca07c9f)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Sasha (@r1tsuu)
- Marwin Hormiz (@marwinhormiz)
- Chris Aprea (@aprea)
- Said Akhrarov (@akhrarovsaid)
- Arne Wiese (@wiesson)
- Jarrod Flesch (@JarrodMFlesch)
- Riley Pearce (@rilrom)
- Jacob Fletcher (@jacobsfletch)
- Elliot DeNolf (@denolfe)
v3.2.0 (2024-11-27)
🚀 Features
- adds ability to copy data from across locales (#8203) (601759d)
- deprecates react-animate-height in favor of native css (#9456) (0757e06)
- plugin-search: added support for reindexing collections on demand (#9391) (defa13e)
- richtext-lexical: export hasText helper (#9484) (21db058)
- richtext-lexical: lexical => JSX converter (#8795) (bffd98f)
⚡ Performance
- faster page navigation by speeding up createClientConfig, speed up version fetching, speed up lexical init. Up to 100x faster (#9457) (fd0ff51)
🐛 Bug Fixes
- utilizes override access false (#9550) (2248be4)
- overrides entity visibility within drawers (#9546) (5d18a52)
- allows for emails to be non unique when allowEmailLogin is false (#9541) (67a9d66)
- skip validation of
wherequery paths from access result (#9349) (a9f511d) - corrects localizer positioning in RTL mode (#9494) (910b681)
- next: properly threads field permissions through versions diff (#9543) (f19053e)
- plugin-form-builder: allow overrides to the payment fields group (#9522) (71c2f63)
- plugin-seo: enforce readonly on the client (#9536) (44c0cdb)
- richtext-lexical: prevent use of text formats whose features were not enabled (#9507) (90f893a)
- templates: website priority with loading lazy on medium hero error (#9537) (dac42ff)
- ui: remove overflow hidden from app-header wrappers since it breaks any popout elements (#9525) (82145f7)
🤝 Contributors
- Jarrod Flesch (@JarrodMFlesch)
- Anthony Bouch (@58bits)
- Germán Jabloñski (@GermanJablo)
- Jacob Fletcher (@jacobsfletch)
- Said Akhrarov (@akhrarovsaid)
- Alessio Gravili (@AlessioGr)
- Jessica Chowdhury (@JessChowdhury)
- Elliot DeNolf (@denolfe)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- Sasha (@r1tsuu)
- Harley Salas (@HarleySalas)
v3.1.1 (2024-11-25)
🚀 Features
- templates: website template performance improvements (#9466) (aa1d300)
- templates: website optimisations for image sizes and loading (#9447) (be8cd7f)
⚡ Performance
flattenedFieldscollection/global property, remove deep copying invalidateQueryPaths(#9299) (cae300e)
🐛 Bug Fixes
- incorrect locale registration in datepicker (#9516) (6ffd4c7)
- improper spread of list preferences (#9510) (f136a7d)
- correct migrations sorting in
getMigrations(#9330) (e176b8b) - run queues via the
/payload-jobs/runendpoint without workflows (#9509) (b96475b) - ensure
deleteJobOnCompleteproperty for jobs works (#9283) (7eb388d) - db-mongodb:
sanitizeRelationshipIDsnamed tabs within tabs (#9400) (b5f89d5) - db-postgres: allow to clear select fields with
hasMany: true(#9464) (e5cc915) - templates: website template firefox logo fix and images fix on vercel (#9459) (23d54a7)
- templates: vercel website template payload config regression (#9455) (09abebd)
- templates: fixes imports in website template from @payloadcms/ui to be direct (#9451) (90fedbc)
- translations: add sl to acceptedLanguages (#9506) (0c7e418)
- ui: prevents column reset on sort (#9517) (8383426)
- ui: z-index on react-select menu (#9512) (af096a3)
🤝 Contributors
- Tylan Davis (@tylandavis)
- Sasha (@r1tsuu)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Jacob Fletcher (@jacobsfletch)
- Francisco Lourenço (@franciscolourenco)
- Jarrod Flesch (@JarrodMFlesch)
- Jeffrey Arts (@JeffreyArts)
- Harley Salas (@HarleySalas)
- Indy (@IndySeh)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
v3.1.0 (2024-11-22)
🚀 Features
- add skip and force accept flags to migration commands (#8843) (fb3242d)
- richtext-lexical: more powerful custom Block RSCs, improved selection handling (#9422) (9e31e17)
- richtext-lexical: allow customizing maxActiveItems for toolbar groups (#9417) (38de760)
- richtext-lexical: export lexical drawer hooks (#9415) (3b68671)
- templates: update website styles and new home hero image (#9413) (2036a56)
🐛 Bug Fixes
- invalid
payload.collectionstype (#9414) (91dcf6d) - unable to load documents with non-standard ids (#9407) (ee1a91e)
- error when opening admin panel without any permissions (#9392) (9470f9b)
- db-postgres: joins with versions and hasMany relationship (#9370) (d499de1)
- live-preview: client-side live preview cannot clear all array rows (#9439) (ae6c71b)
- next: threads server props to custom providers (#9412) (f5683b0)
- next:
next@15.0.3compatibillity for turbopack warnings patch (#9341) (f2205d1) - richtext-lexical: error when changing block collapsed state in rare cases (#9421) (b9cc4d4)
- richtext-lexical: slash menu from + button did not trigger item select action (#9420) (a891e98)
- richtext-lexical: slash menu query doesn't disappear after selecting slash menu item (#9396) (3d0424b)
- richtext-lexical: preserve indent and text-align when converting Lexical <-> HTML (#9165) (0960290)
- templates: website template breaking change by renaming hero image to jpg (#9416) (18b139b)
- ui: add disabled attribute to blocks drawer toggler (#9424) (27acdae)
- ui: stale server components when rows are moved (#9410) (e3866c4)
- ui: error when collapsing sidebar groups (#9393) (90e37fe)
🤝 Contributors
- Jacob Fletcher (@jacobsfletch)
- Riley Pearce (@rilrom)
- Jessica Chowdhury (@JessChowdhury)
- Germán Jabloñski (@GermanJablo)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Sasha (@r1tsuu)
- Friggo (@MrFriggo)
- Patrik (@PatrikKozak)
- Jarrod Flesch (@JarrodMFlesch)
v3.0.2 (2024-11-20)
🐛 Bug Fixes
- allow self referencing relationships when adding new collections to config (#9360) (4030e21)
- next: properly sets doc id types when using postgres (#9381) (07a9125)
- next: autosave document rendering (#9364) (9e85be0)
- richtext-lexical: use copy of @lexical/markdown that does not install @lexical/code (#9382) (5db7e1e)
- ui: prioritize server rendered Actions in ActionsProvider (#9379) (439dcd4)
- ui: invalid permissions passed to group and named tab sub-fields (#9366) (c67291d)
- ui: bulk update and delete ignoring search query (#9377) (ef37483)
🤝 Contributors
- Alessio Gravili (@AlessioGr)
- Jacob Fletcher (@jacobsfletch)
- Jarrod Flesch (@JarrodMFlesch)
- Elliot DeNolf (@denolfe)
- Said Akhrarov (@akhrarovsaid)
- Evan Cusack (@cusacke)
- Patrik (@PatrikKozak)
v3.0.1 (2024-11-19)
⚡ Performance
🐛 Bug Fixes
- allow setting admin path route from config (#8085) (d3b0a04)
- templates: website logo not showing (#9334) (7f65c83)
- templates: seeding in website template moved to a separate route so timeout can be customised (#9327) (26cb1e1)
- ui: could not save selection from upload has many drawer (#9325) (f42b1e1)
- ui: client side doc data not updating after save (#9340) (661f450)
- ui: show required indicator for select fields (#9348) (2c7ea63)
- ui: proper permissions within version diff view (#9346) (188baec)
- ui: addFieldRow set modified (#9324) (0f3f6e7)
🤝 Contributors
- Elliot DeNolf (@denolfe)
- Jarrod Flesch (@JarrodMFlesch)
- Said Akhrarov (@akhrarovsaid)
- Jessica Chowdhury (@JessChowdhury)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Marc Maceira (@marcmaceira)
- Paul (@paulpopus)
- James Mikrut (@jmikrut)
- garrettgrohman (@garrettgrohman)
- Sean Zubrickas (@zubricks)
- Alessio Gravili (@AlessioGr)
- Blain Maguire (@BlainMaguire)
This is a major release that includes a re-architecture of Payload from an Express + React Router SPA to the Next.js App Router + RSCs. In addition to this architectural change, we've also shipped a ton of large features, miscellaneous fixes, and DX improvements.
Architectural changes
- Payload now installs fully in any Next.js app router
- You can now deploy your entire project (frontend and backend) in one app
- Payload can now be deployed serverless on platforms like Vercel
- Everything Payload does now works seamlessly within any Next.js project
- You can now use the Payload Local API in Server Components and Server Functions
- Postgres, Live Preview, and Lexical have been marked as stable
- All Payload exports have been significantly cleaned up and organized
- Payload is now an ESM project
- Payload is now modular, and we now publish new packages
ui,next,translations, andgraphql - The Payload config is now server-side only, and works in any Node environment
- Server-side HMR works out of the box - removing the need for
nodemon
Large features
- Join field - bi-directional relationships, more control over the database schema, and more
- Select API - select specific fields when querying using Local API
- Jobs Queue - background jobs fully supported in Payload with no third-party dependencies
- Populate / DefaultPopulate API - determine which fields should be retrieved when Payload populates relationships
- Lexical blocks and inline blocks - easily make Payload Blocks available in Lexical as custom rich text features
- SQLite database adapter now available
- Vercel Postgres database adapter released, specifically for serverless deploys on Vercel
- Live Preview server components support
- Admin UI has been refreshed
hasManyupload fields are now supported- Bulk upload has been added
- Document Locking pattern has been implemented, which shows if someone is currently editing a document
- Ability to publish individual locales one at a time has been added
- Lexical now has Table support
Small but still important features
- New Payload logo (thanks Candycode!)
- New Resend email adapter is now available
- Postgres now saves single, monomorphic relationships directly in a column rather than in
_relstable - GraphQL has been abstracted into a specific Next.js route handler, and no longer affects Payload initialization at all
- React Compiler has been introduced into Payload build pipeline
- You can now run migrations on init, rather than only in CI (helpful for long-running servers)
- New Local API operations -
count,countVersions,countGlobalVersions,upsert - Adds
baseListFilterfunction to allow enforced list view filters based on user - Lexical fixed toolbar option has been added
- Optimized the way that relational DBs store relations
- Postgres point field is now supported
- Postgres deep JSON querying is now supported
- Cuztomize Drizzle schema by passing in your own, which is handled outside of Payload
- Fully typed i18n
tfunction - Focal point data is now stored on uploads
- Adds ability to login with username rather than email
- New pattern for passing custom server / client props to custom components
- Email adapter pattern, including optimized Resend HTTP client
- Reduced / optimized the shape of
/accesspermissions results - Allows sorting by multiple fields
- MongoDB now saves ObjectID for relationships
- Adds more control over log level customization
- Downgrades common errors like NotFound or Forbidden to info
- Swaps out
react-toastifyforsonner - True "virtual" fields via
virtual: true - Adds ability to customize filenames before upload
- Adds locale indicators to localized field labels
- Scope all payload css to payload-default layer
- Document duplicate / delete from drawers
⚠️ BREAKING CHANGES
This release includes breaking changes. In order to update from version 2 to 3, please review the migration docs.
🤝 Contributors
- James Mikrut (@jmikrut)
- Elliot DeNolf (@denolfe)
- Dan Ribbens (@DanRibbens)
- Said Akhrarov (@akhrarovsaid)
- Germán Jabloñski (@GermanJablo)
- Jarrod Flesch (@JarrodMFlesch)
- Sophia Michelle Andren (@sandren)
- Patrik (@PatrikKozak)
- Nate (@ncaminata)
- mattddean (@mattddean)
- Sasha (@r1tsuu)
- Jacob Fletcher (@jacobsfletch)
- Mikkel Wied Frederiksen (@mikkelwf)
- Alessio Gravili (@AlessioGr)
- Paul (@paulpopus)
- Tobias Odendahl (@tak-amboss)
- Jessica Chowdhury (@JessChowdhury)
- Ruy Monteiro (@ruymon)
- Nathan Clevenger (@nathanclevenger)
- Kendell Joseph (@kendelljoseph)
- Steve (@steventsvetkov)
- Mikkel Madsen (@miguel2650)
- Tylan Davis (@tylandavis)
- Javier (@javierlinked)
- Timothy Choi (@tyteen4a03)
- Andreas Bernhard (@abernh)
- Friggo (@MrFriggo)
- Jesper We (@JesperWe)
- vahacreative (@vahacreative)
- Manuel Leitold (@agrippa1994)
- Gregor Gabrič (@GregorGabric)
- Konsequanzheng (@Konsequanzheng)
- Brandon Kocur (@Brandoko)
- Anders Semb Hermansen (@andershermansen)
- Hristiyan Dodov (@hdodov)
- MotorcycleEnjoyer (@MotorcycleEnjoyer)
- Because789 (@Because789)
- Ante (@azivkovi)
- Mike Bailey (@mykz)
- Riley Pearce (@rilrom)
- Louis Ba (@muyunz)
- gervickas.js (@wellitongervickas)
- Frank Omondi (@Dofften)
- Thành Trang (@trangcongthanh)
- Victor Winberg (@VictorWinberg)
- Florian Quiblier (@fofoy)
- Christoffer Hasselberg (@stofolus)
- Hampus Wallentin Olsen (@hampusolsen)
- Bruno Crosier (@brunocrosier)
- Alexander (@Arctomachine)
- Francisco Lourenço (@franciscolourenco)
- Giuseppe Chiruzzi (@xfloor)
- Ritsu (@r1tsuu)
- Willy Brauner (@willybrauner)
- Michel v. Varendorff (@mvarendorff)
- Lynn Dylan Hurley (@lynndylanhurley)
- Hulpoi George-Valentin (@GeorgeHulpoi)
- Jasper Beaurain (@JasperBeaurain)
- Wilson (@WilsonLe)
- Harley Salas (@HarleySalas)
- Frederic Perron (@FredPerr)
- Viet-Tien (@nvti)
- Patryk Kowalczyk (@Patryk-Kowalczyk)
- Leo Hilsheimer (@linobino1)
- zvizvi (@zvizvi)
- Francis Turmel (@fturmel)
2.30.4 (2024-11-11)
Features
Bug Fixes
- db-postgres: sort by localized fields (#9016) (9c25754)
- edit many modal draft action button order and style (#9046) (a907480), closes #9045
- error saving after duplicating blocks with nested items (#8814) (eba777c)
- list drawer relationship not displaying (#9011) (169da5c)
- querying relationships by
idpath with REST (#9014) (a0bd706)
2.30.2 (2024-10-17)
Bug Fixes
- applies resize after cropping if
resizeOptionsare defined (#8535) (f2284f3) - calculates correct aspect ratio dimensions on sharp based files (#8510) (9d05b82), closes #8317
- db-postgres: build indexes for relationships (#8446) (d05e3b0)
- db-postgres: port many various fixes from 3.0 (#8468) (1347b6c)
- db-postgres: select hasMany nested to array + tab/group (#8739) (0efc610)
- richtext-lexical: add target _blank for new-tab in linkFeature (#8571) (61e8ce1), closes #8569
2.29.0 (2024-09-25)
Features
Bug Fixes
- treat empty strings as null / undefined for
existsqueries (#8336) (31d0b30), closes #7714 - db-postgres: localized items in arrays with versions (#8334) (c86526b)
- db-postgres: querying on array within a relationship field (#8153) (170ea5b)
- db-postgres: sanitize tab/group path for table name (#8010) (ba7a043)
2.26.0 (2024-08-09)
Features
- adds classnames to edit, list views (#7595) (7f39afa)
- adds upload's relationship thumbnail (#5015) (39e110e)
- ui: expose custom errors in delete many (#7439) (3e780b9)
Bug Fixes
- db-postgres: localized array inside blocks field (#7458) (a308d63), closes #5240
- deprecated
inflightpackage (#6558) (eca1517), closes #6492 - enable
relationship&uploadfield population inversions(#7533) (9865ae9) - filtering by non-poly
relationshipswithnot_equalsoperator (#7573) (efa56ce), closes #5212 #6278 - filtering by polymorphic
relationshipswithdraftsenabled (#7565) (907d7d1), closes #6880 - retained date milliseconds (#7393) (9c9e689), closes #6108
- prevents
hasManytext going outside of input boundaries (#7454) (1a0ef48), closes #6034 - previousValue missing from ValidateOptions type (#6931) (fca5a40)
- render singular label for
ArrayCellwhen length is 1 (#7585) (fc4d24a), closes #6099
2.24.2 (2024-07-24)
Features
- db-mongodb: add jsonParse flag to mongooseAdapter that preserves existing, untracked MongoDB data types (#7338) (f96cf59)
Bug Fixes
- allow autosave relationship drawers to function properly (#7325) (69e7b7a)
- db-mongodb: removes precedence of regular chars over international chars in sort (#6923) (0058660), closes #6719
- fetches and sets permissions before setting user (#7337) (8259611)
- plugin-stripe: properly types async webhooks (#7316) (c6da99b)
2.24.1 (2024-07-22)
Bug Fixes
2.22.0 (2024-06-20)
Features
Bug Fixes
- adjust json field schema for defaultValue (#6872) (58427ff)
- array row validation messages (#6780) (68ea693)
- cannot use empty string in defaultValue on text-like fields (#6842) (3364385)
- corrects redirect with lonely slash on login (#6784) (dae56e6)
- db-postgres: cascade delete FKs on hasMany relationships (#6735) (9ecc6c8)
- payload, db-mongodb: querying relationships with
in¬_in(#6773) (f6ba3be), closes #6741 - plugin-cloud-storage: missing error handling for invalid plugin config, leading to unexpected webpack errors (#6786) (015aafd)
- ui: withinCollapsible always false from useCollapsible provider (#6783) (9f0aaf0), closes #6760
- unflattening json objects containing keys with periods (#6834) (025306f), closes #5378
- upgrade swc, fixing swc issues on linux (#6809) (1c986a9)
2.20.0 (2024-06-11)
Features
Bug Fixes
- adds multi select inputs for
number&textfields in where builder (#6662) (e3003b4) - create sharp file for
fileHasAdjustmentsfiles orfileIsAnimatedfiles (#6710) (921a5c0) - enable SaveDraft button when creating new documents (#6672) (63bc6ae), closes #6671
- handles localized nested relationship fields in versions (#6679) (8a62298)
- live preview device position when using zoom (#6667) (9525511)
- only use
metadata.pagesfor height if animated (#6729) (2f9ed34) - removes
array&blocks&groupfields from sort (#6574) (507e095), closes #6469 - withinCollapsible should be undefined by default (#6666) (37c8386), closes #6658
2.19.0 (2024-06-04)
Features
Bug Fixes
- pin ajv to 8.14.0, as 8.15.0 is broken (#6607) (4a54aa7)
- adds new
userEmailAlreadyRegisteredtranslations (#6549) (56c6700), closes #6535 - adjusts sizing of remove/add buttons to be same size (#6527) (a352ebc), closes #6098
- focalPoint undefined handling (#6552) (fcfc3c5)
- pagination on polymorphic relationship field requesting entries with page parameter set to NaN (#5366) (547acfe)
- safely evaluates
field.adminin WhereBuilder (#6534) (4f9d78d) - separate sort and search fields when looking up relationship. (#5964) (c009219), closes #4815 #5222
- ui field validation error with
admin.disableListColumnproperty (#6530) (eeddece), closes #6521 - ui: blocks browser save dialog from opening when hotkey used with no changes (#6365) (8f03cd7), closes #214
2.17.0 (2024-05-15)
Features
-
adds misc translations to API view and react select (#6138) (30e535b)
-
richtext-lexical: remove LexicalBlock, RichTextFieldRequiredEditor and FieldWithRichTextRequiredEditor types (#6279) (9df5ab8)
Bug Fixes
- appends
editDepthvalue toradio&checkboxIDs when inside drawer (#6181) (69c93d3) - collection labels with locales not working when creating new doc (#5995) (51efe4f)
- safely access cookie header for uploads (#6367) (de92c50)
- step-nav breadcrumbs ellipsis (#6345) (d02b1fb)
⚠ BREAKING CHANGES
- richtext-lexical: remove LexicalBlock, RichTextFieldRequiredEditor and FieldWithRichTextRequiredEditor types (#6279)
2.15.0 (2024-05-03)
Features
- add isSortable to arrays and blocks (#5962) (5c58bd3)
- use filterOptions in list relationship filter (#6156) (23f3eb1)
Bug Fixes
- bulk publish from collection list (#6063) (84570e6)
- cascade draft arg in nested GraphQL relationship queries (#6141) (a8ac8b4)
- GraphQL nested relationships not respecting req locale (#6117) (3fccd34)
- hide unusable fields from collection filter select (#6135) (2be5ad0)
- incorrect
localesNotSavedtranslation (#5996) (af67749) - plugin-cloud: purge cache for all sizes (#5301) (831f1ff)
- properly adds
readonlystyles to disabledradiofields (#6176) (9b7e62d) - resets filter state when param state change within route (#6169) (6e38cc2)
- richtext-lexical: drag and add block handles disappear too quickly for smaller screen sizes. (#6145) (24f6972)
- richtext-lexical: floating toolbar caret positioned incorrectly for some line heights (#6151) (36b1f5a)
- sanitizes fields in default edit view for drawer content (#6175) (43dab5c)
- version restoration (#6039) (91bac9c)
2.14.0 (2024-04-24)
Features
Bug Fixes
- bulk publish (#6006) (c11600a)
- db-postgres: extra version suffix added to table names (#5939) (bd8b512)
- db-postgres: Fixes nested groups inside nested blocks (#5882) (e258866)
- db-postgres: row table names were not being built properly - v2 (#5961) (9152a23)
- header filters (#5997) (ad01c67)
- min/max attributes missing from number input (#5779) (985796b)
- removes
equals¬_equalsoperators from fields withhasMany(#5885) (a8c9625)
2.13.0 (2024-04-19)
Features
- allow configuration for setting headers on external file fetch (ec1ad0b)
- db-*: custom db table and enum names (#5045) (9bbacc4)
- json field schemas (#5726) (2c402cc)
- plugin-seo: add Chinese translation (#5429) (fcb29bb)
- richtext-lexical: add HorizontalRuleFeature (d8e9084)
- richtext-lexical: improve floating handle y-positioning by positioning it in the center for smaller elements. (0055a8e)
Bug Fixes
- adds type error validations for
emailandpasswordin login operation (#4852) (1f00360) - avoids getting and setting doc preferences when creating new (#5757) (e3c3dda)
- block field type missing dbName (#5695) (e7608f5)
- db-mongodb: failing
containsquery with special chars (#5774) (5fa99fb) - db-mongodb: ignore end session errors (#5904) (cb8d562)
- db-mongodb: version fields indexSortableFields (#5863) (fe0028c)
- db-postgres: hasMany relationship query contains operator (#4212) (608d6d0)
- db-postgres: issue querying by localised relationship not respecting locale as constraint (#5666) (44599cb)
- db-postgres: query hasMany fields with in (#5881) (6185f8a)
- db-postgres: relationship query pagination (#5802) (65690a6)
- db-postgres: validateExistingBlockIsIdentical localized (#5839) (4c4f924)
- duplicate document multiple times in quick succession (#5642) (373787d)
- missing date locales (#5656) (c1c8600)
- number ids were not sanitized to number in rest api (51f84a4)
- passes parent id instead of incoming id to saveVersion (#5831) (25c9a14)
- plugin-seo: uses correct key for ukrainian translation (#5873) (e47e544)
- properly handle drafts in bulk update (#5872) (ad38f76)
- req.collection being lost when querying a global inside a collection (#5727) (cbd03ed)
- richtext-lexical: catch errors that may occur during HTML generation (#5754) (9b44296)
- richtext-lexical: do not allow omitting editor prop for sub-richtext fields within lexical defined in the payload config (#5766) (6186493)
- richtext-lexical: incorrect floating handle y-position calculation next to certain kinds of HTML elements like HR (de5d6cc)
- richtext-lexical: limit unnecessary floating handle positioning updates (a00439e)
- richtext-lexical: pass through config for schema generation. Makes it more robust (#5700) (cf135fd)
- richtext-lexical: use correct nodeType on HorizontalRule feature HTML converter (#5805) (3b1d331)
- updates type name of
CustomPublishButtonPropstoCustomPublishButtonType(#5644) (7df7bf4) - updates var (9530d28)
- use isolateObjectProperty function in createLocalReq (#5748) (c0ba6cc)
- uses find instead of fieldIndex for custom ID check (509ec67)
⚠ BREAKING CHANGES
- richtext-lexical: do not allow omitting editor prop for sub-richtext fields within lexical defined in the payload config (#5766)
2.12.0 (2024-04-03)
Features
- plugin-seo: adds Norwegian translation (#5621) (589b492)
- richtext-*: add ability to provide custom Field and Error components (#5574) (02d2c51)
Bug Fixes
- db-postgres: error on delete having joins (#5459) (9169230)
- image resize tiff files (#5415) (8184e00)
- number field with hasMany accept defaultValue array (#5618) (a3ae416)
- regression of filterOptions using different transaction (#5169) (3ceb6ef)
- richtext-lexical: Blocks: generated output schema is not fully correct (#5259) (e7f6bfb)
- richtext-lexical: checklist html converter incorrectly outputting children (#5570) (2e5400f)
- richtext-lexical: disable instanceof HTMLImageElement check as it causes issues when used on the server (2164dcc)
- richtext-lexical: Link: add open-in-new-tab to html converter (23df60d)
- richtext-lexical: properly center add- and drag-block handles (#5568) (48dc116)
- sets beforeValidateHook req type to required (#5608) (e10d5df)
2.11.2 (2024-02-23)
Features
Bug Fixes
- Add Context Provider in EditMany Component (#5005) (70e57fe)
- db-mongodb: unique sparse for not required fields (#5114) (815bdfa)
- db-postgres: set _parentID for array nested localized fields (#5117) (ceca5c4)
- disabling API Key does not remove the key (#5145) (7a7f0ed)
- handle thrown errors in config-level afterError hook (#5147) (32ed95e)
- only replace the drawer content with full edit component if it exists (#5144) (0a07f60)
- transaction error from access endpoint (#5156) (ad42d54)
2.11.1 (2024-02-16)
Features
- db-postgres: adds idType to use uuid or serial id columns (#3864) (d6c2578)
- db-postgres: reconnect after disconnection from database (#5086) (bf942fd)
- plugin-search: add req to beforeSync args for transactions (#5068) (98b87e2)
- richtext-lexical: add justify aligment to AlignFeature (#4035) (#4868) (6d6823c)
- richtext-lexical: AddBlock handle for all nodes, even if they aren't empty paragraphs (#5063) (00fc034)
- richtext-lexical: Update lexical from 0.12.6 to 0.13.1, port over all useful changes from playground (#5066) (0d18822)
Bug Fixes
- db-mongodb: find versions pagination (#5091) (5d4022f)
- db-postgres: query using blockType (#5044) (35c2a08)
- filterOptions errors cause transaction to abort (#5079) (5f3d016)
- plugin-form-builder: hooks do not respect transactions (#5069) (82e9d31)
- remove collection findByID caching (#5034) (1ac943e)
- richtext-lexical: do not remove adjacent paragraph node when inserting certain nodes in empty editor (#5061) (6323965)
- uploads: account for serverURL when retrieving external file (#5102) (25cee8b)
⚠ BREAKING CHANGES: @payloadcms/richtext-lexical
- richtext-lexical: Update lexical from 0.12.6 to 0.13.1, port over all useful changes from playground (#5066)
- You HAVE to make sure that any versions of the lexical packages (IF you have any installed) match the lexical version which richtext-lexical uses: v0.13.1. If you do not do this, you may be plagued by React useContext / "cannot find active editor state" errors
- Updates to lexical's API, e.g. the removal of INTERNAL_isPointSelection, could be breaking depending on your code. Please consult the lexical changelog.
2.10.1 (2024-02-09)
Bug Fixes
- clearable cells handle null values (#5038) (f6d7da7)
- db-mongodb: handle null values with exists (#5037) (cdc4cb9)
- db-postgres: handle nested docs with drafts (#5012) (da184d4)
- ensures docs with the same id are shown in relationship field select (#4859) (e1813fb)
- query relationships by explicit id field (#5022) (a0a58e7)
- richtext-lexical: make editor reactive to initialValue changes (#5010) (2315781)
2.10.0 (2024-02-06)
Features
- add more options to addFieldStatePromise so that it can be used for field flattening (#4799) (8725d41)
- extend transactions to cover after and beforeOperation hooks (#4960) (1e8a6b7)
- previousValue and previousSiblingDoc args added to beforeChange field hooks (#4958) (5d934ba)
- re-use existing logger instance passed to payload.init (#3124) (471d211)
- richtext-lexical: Blocks: generate type definitions for blocks fields (#4529) (90d7ee3)
- use deletion success message from server if provided (#4966) (e3c8105)
Bug Fixes
- db-postgres: filtering relationships with drafts enabled (#4998) (c3a3942)
- db-postgres: handle schema changes with supabase (#4968) (5d3659d)
- db-postgres: indexes not created for non unique field names (#4967) (64f705c)
- db-postgres: indexes not creating for relationships, arrays, hasmany and blocks (#4976) (47106d5)
- db-postgres: localized field sort count (#4997) (f3876c2)
- ensures docPermissions fallback to collection permissions on create (#4969) (afa2b94)
- migrations: safely create migration file when no name passed (#4995) (0740d50)
- plugin-seo: tabbedUI with email field causes duplicate field (#4944) (db22cbd)
2.9.0 (2024-01-26)
Features
Bug Fixes
- afterLogin hook write conflicts (#4904) (3eb681e)
- db-postgres: migrate down error (#4861) (dfba522)
- db-postgres: query unset relation (#4862) (8ce15c8)
- migrate down missing filter for latest batch (#4860) (b99d24f)
- plugin-cloud-storage: slow get file performance large collections (#4927) (f73d503)
- remove No Options dropdown from hasMany fields (#4899) (e5a7907)
- upload input drawer does not show draft versions (#4903) (6930c4e)
2.8.2 (2024-01-16)
Features
- db-postgres: support drizzle logging config (#4809) (371353f)
- plugin-form-builder: add validation for form ID when creating a submission (#4730)
- plugin-seo: add support for interfaceName and fieldOverrides (#4695)
Bug Fixes
- db-mongodb: mongodb versions creating duplicates (#4825) (a861311)
- db-mongodb: transactionOptions=false typeErrors (82383a5)
- db-postgres: Remove duplicate keys from response (#4747) (eb9e771)
- db-postgres: validateExistingBlockIsIdentical with arrays (3b88adc)
- db-postgres: validateExistingBlockIsIdentical with other tables (0647c87)
- plugin-seo: fix missing spread operator in URL generator function (#4723)
- removes max-width from field-types class & correctly sets it on uploads (#4829) (ee5390a)
2.8.0 (2024-01-12)
Features
- allow custom config properties in blocks (#4766) (d92af29)
- logger: show local time (#4663) (493fde5)
- plugin-cloud: use resend smtp instead of custom transport (#4746) (5cfde54)
- plugin-seo: add fr translations (#4774) (4319fe1)
- plugin-seo: remove support for payload <2.7.0 (#4765) (5e08368)
Bug Fixes
- allow a custom ID field to be nested inside unnamed tabs and rows (#4701) (6d5ac1d)
- build payload without initializing (#4028) (1115387)
- db-mongodb: limit=0 returns unpaginated (63e5c43)
- db-postgres: totalPages value when limit=0 (5702b83)
- migration regression (#4777) (fa3b3dd)
- db-mongodb: migration regression (#4777) (fa3b3dd)
- **db-postgres:**migration regression (#4777) (fa3b3dd)
- passes
draft=truein fetch for relationships (#4784) (0a259d2) - plugin-form-builder: replaces curly brackets with lexical editor (#4753) (8481846)
- prioritizes
valuekey when filtering / querying for relationships (#4727) (d0f7677) - text hasMany validation (#4789) (e2e56a4)
⚠ BREAKING CHANGES
@payloadcms/plugin-seo
- remove support for payload <2.7.0 (#4765)
2.7.0 (2024-01-09)
Features
- db-mongodb: improve transaction support by passing req to migrations (682eca2)
- db-postgres: improve transaction support by passing req to migrations (555d027)
- hasMany property for text fields (#4605) (f43cf18)
- improve transaction support by passing req to migrations (1d14d9f)
- plugin-seo: add i18n (#4665) (3027a03)
Bug Fixes
- adds objectID validation to isValidID if of type
text(#4689) (d419275) - allow json field to be saved empty and reflect value changes (#4687) (0fb3a9c)
- custom ids in versions (#4680) (5d15955)
- custom overrides of breadcrumb and parent fields (7db58b4)
- db-mongodb: migration error calling beginTransaction with transactionOptions false (21b9453)
- db-mongodb: querying plan for collections ignoring indexes (#4655) (63bc4ca)
- db-postgres: incorrect results querying json field using exists operator (9d9ac0e)
- db-postgres: migrate down only runs latest batch size (6acfae8)
- db-postgres: query on json properties (ec4d2f9)
- db-postgres: validation prevents group fields in blocks (#4699) (cab6bab)
- non-boolean condition result causes infinite looping (#4579) (a3e7816)
- plugin-form-builder: slate serializer should replace curly braces in links (#4703) (28a3012)
- plugin-nested-docs: breadcrumbsFieldSlug used in resaveSelfAfterCreate hook (a5a91c0)
- plugin-nested-docs: children wrongly publishing draft data (#4692) (5539942)
- plugin-nested-docs: custom parent field slug (635e7c2)
- plugin-nested-docs: parent filterOptions errors when specifying breadcrumbsFieldSlug (c4a4678)
- prevents row overflow (#4704) (9828772)
- relations with number based ids (postgres) show untitled ID: x (1b91408)
- sidebar fields not disabled by access permissions (#4682) (85e38b7)
- unlock user condition always passes due to seconds conversion (#4610) (d543665)
2.6.0 (2024-01-03)
Features
Bug Fixes
- "The punycode module is deprecated" warning by updating nodemailer (00d8480)
- adjusts json field joi schema to allow editorOptions (bff4cf5)
- db-postgres: Wait for transaction to complete on commit (#4582) (a71d37b)
- detect language from request headers accept-language (#4656) (69a9944)
- graphql multiple locales (98890ee)
- navigation locks when modal is closed with esc (#4664) (be3beab)
- req.locale and req.fallbackLocale get reassigned in local operations (aa048d5)
- resets actions array when navigating out of view with actions (#4585) (5c55231)
- richtext-lexical: z-index issues (#4570) (8015e99)
- tab field error when using the same interface name (#4657) (f1fa374)
2.5.0 (2023-12-19)
Features
- add Chinese Traditional translation (#4372) (50253f6)
- add context to auth and globals local API (#4449) (168d629)
- adds new
actionsproperty to admin customization (#4468) (9e8f14a) - async live preview urls (#4339) (5f17324)
- pass path to FieldDescription (#4364) (3b8a27d)
- plugin-form-builder: Lexical support (#4487) (c6c5cab)
- prevent querying relationship when filterOptions returns false (#4392) (c1bd338)
- richtext-lexical: improve floating select menu Dropdown classNames (#4444) (9331204)
- richtext-lexical: improve link URL validation (#4442) (9babf68)
- richtext-lexical: lazy import React components to prevent client-only code from leaking into the server (#4290) (5de347f)
- richtext-lexical: Link & Relationship Feature: field-level configurable allowed relationships (#4182) (7af8f29)
- richtext-lexical: link node: change doc data format to be consistent with relationship field (#4504) (cc0ba89)
- richtext-lexical: rename TreeviewFeature into TreeViewFeature (#4520) (c49fd66)
- richtext-lexical: Slate to Lexical converter: add blockquote conversion, convert custom link fields (#4486) (31f8f3c)
- richtext-lexical: Upload html serializer: Output picture element if the image has multiple sizes, improve absolute URL creation (e558894)
Bug Fixes
- adds bg color for year/month select options in datepicker (#4508) (07371b9)
- correctly fetches externally stored files when passing uploadEdits (#4505) (228d45c)
- cursor jumping around inside json field (#4453) (6300037)
- db-mongodb: documentDB unique constraint throws incorrect error (#4513) (05e8914)
- db-postgres: findOne correctly querying with where queries (#4550) (8bc31cd)
- db-postgres: querying nested blocks fields (#4404) (6e9ae65)
- db-postgres: sorting on a not-configured field throws error (#4382) (dbaecda)
- defaultValues computed on new globals (#4380) (b6cffce)
- disallow duplicate fieldNames to be used on the same level in the config (#4381) (a1d66b8)
- ensure ui fields do not make it into gql schemas (#4457) (3a20ddc)
- format fields within tab for list controls (#4516) (2650c70)
- formats locales with multiple labels for versions locale selector (#4495) (8257661)
- graphql schema generation for fields without queryable subfields (#4463) (13e3e06)
- handles null upload field values (#4397) (cf9a370)
- live-preview: populates rte uploads and relationships (#4379) (4090aeb)
- live-preview: sends raw js objects through window.postMessage instead of json (#4354) (03a3872)
- make admin navigation transition smoother (#4217) (eb6572e)
- omit field default value if read access returns false (#4518) (3e9ef84)
- pin ts-node versions which are causing swc errors (#4447) (b9c0248)
- properly spreads collection fields into non-tabbed configs #50 (#51) (7e88159)
- plugin-form-builder: removes use of slate in rich-text serializer (#4451) (3df52a8)
- plugin-nested-docs: properly exports field utilities (#4462) (1cc87bd)
- richtext-*: loosen RichTextAdapter types due to re-occuring ts strict mode errors (#4416) (48f1299)
- richtext-lexical: Blocks field: should not prompt for unsaved changes due to value comparison between null and non-existent props (#4450) (548e78c)
- richtext-lexical: do not add unnecessary paragraph before upload, relationship and blocks nodes (#4441) (5c2739e)
- richtext-lexical: lexicalHTML field not working when used inside of Blocks field (128f9c4)
- richtext-lexical: lexicalHTML field now works when used inside of row fields (#4440) (0421173)
- richtext-lexical: not all types of URLs are validated correctly (ac7f980)
... Release notes are cut-off. Click here to continue reading
...........................................
- searching by id sends undefined in where query param (#4464) (46e8c01)
- simplifies query validation and fixes nested relationship fields (#4391) (4b5453e)
- updates return value of empty arrays in getDataByPath (#4553) (f3748a1)
- upload editing error with plugin-cloud (#4170) (fcbe574)
- upload related issues, cropping, fetching local file, external preview image (#4461) (45c472d)
- uploads files after validation (#4218) (65adfd2)
⚠ BREAKING CHANGES: @payloadcms/richtext-lexical
- richtext-lexical: rename TreeviewFeature into TreeViewFeature (#4520)
If you import TreeviewFeature, you have to rename the import to use TreeViewFeature (capitalized "V")
- richtext-lexical: link node: change doc data format to be consistent with relationship field (#4504)
An unpopulated, internal link node no longer saves the doc id under fields.doc.value.id. Now, it saves it under fields.doc.value. Migration inside of payload is automatic. If you are reading from the link node inside of your frontend though, you will have to adjust it.
- richtext-lexical: improve floating select menu Dropdown classNames (#4444)
ToolbarDropdown react component has a new mandatory sectionKey prop
- richtext-lexical: lazy import React components to prevent client-only code from leaking into the server (#4290)
-
Most important: If you are updating
@payloadcms/richtext-lexicalto v0.4.0 or higher, you will HAVE to update payload to the latest version as well. If you don't update it, payload likely won't start up due to validation errors. It's generally good practice to upgrade packages prefixed with @payloadcms/ together with payload and keep the versions in sync. -
@payloadcms/richtext-slateis not affected by this. -
Every single property in the
Featureinterface which accepts a React component now no longer accepts a React component, but a function which imports a React component instead. This is done to ensure no unnecessary client-only code is leaked to the server when importing Features on a server. Here's an example migration:
Old:
import { BlockIcon } from '../../lexical/ui/icons/Block'
...
Icon: BlockIcon,
New:
// import { BlockIcon } from '../../lexical/ui/icons/Block' // <= Remove this import
...
Icon: () =>
// @ts-expect-error
import('../../lexical/ui/icons/Block').then((module) => module.BlockIcon),
Or alternatively, if you're using default exports instead of named exports:
// import BlockIcon from '../../lexical/ui/icons/Block' // <= Remove this import
...
Icon: () =>
// @ts-expect-error
import('../../lexical/ui/icons/Block'),
-
The types for
SanitizedEditorConfigandEditorConfighave changed. Their respectivelexicalproperty no longer expects theLexicalEditorConfig. It now expects a function returning theLexicalEditorConfig. You will have to adjust this if you adjusted that property anywhere, e.g. when initializing the lexical field editor property, or when initializing a new headless editor. -
The following exports are now exported from the
@payloadcms/richtext-lexical/componentssubpath exports instead of@payloadcms/richtext-lexical:
ToolbarButtonToolbarDropdownRichTextCellRichTextFielddefaultEditorLexicalConfig
You will have to adjust your imports, only if you import any of those properties in your project.
2.4.0 (2023-12-06)
Features
- add Chinese Traditional translation (#4372) (50253f6)
- async live preview urls (#4339) (5f17324)
- pass path to FieldDescription (#4364) (3b8a27d)
- richtext-lexical: lazy import React components to prevent client-only code from leaking into the server (#4290) (5de347f)
- richtext-lexical: Link & Relationship Feature: field-level configurable allowed relationships (#4182) (7af8f29)
Bug Fixes
- db-postgres: sorting on a not-configured field throws error (#4382) (dbaecda)
- defaultValues computed on new globals (#4380) (b6cffce)
- handles null upload field values (#4397) (cf9a370)
- live-preview: populates rte uploads and relationships (#4379) (4090aeb)
- live-preview: sends raw js objects through window.postMessage instead of json (#4354) (03a3872)
- simplifies query validation and fixes nested relationship fields (#4391) (4b5453e)
- upload editing error with plugin-cloud (#4170) (fcbe574)
- uploads files after validation (#4218) (65adfd2)
BREAKING CHANGES
- richtext-lexical: lazy import React components to prevent client-only code from leaking into the server (#4290)
⚠️ @payloadcms/richtext-lexical
Most important: If you are updating @payloadcms/richtext-lexical to v0.4.0 or higher, you will HAVE to update payload to the latest version as well. If you don't update it, payload likely won't start up due to validation errors. It's generally good practice to upgrade packages prefixed with @payloadcms/ together with payload and keep the versions in sync.
@payloadcms/richtext-slate is not affected by this.
Every single property in the Feature interface which accepts a React component now no longer accepts a React component, but a function which imports a React component instead. This is done to ensure no unnecessary client-only code is leaked to the server when importing Features on a server.
Here's an example migration:
Old:
import { BlockIcon } from '../../lexical/ui/icons/Block'
...
Icon: BlockIcon,
New:
// import { BlockIcon } from '../../lexical/ui/icons/Block' // <= Remove this import
...
Icon: () =>
// @ts-expect-error
import('../../lexical/ui/icons/Block').then((module) => module.BlockIcon),
Or alternatively, if you're using default exports instead of named exports:
// import BlockIcon from '../../lexical/ui/icons/Block' // <= Remove this import
...
Icon: () =>
// @ts-expect-error
import('../../lexical/ui/icons/Block'),
The types for SanitizedEditorConfig and EditorConfig have changed. Their respective lexical property no longer expects the LexicalEditorConfig. It now expects a function returning the LexicalEditorConfig. You will have to adjust this if you adjusted that property anywhere, e.g. when initializing the lexical field editor property, or when initializing a new headless editor.
The following exports are now exported from the @payloadcms/richtext-lexical/components subpath exports instead of @payloadcms/richtext-lexical:
ToolbarButtonToolbarDropdownRichTextCellRichTextFielddefaultEditorLexicalConfig
You will have to adjust your imports, only if you import any of those properties in your project.
2.3.1 (2023-12-01)
Bug Fixes
- ensure doc controls are not hidden behind lexical field (#4345) (bea79fe)
- query validation on relationship fields (#4353) (fe888b5)
- richtext-lexical: blocks content may be hidden behind components outside of the editor (#4325) (3e745e9)
- richtext-lexical: Blocks node: incorrect conversion from v1 node to v2 node (ef84a2c)
2.3.0 (2023-11-30)
Features
- add serbian (latin and cyrillic) translations (#4268) (40c8909)
- db-mongodb: search for migrations dir intelligently (530c825)
- db-postgres: search for migrations dir intelligently (308979f)
- live-preview: batches api requests (#4315) (d49bb43)
- relationship sortOptions property (#4301) (224cddd)
- support migrations with js files (2122242)
- support OAuth 2.0 format Authorization: Bearer tokens in headers (c1eb9d1)
- useDocumentEvents (#4284) (9bb7a88)
Bug Fixes
- db-postgres: allow for nested block fields to be queried (#4237) (cd07873)
- db-postgres: error saving nested arrays with versions (#4302) (3514bfb)
- duplicate documents with required localized fields (#4236) (9da9b1f)
- incorrect key property in Tabs field component (#4311) (3502ce7), closes #4282
- live-preview-react: removes payload from peer deps (7e1052f)
- live-preview: compounds merge results (#4306) (381c158)
- live-preview: property resets rte nodes (#4313) (66679fb)
- live-preview: re-populates externally updated relationships (#4287) (57fc211)
- live-preview: removes payload from peer deps (b4af95f)
- properly exports useDocumentsEvents hook (#4314) (5420963)
- properly sets tabs key in fieldSchemaToJSON (#4317) (9cc88bb)
- richtext-lexical: HTML Converter field not working inside of tabs (#4293) (5bf6493)
- richtext-lexical: re-use payload population logic to fix population-related issues (#4291) (094d02c)
- richtext-slate: add use client to top of tsx files importing from payload core (#4312) (d4f28b1)
BREAKING CHANGES
⚠️ @payloadcms/richtext-lexical
The SlashMenuGroup and SlashMenuOption classes have changed. If you have any custom lexical Features which are adding new slash menu entries, this will be a breaking change for you. If not, no action is required from your side.
Here are the breaking changes and how to migrate:
- The
SlashMenuOption's first argument is now used as akeyand not as a display name. Additionally, a new, optionaldisplayNameproperty is added which will serve as the display name. Make sure yourkeydoes not contain any spaces or special characters. - The
titleproperty ofSlashMenuGrouphas been replaced by a new, mandatorykeyand an optionaldisplayNameproperty. To migrate, you will have to remove thetitleproperty and add akeyproperty instead - make sure you do not use spaces or special characters in thekey. - Additionally, if you have custom styles targeting elements inside of slash or floating-select-toolbar menus, you will have to adjust those too, as the CSS classes changed
2.2.2 (2023-11-27)
Features
Bug Fixes
- number field validation (#4233) (19fcfc2)
- passes date options to the react-datepicker in filter UI, removes duplicate options from operators select (#4225) (3d2b62b)
- prevent json data getting reset when switching tabs (#4123) (1dcd3a2)
- transactions broken within doc access (443847e)
- typo in polish translations (#4234) (56a4692)
2.2.0 (2023-11-20)
Features
- allow richtext adapters to control type generation, improve generated lexical types (#4036) (989c10e)
- hide publish button based on permissions (#4203) (de02490)
- richtext-lexical: Add new position: 'top' property for plugins (eed4f43)
Bug Fixes
- fully define the define property for esbuild string replacement (#4099) (e22b95b)
- i18n: polish translations (#4134) (782e118)
- improves live preview breakpoints and zoom options in dark mode (#4090) (b91711a)
- plugin-nested-docs: await populate breadcrumbs on resaveChildren (#4226) (4e41dd1)
- rename tab button classname to prevent unintentional styling (#4121) (967eff1)
- richtext-lexical: add missing 'use client' to TestRecorder feature plugin (fc26275)
- richtext-lexical: Blocks: Array row data is not removed (#4209) (0af9c4d)
- richtext-lexical: Blocks: fields without fulfilled condition are now skipped for validation (50fab90)
- richtext-lexical: Blocks: make sure fields are wrapped in a uniquely-named group, change block node data format, fix react key error (#3995) (c068a87)
- richtext-lexical: Blocks: z-index issue, e.g. select field dropdown in blocks hidden behind blocks below, or slash menu inside nested editor hidden behind blocks below (09f17f4)
- richtext-lexical: Floating Select Toolbar: Buttons and Dropdown Buttons not clickable in nested editors (615702b), closes #4025
- richtext-lexical: HTMLConverter: cannot find nested lexical fields (#4103) (a6d5f2e), closes #4034
- richtext-lexical: incorrect caret positioning when selecting second line of multi-line paragraph (#4165) (b210af4)
- richtext-lexical: make lexicalHTML() function work for globals (dbfc835)
- richtext-lexical: nested editor may lose focus when writing (#4139) (859c2f4)
- richtext-lexical: remove optional chaining after
thisas transpilers are not handling it well (#4145) (2c8d34d) - richtext-lexical: visual bug after rearranging blocks (a6b4860)
- simplifies block/array/hasMany-number field validations (#4052) (803a37e)
- synchronous transaction errors (#4164) (1510baf)
- thread locale through to access routes from admin panel (#4183) (05f3169)
- transactionID isolation for GraphQL (#4095) (195a952)
- upload fit not accounted for when editing focal point or crop (#4142) (45e9a55)
2.1.1 (2023-11-10)
Bug Fixes
- conditionally hide dot menu in DocumentControls (#4075) (cef4cbb)
- disable editing option for svg image types (#4071) (949e265)
- fixes creation of related documents within a transaction if filterOptions is used (#4087) (acad288)
- hide empty image sizes from the preview drawer (#3946) (687f485)
- live-preview: ensures field schema exists before traversing fields (#4074) (7059a71)
- live-preview: field recursion and relationship population (#4045) (2ad7340)
- live-preview: properly handles apiRoute (#4076) (1f851f2)
- possible issue with access control not using req (#4086) (348a70c)
- richtext-lexical: Blocks: unnecessary saving node value when initially opening a document & new lexical tests (#4059) (fff377a)
- richtext-lexical: floating select toolbar caret not positioned correctly if first line is selected (#4062) (c462df3)
2.1.0 (2023-11-08)
Features
- add internationalization (i18n) to locales (#4005) (6a0a859)
- Custom Error, Label, and before/after field components (#3747) (266c327)
Bug Fixes
- error on graphql multiple queries (#3985) (57da3c9)
- focal and cropping issues, adds test (#4039) (acba5e4)
- handle invalid tokens in refresh token operation (#3647) (131d89c)
- hasMany number and select fields unable to save within arrays (#4047) (182c57b)
- injects array and block ids into fieldSchemaToJSON (#4043) (d068ef7)
- parse predefined migrations via file arg or name prefix (#4001) (eb42c03)
- polymorphic hasMany relationships missing in postgres admin (#4053) (7a9af44)
- resets list filter row when the filter on field is changed (#3956) (8d14c21)
- Update API Views (b008b6c)
- vite not replacing env vars correctly when building (67b3baa)
New Contributors
- @karniv00l made their first contribution in https://github.com/payloadcms/payload/pull/3934
- @vanska made their first contribution in https://github.com/payloadcms/payload/pull/3909
- @SimYunSup made their first contribution in https://github.com/payloadcms/payload/pull/3987
- @Snailedlt made their first contribution in https://github.com/payloadcms/payload/pull/4005
2.0.15 (2023-11-03)
Bug Fixes
- autosave updating data in unrelated docs (b722f20)
- better error handling within parseCookies (#3720) (6b1b4ff)
- block row removal w/ db-postgres adapter (#3951) (5ea88bb)
- deeply merges view configs (#3954) (a5b2333)
- do not display field if read permission is false - admin panel ui (#3949) (cdc10be)
- ensures dataloader does not run requests in parallel (4607dbf)
- exclude files from dev bundle if aliased (#3957) (7966692)
- field paths being mutated if they ended with the req.locale (#3936) (36576f1)
- findVersions pagination (#3906) (1f8f173)
- global autosave and relevant e2e test (a9d96b1)
- i18n: polish translations (#3934) (e4881bb)
- passes correct data to buildStateFromSchema on account page (#3984) (c7a315a)
- prevent sort from saving a new version in version list view (#3944) (900a9ea)
- properly load temp files into buffer (#3996) (d1a0822)
- sort document tabs by order (#3968) (06cd52b)
- vertical alignment in step nav when using larger logos (#3955) (b6d9a20)
New Contributors
- @karniv00l made their first contribution in https://github.com/payloadcms/payload/pull/3934
2.0.14 (2023-10-30)
Bug Fixes
- adds null to non-required field unions (#3870) (7e919aa)
- checks for user before accessing properties in preferences update operation(#3844) (24eab3a)
- db-mongodb: improve find query performance (#3836) (56e58e9), closes #3904
- db-mongodb: versions pagination (#3875) (4f2b080)
- disable webpack hot reload on production (#3891) (422c803)
- duplicate document copying to incorrect locale (#3874) (89f273b)
- enables nested AND/OR queries (#3834) (237eebd)
- ensure serverURL has string value for getBaseUploadFields function (#3900) (c564a83)
- ensures compare-version select field cannot be cleared (#3901) (42d8d11)
- error handling when duplicating documents fails (#3873) (435eb62)
- generate new block ids on create (#3871) (3404bab)
- global permissions for live preview (#3854) (3032e0b)
- handles null & undefined relationship field values in versions view (#3609) (115e592)
- incorrect duplication of data in admin ui (#3907) (46fc41c)
- only apply focal manipulation when necessary (#3902) (a4f36aa)
- graphql query errors transaction race condition (#3795) (dc13b10)
- removes conditional return of formattedEmails in sendEmail hook #26 (#28) (e8458f8)
- resize image if no aspect ratio change (#3859) (f53b713)
- richtext-*: type issues with typescript strict mode enabled (dac9514)
- richtext-lexical: Blocks node incorrectly marked as client module (35f00fa)
- richtext-lexical: remove unnecessary dependencies (fixes #3889) (760565f)
- set date to 12UTC for default, dayOnly and monthOnly fields (#3887) (d393225)
- store resized image on req or tempFilePath (#3883) (6c5d525)
- unique field error handling (#3888) (4d8d4c2)
New Contributors
- @dkirchhof made their first contribution in https://github.com/payloadcms/payload/pull/3791
- @GeorgeHulpoi made their first contribution in https://github.com/payloadcms/payload/pull/3863
2.0.13 (2023-10-24)
Bug Fixes
- adjusts props to accept components for before and after fields instead of functions (#3820) (c476d01)
- alignment of collapsible within row (#3822) (eaef0e7)
- named tabs not appearing in the gql mutation input type (#3835) (a0019d0)
- only parses live preview ready message when same origin (#3791) (e8f2377)
- prevent storing duplicate user preferences (#3833) (7eee0ec)
- prevents document sidebar from collapsing (71a3e5b)
- renders live preview for globals (#3801) (a13ec2e)
- reverting localized versions (#3831) (5a0d0db)
2.0.12 (2023-10-23)
Features
- collection, global and field props for hooks, fix request context initialization, add context to global hooks (#3780)
- richtext-lexical: HTML Serializer (#3685)
Bug Fixes
- remove duplicate removal of temp upload file (#3818)
- simplify how the search input and query params are connected (#3797)
- standardizes layout of document fields (#3798)
- issue where dragging unsortable item would crash the page (#3789)
- richtext-lexical: defaultValue property didn't fit into field schema (b5c7bbed9)
- richtext-*: hasMany relationships not populated correctly (e197e0316)
2.0.11 (2023-10-19)
Features
- add ability to opt out of type gen declare statement (#3765)
Bug Fixes
-
corrects versions collection casing (#3739)
-
updates req after file resize (#3754)
-
correctly renders focal point when crop is set to false (#3759)
-
account for many slug types in generate types (#3698)
-
handle graphQL: false on globals when building policy type (#3729)
-
renders id as fallback title in DeleteDocument (#3745)
-
properly handles hideAPIURL (#3721)
-
filesRequiredOnCreate typing, tests, linting (#3737)
-
webpack-bundler: corrects payload alias (#3769)
-
bundler-webpack: better node_modules resolution (#3744)
-
db-postgres: block and array inserts error (#3714)
-
live-preview: properly handles uploads and hasOne monomorphic relationships (#3719)
2.0.8 (2023-10-17)
Features
Bug Fixes
- autosave time shown minutes only (#3492) (e311e8f)
- blocks within groups in postgres (45a62ba)
- bug with seeding ecommerce (993568a)
- corrects add block index (#3681) (3c50443)
- misc upload crop/focal point updates (#3580) (d616772)
- renders mobile document controls (#3695) (1625ff2)
- some local operations missing req.transactionID (#3651) (150799e)
- richtext-*: extra fields not being iterated correctly (#3693) (b8a5866)
- richtext-*: link drawer form receiving incorrect field schema (#3696) (cb39354)
- richtext-lexical: #3682 isolated editor container causing z-index issues (24918fe)
- templates: user access control (#3712) (8b8ceab)
2.0.5 (2023-10-12)
Bug Fixes
- properly renders custom buttons for globals (#3616) (05cc287)
- minor type issue in richText validate function (06a51b3)
- live preview device size (#3606) (8bbac60)
- properly handles nested routes for live preview (#3586) (6486468)
- various stepnav related issues (#3599) (aaf8839)
- database adapter types (cc56da1)
- postgres select fields within groups (#3570) (06e2fa9)
- #3511, documents don't delete their versions (#3520) (e3c7765)
Documentation
2.0.4 (2023-10-12)
Bug Fixes
- API tab breadcrumbs and results indentation (#3564) (e0afeec)
- sticky sidebar (#3563) (76e306d)
- sidebar width when fields have long descriptions (#3562) (cfc78ed)
- row field margins (#3558) (6d9353b)
- removes nested array field configs from array value (#3549) (af892ec)
- #3521 (eb97acd)
- #3540 (2567ac5)
- row field width (#3550) (9ff014b)
- #3541 (e6f0d35)
- renders global label as page title (#3532) (ace3e57)
- increases document controls popup list button hitbox (#3529) (f009593)
Documentation
2.0.0 (2023-10-09)
Features
- New database adapter pattern
- Official Postgres adapter released, built on Drizzle ORM
- Database transactions added
- Full, first-party migration support added
- The admin UI has been redesigned to be more extensible and offer more horizontal real estate
- Admin UI sidebar is now collapsible
- Live preview added to admin UI, including usable frontend hooks
- New "Views" API added, which allows for custom sub-views on List and Edit views within Admin UI
- New bundler adapter pattern released
- Official Vite bundler released
- Offical Lexical rich text adapter released
- Lexical rich text editor now supports drag and drop of rich text elements
- Lexical rich text now supports Payload blocks directly within rich text editor
- Upload image cropping added
- Upload "focal point" controls added
- New "API" view added to Edit view(s), allowing for quick and customizable references to API response
- MongoDB draft querying has been significantly improved and is now much faster
- Arabic / RTL UI support added
- Locales can now be further configured to accept settings like
rtl, human-friendly labels, etc. - The
tsconfigpathpointing to your generated Payload types is no longer required for types to work
BREAKING CHANGES
⚠️ You now need to provide your Payload config with a database, a bundler, and a rich text adapter
Here's an example of a barebones Payload config, set up to work as 1.0 did:
import { mongooseAdapter } from "@payloadcms/db-mongodb";
import { slateEditor } from "@payloadcms/richtext-slate";
import { webpackBundler } from "@payloadcms/bundler-webpack";
import { buildConfig } from "payload/config";
export default buildConfig({
admin: {
bundler: webpackBundler(),
},
editor: slateEditor({}),
collections: [
// your collections here
],
db: mongooseAdapter({
url: process.env.DATABASE_URI,
}),
});
These new properties are all now required for Payload to function, and you will have to install each separate adapter that you use. Feel free to swap out any of the adapters with your choice (Lexical, Postgres, Vite, etc.)
Make sure to install the packages that you need. In the above example, you would need to install the following:
npm install --save @payloadcms/db-mongodb @payloadcms/richtext-slate @payloadcms/bundler-webpack
⚠️ Draft versions now require a latest: true property to be set on the most recent draft in your _versions collections(s)
We have a ready-to-go migration script for your versions from v1 to v2, and to use it, all you have to do is run the following commands:
1. First, make sure you have a payload npm script in your package.json
{
"scripts": {
"payload": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload"
}
}
Adjust the PAYLOAD_CONFIG_PATH to point to your Payload config file if necessary.
2. Create a migration, using the new Payload migration API
yarn payload migrate:create --file @payloadcms/db-mongodb/versions-v1-v2
# or npm, note the use of `--`
npm run payload migrate:create -- --file @payloadcms/db-mongodb/versions-v1-v2
The above command will output a migration file into your ./src/migrations folder (default migrations location). It contains a migration script to automatically add a latest: true flag to each of your newest drafts, for all draft-enabled collections. It works out of the box!
3. Run migrations
From there, you need to run migrations. Run the following command to execute your new migration:
npm run payload migrate
And you'll be all good!
⚠️ Array and block field validations now accept the full array of field data as their validation argument instead of the value.length
This change should only affect you if you have a custom array / block validation defined.
⚠️ For MongoDB, all models have been moved from the Payload object to the database adapter
For example, if you are leveraging Mongoose models directly, in 1.0, you would have accessed them via payload.collections[myCollectionSlug].Model. Now, you can access the Mongoose model from payload.db.collections[myCollectionSlug].
Version models can be accessed from payload.db.versions[myEntitySlug], and the global model can be accessed via payload.db.globals.
⚠️ User preferences data shape has changed, and you will lose preferences unless you manually migrate them to the new shape
We don't have a migration ready to go yet for user preferences, and this typically wouldn't be a big deal for most Payload projects. So don't let it stop you from updating unless you have a serious amount of user preferences that you'd like to keep. If so, we'll come up with a migration script for you and hook you up. Just reach out to us on Discord to ask for this.
⚠️ Node 16 is now the minimum required node version and Node 14 is no longer supported
Pretty self-explanatory on this one. Node 14 is old.
⚠️ The Pino logger has been updated, which may require you to make changes to your Pino config if you have a custom one
If you don't have anything custom with the Pino logger, this does not apply to you.
⚠️ Transactions are now enabled by default if your database supports them
MongoDB requires a replica set for transactions to work, so they likely are not going to work for you unless you do indeed have a replica set configured. But if you do, transactions will now instantly work for all internal Payload operations.
This means that in some fringe cases, if you are creating a doc and then instantly trying to update it within an afterChange hook, the newly created doc may not truly exist yet. This should not cause any problems for 99% of projects, but if you think this applies to you, might be good to double-check through your code.
To avoid any issues, you can pass the req.transactionID through to your Local API calls, so that your Local API calls are included as part of the parent transaction.
⚠️ Locales now have more functionality, and in some places, you might need to update custom code
Payload's locales have become more powerful and now allow you to customize more aspects per locale such as a human-friendly label and if the locale is RTL or not.
This means that certain functions now return a different shape, such as useLocale. This hook used to return a string of the locale code you are currently editing, but it now returns an object with type of Locale.
⚠️ Admin panel CSS classes may have changed
The revisions we've made in 2.0 required changes to both HTML and CSS within the admin panel. For this reason, if you were loading custom CSS into the admin panel to customize the look and feel, your stylesheets may need to be updated. If your CSS is targeting elements on the page using HTML selectors or class names, you may need to update these selectors based on the current markup. It may also be necessary to update your style definitions if the core Payload component you are targeting has undergone significant change.
In many cases, our classnames and structure have remained the same, but technically, this could be a breaking change.
⚠️ Custom admin views API has changed
These changes only affect apps that are using custom views via the admin.components.routes config.
The type AdminRoute was renamed to AdminViewConfig. Simply update your instances with this new type and it will continue to work as expected. The properties of this type have not changed.
The admin.components.routes config has been merged with admin.components.views. Simply move your custom views to the views object. The properties of the config have not changed. Here is an example:
Previous:
admin: {
components: {
routes: [
{
Component: MyCustomView,
path: "/custom-view",
},
];
}
}
Current:
admin: {
components: {
views: {
MyCustomView: {
Component: MyCustomView,
path: '/custom-view'
}
}]
}
}
⚠️ Rich text admin properties have moved
If you have customized the Slate rich text editor via admin.elements or admin.leaves properties, you now need to add your customizations to a slateEditor({ admin: {} }) property. The signatures are all the same, but you might have to move some properties around.
Previous:
const myRichTextField: Field = {
name: "content",
type: "richText",
admin: {
elements: [
"h1",
"link",
// etc
],
},
};
Current:
import { slateEditor } from "@payloadcms/richtext-slate";
const myRichTextField: Field = {
name: "content",
type: "richText",
editor: slateEditor({
// Move the admin property as shown below
admin: {
elements: [
"h1",
"link",
// etc
],
},
}),
};
⚠️ MongoDB connection options have been removed from payload.init
To pass connection options for MongoDB, you now need to pass them to db: mongooseAdapter({}) instead of passing them to payload.init().
⚠️ Some types have changed locations
If you are importing types from Payload, some of their locations may have changed. An example would be Slate-specific types being no longer exported from Payload itself—they are now exported from the @payloadcms/richtext-slate package.
Recap
That's it! Most of these changes will be instantly apparent to you thanks to TypeScript, and many may not apply to you at all. But this list should be comprehensive and we will do our best to keep everything up-to-date here accordingly. There are inevitably some types that have changed locations, and similar things like that, but overall, you should be able to swing the breaking changes and get updated.
If you need a hand, reach out on Discord and we will hook you up!
1.15.4 (2023-09-06)
Bug Fixes
- sets full user data from fetchFullUser instead of partial jwt data (#3279) (cf12b5f), closes #3274
- aligns depth behaviour between local api and admin panel (#3276) (5096c37)
- appends versions key to incoming where query (#3287) (9cd5e5a)
- change scoping of
forceparameter to prevent false negation; (#3278) (429a88a)
1.15.3 (2023-09-05)
Bug Fixes
- draft globals always displaying unpublish button (9bc072c)
- globals not saving updatedAt and createdAt and version dates correctly (9fbabc8)
Features
✨ Improving version enabled query speed (related PR)
- ➡️ Copy migration script below
- ➡️ Run migration script
- ➡️ Add new property to config
- 🧠 While this migration script is very basic, it is always a good idea to backup your DB before running migrations
1. The migration script
const payload = require('payload');
require('dotenv').config();
const { PAYLOAD_SECRET, MONGODB_URI } = process.env;
// This function adds a `latest` flag for each documents newest version
// to improve query performance on versions/drafts
const improveVersionsQueryPerformance = async () => {
// Initialize Payload
// IMPORTANT: make sure your ENV variables are filled properly here
// as the below variable names are just for reference.
await payload.init({
secret: PAYLOAD_SECRET,
mongoURL: MONGODB_URI,
local: true,
});
async function migrateCollectionDocs(slug: string, docsAtATime = 100) {
const VersionsModel = payload.versions[slug];
const remainingDocs = await VersionsModel.aggregate([
// Sort so that newest are first
{
$sort: {
updatedAt: -1,
},
},
// Group by parent ID
// take the $first of each
{
$group: {
_id: '$parent',
_versionID: { $first: '$_id' },
version: { $first: '$version' },
updatedAt: { $first: '$updatedAt' },
createdAt: { $first: '$createdAt' },
latest: { $first: '$latest' },
},
},
{
$match: {
latest: { $eq: null },
},
},
{
$limit: docsAtATime,
},
], {
allowDiskUse: true,
})
.exec();
if (!remainingDocs || remainingDocs.length === 0) {
const newVersions = await VersionsModel.find({
latest: {
$eq: true
}
})
if (newVersions?.length) {
console.log(`Migrated ${newVersions.length} documents in the "${slug}" versions collection.`)
}
return;
}
const remainingDocIds = remainingDocs.map((doc) => doc._versionID);
await VersionsModel.updateMany(
{
_id: {
$in: remainingDocIds,
},
},
{
latest: true,
},
);
await migrateCollectionDocs(slug);
}
// For each collection
await Promise.all(
payload.config.collections.map(async ({ slug, versions }) => {
if (versions) {
return migrateCollectionDocs(slug);
}
}),
);
// For each global
await Promise.all(
payload.config.globals.map(async ({ slug, versions }) => {
if (versions) {
const VersionsModel = payload.versions[slug];
await VersionsModel.findOneAndUpdate(
{},
{ latest: true },
{
sort: { updatedAt: -1 },
},
).exec();
console.log(`Migrated the "${slug}" global.`)
}
}),
);
console.log('Done!');
process.exit(0);
};
improveVersionsQueryPerformance();
2. Running the script
This step depends on where the script is run from and where you place the script. The example below is assuming you have a similar folder structure and are running it from the root folder:
root
└─ scripts
└─ improveVersionsQueryPerformance.ts
└─ src
└─ payload.config.ts
# the command to run in the root folder
PAYLOAD_CONFIG_PATH=src/payload.config.ts npx ts-node -T scripts/improveVersionsQueryPerformance.ts
3. Adjusting your payload.config.ts file
// file: payload.config.ts
const config = {
// ... rest of your config
database: {
// You can toggle this feature on/off after running the migration
// if you need to revert to querying the previous way
queryDrafts_2_0: true
}
}
1.14.0 (2023-08-16)
Bug Fixes
- DatePicker showing only selected day by default (#3169) (edcb393)
- only allow redirects to /admin sub-routes (c0f05a1)
- passes in height to resizeOptions upload option to allow height resize (#3171) (7963d04)
- WhereBuilder component does not accept all valid Where queries (#3087) (fdfdfc8)
Features
- add afterOperation hook (#2697) (33686c6)
- add support for hotkeys (#1821) (942cfec)
- Added Azerbaijani language file (#3164) (63e3063)
- allow async relationship filter options (#2951) (bad3638)
- Improve admin dashboard accessibility (#3053) (e03a8e6)
- improve field ops (#3172) (d91b44c)
- make PAYLOAD_CONFIG_PATH optional (#2839) (5744de7)
- text alignment for richtext editor (#2803) (a0b13a5)
1.12.0 (2023-08-04)
Bug Fixes
- excludes useAsTitle field from searchableFields in collection view (#3105) (8c4d251)
- relationship field filter long titles (#3113) (da27a8a)
- wrong links in verification and forgot password emails if serverURL not set (#3010) (6a189c6)
Features
- add support for sharp resize options (#2844) (144bb81)
- allows for upload relationship drawer to be opened (#3108) (ea73e68)
- option to pre-fill login credentials automatically (#3021) (c5756ed)
- programmatic control over array and block rows inside the form (#3110) (a78c463)
- set JWT token field name with saveToJWT (#3126) (356f174)
1.11.0 (2023-07-05)
Bug Fixes
- ensures fields within blocks respect field level access control (#2969) (5b79067)
- ensures rows always have id's (#2968) (04851d0)
- GraphQL type for number field (#2954) (29d8bf0)
- nested richtext bug and test (#2966) (801f609)
- properly threads custom react-select props through relationship field (#2973) (79393e8)
Features
1.10.2 (2023-06-26)
Bug Fixes
- adjusts swc loader to only exclude non ts/tsx files - #2888 (#2907) (a2d9ef3)
- autosave on localized fields, adds test (6893231)
- broken export of entityToJSONSchema (#2894) (837dccc)
- correctly scopes data variable within bulk update - #2901 (#2904) (f627277)
- safely check for tempFilePath when updating media document (#2899) (8206c0f)
1.10.0 (2023-06-20)
Bug Fixes
- #2831, persists payloadAPI through local operations that accept req (85d2467)
- #2842, querying number custom ids with in (116e9ff)
- default sort with near operator (#2862) (99f3809)
- deprecate min/max in exchange for minRows and maxRows for relationship field (#2826) (0d8d7f3)
- drawer close on backspace (#2869) (a110ba2)
- drawer fields are read-only if opened from a hasMany relationship (#2843) (542b536)
- fields in relationship drawer not usable #2815 (#2870) (8626dc6)
- mobile loading overlay width #2866 (#2867) (ba9d633)
- near query sorting by distance and pagination (#2861) (1611896)
- relationship field query pagination (#2871) (ce84174)
- slow like queries with lots of records (4dd703a)
Features
1.8.6 (2023-06-07)
Bug Fixes
- #2711 index sortable field global versions fields (#2775) (576af01)
- #2767 bulk operations missing locales in admin requests (e30871a)
- #2771 relationship field not querying all collections (#2774) (8b767a1)
- adjusts activation constraint of draggable nodes (#2773) (863be3d)
- flattens relationships in the update operation for globals #2766 (#2776) (3677cf6)
- improperly typing optional arrays with required fields as required (f1fc305)
- read-only Auth fields (#2781) (3c72f33)
- recursiveNestedPaths not merging existing fields when hoisting row/collapsible fields (#2769) (536d701)
1.8.4 (2023-06-02)
Features
Bug Fixes
- group row hoisting (#2683) (1626e17)
- graphql where types on rows and collapsible's (#2758) (f978299)
- RichText link custom fields (#2756) (23be263)
- adds timestamps to global schemas (#2738) (0986282)
- adjusts code field joi schema to allow editorOptions (ed136fb)
- fix locale popup overflow (#2737) (8ee9724)
- fix tests by hard-coding the URL in the logger (2697974)
- mongoose connection (#2754) (69b97bb)
- removes payload dependency inception (#2717) (6125b66)
- searches on correct useAsTitle field in polymorphic list drawers #2710 (9ec2a40)
- typing of sendMail function (e3ff4c4)
- corrects relationship field schema from pr #2696 (#2714) (8285bac)
1.8.3 (2023-05-24)
Bug Fixes
- #2662, draft=true querying by id (3b78ab0)
- #2685, graphql querying relationships with custom id (9bb5470)
- adds credentials to doc access request (#2705) (c716954)
- prevents add new relationship modal from adding duplicative values to the parent doc #2688 (a2a8ac9)
- unable to clear relationships or open relationship drawer on mobile #2691 #2692 (782f8ca)
1.8.0 (2023-05-09)
Bug Fixes
- correct casing on graphql type (219f50b)
- defaultValue missing from Upload field schema (7b21eaf)
- ensures nested querying works when querying across collections (09974fa)
- query custom text id fields (967f2ac)
- removes deprecated queryHiddenFIelds from local API docs (5f30dbb)
- removes queryHiddenFields from example Find operation (fb4f822)
- resolve process/browser package in webpack config (02f27f3)
- Row groups in tabs vertical alignment (#2593) (54fac4a)
- softens columns and filters pill colors (#2642) (9072096)
- webp upload formatting (ccd6ca2)
Features
1.7.3 (2023-05-01)
Bug Fixes
- #2592, allows usage of hidden fields within access query constraints (#2599) (a0bb13a)
- addds workaround for slate isBlock function issue (#2596) (8f6f13d)
- bulk operations result type (#2588) (8382faa)
- query on id throws 500 (#2587) (0ba22c3)
- timestamp queries (#2583) (9c5107e)
Features
1.7.2 (2023-04-25)
Bug Fixes
- #2521, graphql AND not working with drafts (e67ca20)
- document drawer access control #2545 (439caf8)
- prevent floating point number in image sizes (#1935) (7fcde11)
- prevent sharp toFormat settings fallthrough by using clone (#2547) (90dab3c)
- query localized fields without localization configured (12edb1c)
- read-only styles (823d022)
Features
Features
- feat: exposes new replaceState form api (52ae6f06a)
- feat: support email configuration in payload config (#2485) (042e58ea2)
- feat: refactors buildQuery to rely on fields instead of mongoose (d187b809d)
- feat: add admin.hidden to collections and globals (#2487) (81d69d1b6)
- feat: replace deprecated express-graphql dependency (#2484) (cd548a6e2)
- feat: supports null preview url #2472 (e8a24fd2e)
- feat: migrates form builder example nextjs to examples (28ecb0c5e)
Bug Fixes
- fix: #2494, reduces versions caused by reverting to published with autosave: true (e0c0b2fdf)
- fix: incorrect version defaults (3f9bbe90b)
- fix: hides preview button until document is saved #2476 (#2477) (f9b8e2dbc)
- fix: corrects sidebar spacing in collection and global edit views #2478 (a45ab8bd7)
- fix: use correct locale when querying relationships for list view (#2438) (15442a9cc)
- fix: proper height data for animated gifs (#2506) (aee6ca05c)
- fix: Clear blocks modal search input when closing the modal (#2501) (0f8051b57)
- fix: excess padding on textarea (#2488) (6ceb79189)
- fix: increase line height for global title (#2465) (19ce0d79e)
- fix: uses docPermissions to show/hide x button on media collection doc fileDetails - #2428 (7f2c3d1d0)
- fix: prevents rendering of version actions when a user does not have permission (13cc669e2)
- fix: properly awaits email send to catch potential errors #2444 (#2470) (11a6ce6d3)
1.6.27 (2023-03-27)
Bug Fixes
- #2355, select field not fully visible on small screens in certain scenarios (07eb8dd)
- #2384, preserves manually set verified from admin UI (72a8b1e)
- hide fields with admin.hidden attribute (ad25b09)
- make update typing a deep partial (#2407) (e8dc7d4)
- restoring version did not correctly create new version from result (6ca12b1)
- textarea field overlap in UI (1c8cf24)
1.6.23 (2023-03-22)
Bug Fixes
- #2315 - deleting files if overwriteExistingFiles is true (4d578f1)
- #2363 version tabs and select field comparisons (#2364) (21b8da7)
- allows base64 thumbnails (#2361) (e09ebff)
- DateField admin type (#2256) (fb2fd3e)
- fallback to default locale showing on non-localized fields (#2316) (e1a6e08)
- Fix missing Spanish translations (#2372) (c0ff75c)
- relationship field useAsTitle #2333 (#2350) (10dd819)
Features
1.6.20 (2023-03-13)
Bug Fixes
- allow thumbnails in upload gallery to show useAsTitle value (aae6d71)
- allows useListDrawer to work without collectionSlugs defined (e1553c2)
- cancels existing fetches if new fetches are started (ccc92fd)
- check relationships indexed access for undefined (959f017)
- ensures documentID exists in doc documentDrawers (#2304) (566c45b)
- flattens title fields to allow seaching by title if title inside Row field (75e776d)
- keep drop zone active when hovering inner elements (#2295) (39e303a)
- Prevent browser initial favicon request (fd8ea88)
- removes forced require on array, block, group ts (657aa65)
- removes pagination type from top level admin config types (bf9929e)
- renders presentational table columns (4e1748f)
- undefined point fields saving as empty object (#2313) (af16415)
Features
1.6.17 (2023-03-06)
Bug Fixes
- #2150, can now query on N number of levels deep (ac54b11)
- #2179, async default values resetting form state (a4de51a)
- allows empty objects to be retained in db (0247e2d)
- clear relationship value (#2188) (387cec9)
- conditionally renders draggable pill (#2224) (812ab9f)
- ensures sorting on drafts works in all cases (c87fd2b)
- globals publish after draft (44651e6)
- minimize not set to false on all field type schemas (ace032e)
- pass result of previous hook into next hook (c661ac2)
- properly resizes animated images (#2181) (8c4f890)
- properly set req.payload on forgotPassword in local API (#2194) (5ac436e)
- redirects example (#2209) (5aa203d)
- removes duplicative fields from table columns #2221 (#2226) (474a3cb)
- renders rte upload drawer #2178 (523d9d4)
- skips field validation on submit if skipValidation is set to true (cf17760)
- Validate typescript signature (8d31ed6)
- version comparison view errors on old select value (#2163) (a3cc3c3)
- versions table (#2235) (066f5f6)
- virtual fields example (#2214) (f6eb020)
Features
1.6.16 (2023-02-28)
Bug Fixes
- #2150, can now query on N number of levels deep (ac54b11)
- #2179, async default values resetting form state (a4de51a)
- allows empty objects to be retained in db (0247e2d)
- clear relationship value (#2188) (387cec9)
- ensures sorting on drafts works in all cases (c87fd2b)
- globals publish after draft (44651e6)
- properly resizes animated images (#2181) (8c4f890)
- properly set req.payload on forgotPassword in local API (#2194) (5ac436e)
- redirects example (#2209) (5aa203d)
- renders rte upload drawer #2178 (523d9d4)
- skips field validation on submit if skipValidation is set to true (cf17760)
- version comparison view errors on old select value (#2163) (a3cc3c3)
Features
1.6.14 (2023-02-21)
Bug Fixes
- #2091 admin translations for filter operators (#2143) (8a8c392)
- #2096, allows custom ts paths with payload generate:types (686a616)
- #2117 collection pagination defaultLimit (#2147) (2a4db38)
- #2131, doesn't log in unverified user after resetting password (3eb85b1)
- #2134, allows links to be populated without having relationship or upload enabled (32a0778)
- #2148, adds queryHiddenFields property to find operation (15b6bb3)
- checks locale is valid for monaco code editor (#2144) (40224ed)
- generate proper json field type according to rfc (#2137) (7e88698)
- removes custom header and gutter from rte link drawer #2120 (#2135) (6a7663b)
- sizes property optional on upload (#2066) (79d047e)
- useFacet config option to disable $facet aggregation (#2141) (b4a2074)
1.6.10 (2023-02-14)
Bug Fixes
- #2077 useAPIKey UI missing with disableLocalStrategy (#2084) (586b25a)
- Add missing Spanish translations and fix typos (c4742e5)
- document type in update request handler (d5cd970)
- ensures versions createdAt matches the original doc (8c7e37c)
- globals not saving drafts unless published first (#2082) (4999fba)
- Use the user's AdminUI locale for the DatePicker (#2046) (#2057) (b4a7e91)
- validate type (7bb0984)
Features
1.6.5 (2023-02-07)
Bug Fixes
- allows radio input to be tabbable (b5880f2)
- auth type leaking into type gen (1f0a1c7)
- corrects keyboard accessibility for checkbox field (65b8fd2)
- ensures preview is enabled before rendering button (e968f40)
- local API update typing (#2010) (4b0d4f4), closes #2009
- max versions incorrectly sorting, causing incorrect versions to be held onto (2e4f7ab)
- named tabs not displaying data in versions view (a41e295)
- replaced media not rendering after document save (827428d)
- webpack css-loader resolve urls (ade4c01)
Features
1.6.1 (2023-02-01)
Bug Fixes
- #1870 and #1859 (c0ac155)
- aligns global preview config with the docs (#1940) (e7908b7)
- collection view pagination with limits resulting in empty list (8b778b6)
- corrects type for required named tab fields (#1939) (3058eb5)
- creates backup of latest version after restoring draft #1873 (bd4da37)
- disables escapeValue for i18n (#1886) (eec4b3a)
- ensures loader disappears after unsuccessful login, adjusts mobile loader styles (#1948) (3d854f7)
- hides fallback locale checkbox when field localization is set to false (#1893) (0623039)
- limits and sorts within pagination and not on initial aggregation (9b613ee)
- relation to many index unique fields (#1979) (453a903)
- updated nl i18n typos (cc7257e)
- versions error on cosmos db (338c4e2)
Features
- add Chinese translation (#1926) (7c6ff89)
- add Croatian translation (#1982) (dfa47a0)
- allows versions to be deleted alongside of main document deletion (a5c76d4)
- blocks drawer #1909 (339cee4)
- explicitly exports utilities (1efc6f5)
- isolates local api to local-only functions, converts it to ts generic for stronger typing (d3d367c)
- requires ts-node to start a project for any config that uses ts or jsx (f1c342e)
- simplifies versions logic (8cfa550)
🚨 BREAKING CHANGES
✋ Payload now no longer transpiles your config for you
This release removes the need to use @swc/register to automatically transpile Payload configs, which dramatically improves Payload initialization speeds and simplifies the core Payload logic significantly. More info in the PR here.
If you are not using TypeScript, this will be a breaking change. There are many ways to mitigate this - but the best way is to just quickly scaffold a barebones TS implementation. You can still write JavaScript, and this PR does not require you to write TS, but handling transpilation with TypeScript will be an easy way forward and can set you up to opt-in to TS over time as well.
For instructions regarding how to migrate to TS, review the PR here.
✋ Payload init is now always async, and payload.initAsync has been removed
We are pulling off a bandaid here and enforcing that payload.init is now asynchronous across the board. This will help prevent issues in the future and allow us to do more advanced things within init down the road. But this will be a breaking change if your project uses payload.init right now.
To migrate, you need to convert your code everywhere that you run payload.init to be asynchronous instead. For example, here is an example of a traditional payload.init call which needs to be migrated:
const express = require("express");
const payload = require("payload");
const app = express();
payload.init({
secret: "SECRET_KEY",
mongoURL: "mongodb://localhost/payload",
express: app,
});
app.listen(3000, async () => {
console.log(
"Express is now listening for incoming connections on port 3000."
);
});
Your payload.init call will need to be converted into the following:
const express = require("express");
const payload = require("payload");
const app = express();
const start = async () => {
await payload.init({
secret: "SECRET_KEY",
mongoURL: "mongodb://localhost/payload",
express: app,
});
app.listen(3000, async () => {
console.log(
"Express is now listening for incoming connections on port 3000."
);
});
};
start();
Notice that all we've done is wrapped the payload.init and app.listen calls with a start function that is asynchronous.
✋ All Local API methods are no longer typed as generics, and instead will infer types for you automatically
Before this release, the Local API methods were configured as generics. For example, here is an example of the findByID method prior to this release:
const post = await payload.findByID<Post>({
collection: "posts",
id: "id-of-post-here",
});
Now, you don't need to pass your types and Payload will automatically infer them for you, as well as significantly improve typing throughout the local API. Here's an example:
const post = await payload.findByID({
collection: "posts", // this is now auto-typed
id: "id-of-post-here",
});
// `post` will be automatically typed as `Post`
To migrate, just remove the generic implementation!
But there's one more thing to do before Payload can automatically type your Local API. You need to add a path to your tsconfig.json file that matches your exported types from Payload:
{
"compilerOptions": {
// your compilerOptions here
"paths": {
// Tell TS where to find your generated types
// This is the default location below
"payload/generated-types": ["./src/payload-types.ts"]
}
}
}
Then go regenerate your types. We've extended the payload generate:types method a bit to be more complete. Upon regenerating types, you'll see a new Config export at the top of the file which contains a key - value pair of all your collection and global types, which Payload will automatically import.
✋ JSX support must be defined in tsconfig.json
If not already defined, add the following to your compilerOptions:
"compilerOptions": {
"jsx": "react"
}
✋ Versions may need to be migrated
This release includes a substantial simplification / optimization of how Versions work within Payload. They are now significantly more performant and easier to understand behind-the-scenes. We've removed ~600 lines of code and have ensured that Payload can be compatible with all flavors of Mongo - including versions earlier than 4.0, Azure Cosmos MongoDB, AWS' DocumentDB and more.
But, some of your draft-enabled documents may need to be migrated.
If you are using versions and drafts on any collections, you can run a simple migration script to ensure that your drafts appear correctly in the Admin UI. Your data will never disappear from your database in any case if you update, but some drafts may not show in the List view anymore.
To migrate, create this file within the root of your Payload project:
migrateVersions.ts
const payload = require("payload");
require("dotenv").config();
const { PAYLOAD_SECRET, MONGODB_URI } = process.env;
// This function ensures that there is at least one corresponding version for any document
// within each of your draft-enabled collections.
const ensureAtLeastOneVersion = async () => {
// Initialize Payload
// IMPORTANT: make sure your ENV variables are filled properly here
// as the below variable names are just for reference.
await payload.init({
secret: PAYLOAD_SECRET,
mongoURL: MONGODB_URI,
local: true,
});
// For each collection
await Promise.all(
payload.config.collections.map(async ({ slug, versions }) => {
// If drafts are enabled
if (versions?.drafts) {
const { docs } = await payload.find({
collection: slug,
limit: 0,
depth: 0,
locale: "all",
});
const VersionsModel = payload.versions[slug];
const existingCollectionDocIds: Array<string> = [];
await Promise.all(
docs.map(async (doc) => {
existingCollectionDocIds.push(doc.id);
// Find at least one version for the doc
const versionDocs = await VersionsModel.find(
{
parent: doc.id,
updatedAt: { $gte: doc.updatedAt },
},
null,
{ limit: 1 }
).lean();
// If there are no corresponding versions,
// we need to create one
if (versionDocs.length === 0) {
try {
await VersionsModel.create({
parent: doc.id,
version: doc,
autosave: Boolean(versions?.drafts?.autosave),
updatedAt: doc.updatedAt,
createdAt: doc.createdAt,
});
} catch (e) {
console.error(
`Unable to create version corresponding with collection ${slug} document ID ${doc.id}`,
e?.errors || e
);
}
console.log(
`Created version corresponding with ${slug} document ID ${doc.id}`
);
}
})
);
const versionsWithoutParentDocs = await VersionsModel.deleteMany({
parent: { $nin: existingCollectionDocIds },
});
if (versionsWithoutParentDocs.deletedCount > 0) {
console.log(
`Removing ${versionsWithoutParentDocs.deletedCount} versions for ${slug} collection - parent documents no longer exist`
);
}
}
})
);
console.log("Done!");
process.exit(0);
};
ensureAtLeastOneVersion();
Make sure your environment variables match the script's values above and then run PAYLOAD_CONFIG_PATH=src/payload.config.ts npx ts-node -T migrateVersions.ts in your terminal. Make sure that you point the command to your Payload config.
This migration script will ensure that there is at least one corresponding version for each of your draft-enabled documents. It will also delete any versions that no longer have parent documents.
👀 Example of a properly migrated project
For an example of how everything works with this update, go ahead and run npx create-payload-app. We've updated create-payload-app to reflect all the necessary changes here and you can use a new project to compare / contrast what you have in your current project with what Payload needs now in this release.
1.5.5 (2023-01-11)
Bug Fixes
- #1808, arrays and blocks now save localized nested field data upon reordering rows (ee54c14)
- bug when clearing relationship field without hasMany: true (#1829) (ed7cfff)
- ensures upload file data is available for conditions (d40e136)
- fix miss typo in Thai translation (25e5ab7)
- formats date when useAsTitle (086117d)
- prevents uploads drawer from crashing when no uploads are enabled (84e1417)
- rte link element initial state #1848 (1cde647)
- updatesmargin for group field within a row (1c3a257)
- upload field filterOptions (9483ccb)
- wrong translation and punctuation spacing (bf1242a)
Features
1.4.2 (2023-01-03)
Bug Fixes
- #1775 - siblingData for unnamed fields within array rows improperly formatted (d6fcd19)
- #1786, relationship with hasMany no longer sets empty array as default value (ecfb363)
- error clearing date field (883daf7)
- select field crash on missing value option (ec9196e)
Features
1.4.0 (2022-12-23)
Bug Fixes
- #1611, unable to query draft versions with draft=true (44b31a9)
- #1656 remove size data (389ee26)
- #1698 - globals and autosave not working (915f1e2)
- #1738 save image dimensions to svg uploads (2de435f)
- #1747, rich text in arrays improperly updating initialValue when moving rows (d417e50)
- #1748, bails out of autosave if doc is published while autosaving (95e9300)
- #1752, removes label from row field type (ff3ab18)
- #551 - rich text nested list structure (542ea8e)
- allows cleared file to be reselected (35abe81)
- get relationships in locale of i18n language setting (#1648) (60bb265)
- missing file after reselect in upload component (6bc1758)
- prevents special characters breaking relationship field search (#1710) (9af4c1d)
- refreshes document drawer on save (9567328)
- removes update and created at fields when duplicating, ensures updatedAt data is reactive (bd4ed5b)
- safely clears sort #1736 (341c163)
- simplifies radio validation (0dfed3b)
- translated tab classnames (238bada)
- updates relationship label on drawer save and prevents stepnav update (59de4f7)
- updates richtext toolbar position if inside a drawer (468b0d2)
- use the slug for authentication header API Key (5b70ebd)
Features
- add Czech translation (#1705) (0be4285)
- adds doc permissions to account view (8d643fb)
- graphql: upgrade to graphql 16 (57f5f5e)
- refines tooltips animations https://github.com/payloadcms/payload/pull/1668
- creates new
useListDrawerhook, complement ofuseDocumentDrawerhttps://github.com/payloadcms/payload/pull/1668 - wires drawer UI into the
Uploadfield https://github.com/payloadcms/payload/pull/1668 - wires drawer UI into the
RichTextfield: https://github.com/payloadcms/payload/pull/1668- upload button
- upload element (edit and swap)
- link button
- link element (edit)
- relationship button
- relationship element (edit, swap, and remove)
BREAKING CHANGES
- replaced the useAPIKey authentication header format to use the collection slug instead of the collection label. Previous:
${collection.labels.singular} API-Key ${apiKey}, updated:${collection.slug} API-Key ${apiKey}
1.3.1 (2022-12-15)
Bug Fixes
- add i18n type to collection and globals admin.description (#1675) (049d560)
- adds draftsEnabled to baseSchema for tabs / arrays / groups & allows for null enum (80da898)
- adds draftsEnabled to versionSchema in collections / globals (f0db5e0)
- collapsible margin bottom adjustment (#1673) (64086e8)
- escapes react-select events when drawer is open (f290cda)
- label translation in about to delete dialog (#1667) (d9c45f6)
- list view date field display format (#1661) (934b443)
- removes case for select field that sets data to undefined if set to null (b4f39d5)
- Set 'Dashboard's link to config route (#1652) (940c1e8)
- stringifies date in DateTime field for useAsTitle (#1674) (a1813ca)
Features
- inline relationships (8d744c8)
- custom button html element (5592fb1)
- further Tooltip improvements (e101f92)
1.3.0 (2022-12-09)
1.3.0 (2022-12-09)
Bug Fixes
-
#1547, global afterChange hook not falling back to original global if nothing returned (a72123d)
-
#1632 graphQL non-nullable relationship and upload fields (#1633) (eff3f18)
-
change edit key to prevent richtext editor from crashing (#1616) (471d214)
-
filterOptions function argument relationTo is an array (#1627) (11b1c0e)
-
resets slate state when initialValue changes, fixes #1600, #1546 (9558a22)
-
sanitizes global find query params (512bc1e)
-
unflattens fields in filterOptions callback (acff46b)
-
feat!: no longer sanitize collection slugs to kebab case (#1607) (ba2f2d6), closes #1607
Features
- add Norwegian bokmål (nb) translation (#1614) (759f001)
- add Thai translation (#1630) (7777d11)
- upload support pasting file (eb69b82)
BREAKING CHANGES
- collection slugs are no longer automatically sanitized to be kebab case. This will only be an issue if your current slugs were in camel case. The upgrade path will be to change those slugs to the kebab case version that the slug was automatically being sanitized to on the backend.
If you only use kebab case or single word slugs: no action needed.
If you have existing slugs with camel case and populated data: you'll need to convert these to the kebab case version to match the previously sanitized value.
ie. myOldSlug is your slug, you should convert it to my-old-slug.
Any future slugs after updating will be used as-is.
1.2.5 (2022-12-06)
Bug Fixes
- exits findOptionsByValue when matchedOption is found (881c067)
- mismatch language condition when rendering unpublish (3ddd0ea)
- safely coerces limit and depth to number or undefined (dd04d78)
- uses pathOrName to pass to internal Relationship field components (8874e87)
Features
1.2.2 (2022-12-02)
Bug Fixes
- adds contain operators for text/email/radio fields (4c37af6)
- adjusts how limit is set, both in options and paginates limit (a718010)
- aligns mongoose PaginatedDocs type with actual lib type (dce2081)
- allows for form controlled relationship fields to be populated (e4435bb)
- allows for limit bypass on version find operations (891f00d)
- blockName grows in all browsers (03c2ab5)
- corrects skipValidation (e6f1c6f)
- dynamic relationship filterOptions (99c1f41)
- ensures enums cannot query on partial matches (ec51929)
- german translation optimizations (#1485) (e9d2163)
- handle multiple locales in relationship population (#1452) (04c689c)
- i18n: requiresAtLeast variable in de.json (#1556) (47fd0d9)
- ignore validation when unpublishing, do not allow restore with invalid form state (77ab542)
- indexSortableFields timestamp fields #1506 (#1537) (7aada3c)
- infinite rerenders, accounts for hasMany false (16d00e8)
- moves relationship field useEffect into async reducer action (54ef40a)
- moves sharp types from devDeps to deps (b3d526b)
- reverts async reducer and resolves infinite effect (a9da81f)
- sanitize number query params before passing to find operation (c8d1b9f)
- translate select field option labels (#1476) (3a9dc9e)
- update drafts includes latest version changes (48989d0)
- updates code field css (3eebd66)
- updates syntax colors for light theme (dbfe7ca)
- uses baseClass in code field (d03f0ae)
Features
1.2.1 (2022-11-22)
Bug Fixes
- adjusts styles to allow error bg to fill textarea (2e57b76)
- allows patching global drafts #1415 (25822a9)
- dynamically sets stepnav from default edit view (40c8778)
- ensures drafts operations saves as draft #1415 (fc16ffe)
- flattens locales before versioning published docs #1415 (f700f51)
- i18n: version count (#1465) (075b7e9)
- Increase textarea click area (c303913)
- invalid query string user account request (#1478) (400cb9b)
- removes incorrectly import/export option type - #1441 (ed01a17)
- rendering of localized select value (1d1d249)
- sanitizes select values on the server, allowing isClearable selects to be cleared without error (699ca14)
- translate version comparison view field labels (#1470) (8123585)
- versionCount was broken & other i18n improvements (#1450) (078c28b)
- versions tests (af6a7aa)
Features
1.2.0 (2022-11-18)
Bug Fixes
- build errors (65f0e1c)
- components optional chaining (d5e725c)
- corrects exported custom component type (2878b4b)
- corrects type for CollapsibleLabel example type, adjusts custom component filenames (ccb4231)
- sets pointer-events to none so the entire label bar is clickable (e458087)
Features
- add i18n to admin panel (#1326) (bab34d8)
- adds docs example (2bf0fff)
- adds playwright tests for array fields (57a8c35)
- converts rowHeader to collapsibleLabel, extends data passed to functions/components (13ec1e0)
- customizable header-labels (d45de99)
- simplifies collapsible label API, adds e2e tests (d9df98f)
- specifies component names for arrays/collapsibles, simplifies threaded data (b74ea21)
BREAKING CHANGES
- If you assigned labels to collections, globals or block names, you need to update your config! Your GraphQL schema and generated Typescript interfaces may have changed. Payload no longer uses labels for code based naming. To prevent breaking changes to your GraphQL API and typescript types in your project, you can assign the below properties to match what Payload previously generated for you from labels.
On Collections
Use graphQL.singularName, graphQL.pluralName for GraphQL schema names.
Use typescript.interface for typescript generation name.
On Globals
Use graphQL.name for GraphQL Schema name.
Use typescript.interface for typescript generation name.
On Blocks (within Block fields)
Use graphQL.singularName for graphQL schema names.
1.1.25 (2022-11-15)
Bug Fixes
- add slug to DocumentInfo context (#1389) (4d8cc97)
- adds unique key to upload cards to prevent old images being shown while navigating to new page (5e8a8b2)
- ensures admin components is defaulted (d103f6c)
- global afterRead and afterChange execution (#1405) (cdaa8cc)
Features
1.1.22 (2022-11-12)
Bug Fixes
- #1353, ensures errors returned from server make their way to UI (3f28a69)
- #1357, nested arrays and blocks sometimes not allowing save (86855d6)
- #1358, allows listSearchableFields to work when indicated fields are nested (eb0023e)
- #1360, relationship field onMenuScrollToBottom not working in some browsers (7136db4)
- #1367, allows custom global components within schema validation (1d76e97)
- 1309, duplicative logout in admin UI (35f91b0)
- fixed GraphQL Access query resolver to return the correct data (#1339) (cfef68f)
1.1.17 (2022-10-25)
Bug Fixes
- #1286, uses defaultDepth in graphql rich text depth (66bf8c3)
- #1290, renders more than one rich text leaf where applicable (a9f2f0e)
- #1291, add inline relationship drafts (3967c12)
- enforces depth: 0 in graphql resolvers (3301f59)
- ensures field updates when disableFormData changes (c929725)
- group + group styles within collapsible (17dbbc7)
Features
1.1.6 (2022-10-06)
Bug Fixes
- #1184 (c2ec54a)
- #1189 (3641dfd)
- #1204 (b4becd1)
- #940 (7926083)
- ajusts how disabled states are being set on anchors and buttons (00ef170)
- remove min-width from fileupload (73848b6)
- resize textarea only vertically (6e1dfff)
- richText e2e test, specific selectors (09a8144)
- styles readOnly RichTextEditor, removes interactivity within when readOnly (9181304)
- style: system dark scrollbars (a30d9dc)
- threads readOnly to ReactSelect (b454811)
- upload xls renaming ext (7fd8124)
Features
1.0.33 (2022-09-07)
Bug Fixes
- #1062 (05d1b14)
- #948 (8df9ee7)
- #981 (d588843)
- accented label char sanitization for GraphQL (#1080) (888734d)
- children of conditional fields required in graphql schema (#1055) (29e82ec)
- ensures adding new media to upload works when existing doc does not exist (5ae666b)
- implement the same word boundary search as the like query (#1038) (c3a0bd8)
- reorder plugin wrapping (#1051) (cd8edba)
- require min 1 option in field schema validation (#1082) (d56882c)
- update removing a relationship with null (#1056) (44b0073)
- update removing an upload with null (#1076) (2ee4c7a)
Features
1.0.28 (2022-08-29)
Bug Fixes
- incorrect field paths when nesting unnamed fields (#1011) (50b0303), closes #976
- relationship cell loading (#1021) (6a3cfce)
- remove lazy loading of array and blocks (4900fa7)
- require properties in blocks and arrays fields (#1020) (6bc6e7b)
- unpublish item will not crash the UI anymore (#1016) (0586d7a)
Features
1.0.10 (2022-07-27)
Bug Fixes
- #806, allow partial word matches using 'like' operator (c96985b)
- #836 (84611af)
- accesses payload config correctly in gql refresh resolver (d5e88cc)
- email not always loading while viewing auth collections (36e9acc)
- ensures collapsible preferences are retained through doc save (61f0e8e)
- id now properly required in graphql findByID operation (5dc7caf)
- set overflow payload modal container to auto (cfb5540)
- trim trailing whitespaces of email in login (8feed39)
Features
1.0.9 (2022-07-21)
Bug Fixes
- avoid assuming Email will be present on JWT token. Using ID instead as email might not be in if using disableLocalStrategy (#789) (3b4d5af)
- doc: corrects doc to match underlying Access type (#792) (6f8b8d0)
- enable index creation from schema (#791) (2a1f387)
- graphql gen logging output (#795) (8a81d0b)
- sharpens radio input edges by replacing box-shadow trick with border property (#768) (e2c366f)
Features
1.0.4 (2022-07-19)
Features
- Updated UI: Dark Mode
- Updated UI: Collapsibles (60bfb1c)
- Updated UI: Tabs field (68e7c41)
- Updated UI: Styling Revamp and responsive improvements
- More maintainable colors via CSS vars
- Improved test coverage through granular Payload configs
- Introduction of E2E tests through Playwright
- allow clear select value (#735) (3132d35)
BREAKING CHANGES
We have removed our reliance on SCSS variables like color and font, replacing them instead with CSS variables wherever possible.
Due to this change, the admin.scss functionality has become obsolete, and overriding SCSS variables is not longer needed or supported. If you want to customize CSS, you can still do so, but via the admin.css property instead.
0.19.2 (2022-07-11)
Bug Fixes
- ensures anonymous passport strategy is loaded last (df76f60)
- ensures router switch only contains top-level route components (91c4ef2)
- removes reliance on auth email (d68bb8c)
Features
- add afterMe afterLogout and afterRefresh (4055908)
- add preMiddleware and postMiddleware, deprecate middleware (e806437)
- add res to token hooks (166bd31)
- adds cookie-parser (5858752)
- begins extensible auth strategies (6d02f7d)
- better types useAuth and custom provider components (38b52bf)
- ensures auth component doesn't render if disabled (03f28a4)
- ensures only plain objects are merged within incoming configs (2c66ad8)
- extends strategies with more properties (6016e23)
- only adds email if local strategy enabled (56cdd94)
0.19.0 (2022-07-08)
Bug Fixes
- allow passing of autoIndex mongoose connectionOptions (#722) (567d8c1)
- copyfiles cross platform (#712) (67331eb)
- ensures auth/me relations in gql can be queried (01bc1fe)
- ensures old data from arrays is not persisted (d9ef803)
- relationship field disabled from access control in related collections (#644) (91e33d1)
Features
0.15.4 (2022-04-05)
Bug Fixes
- #495, avoids appending version to id queries (ab432a4)
- default point validation allows not required and some edge cases (29405bb)
- maintains field validation internally for speed (b99f6b1)
Features
- allows like to search by many words, adds contain to match exact strings (ec91757)
- extended validation function arguments (#494) (1b4b570), closes #495
- filter relationship options in admin ui using filterOptions (485991b)
- logging: allow pino logger options to be passed into init (6620a4f)
- support className config for row, block and array fields (#504) (0461c21)
- upload field implements filterOptions (1482fde)
- WIP extended validation function arguments (647cac3)
- working PoC for reusing relationship filters in validate (df934df)
0.15.0 (2022-03-16)
Bug Fixes
- #422, prevents loading duplicative relationship options (414679d)
- #423, #391 - prevents loading edit views until data initializes (2884654)
- #424, unable to clear localized property vals (1a05fe4)
- #431 - relationship field not properly fetching option results (6fab8bf)
- #454, withCondition type usability (56c16d5)
- #459 - in Relationship field to multiple collections, when the value is null, options are not populated (#460) (a9b83c8)
- #461 (08924a1)
- #464, graphql upload access control (fd0629e)
- adds key to RichText based on initialValue (f710b8c)
- adjusts lte and gte types to match docs and codebase (#480) (8fc4f7f)
- allow jwt to work without csrf in config (4048734)
- autosave (e835cbe)
- avoids console 404 on unpublished docs (c7c3418)
- awaits beforeDelete hooks (609b871)
- bug in how find merges drafts (1fb1eaa)
- bug with version count (6bf7d82)
- config empty and sparse csrf is now allowed (7e7b058)
- ensures empty hasMany relationships save as empty arrays (08b3e8f)
- ensures fetching published doc only retrieves published docs (7841f2a)
- ensures multipart/form-data using _payload flattens field data before sending (ae44727)
- ensures nested lists always render properly (20e5dfb)
- ensures overrideAccess is false if undefined while populating (97f3178)
- ensures revision hooks await promises (f56bbe8)
- ensures revisions retain all locales (f246252)
- ensures rte upload is populated when only upload is enabled (39438b8)
- ensures unique is not set within revisions collections (b13615f)
- ensures VersionCount is accurate (7569811)
- ensures versions have proper data (0ba508a)
- further sanitize serverURL to prevent undefined in admin routes (#481) (24aa475)
- import path for createRichTextRelationshipPromise (586cd4d)
- improperly typed local create method (48aa27c)
- improves version config sanitization (fc24485)
- mobile styling to not found page (d3f88a1)
- new slate version types (c5de01b)
- optimizes relationship input search querying (7e69fcb)
- prevents None from appearing in hasMany relationship select options (cbf43fa)
- rare crash with link rte element (f5535f6)
- removes required from versions status field (03c8445)
- rte upload field population (8327b5a)
- type error in useField (ef4e6d3)
- uses replace instead of push to autocreate a doc (a7ecada)
- version where input type (a5c8ea4)
Features
- #458, provides field hooks with sibling data (8e23a24)
- abstracts revisions components for reuse in globals (da5684d)
- add before and after login components (#427) (5591eea)
- add local api for versions on globals (4072e7e)
- add logMockCredentials email option (ff33453)
- add pagination argument to optimize graphql relationships and use in local api (#482) (647db51)
- adds a way to customize express.static options (dbb3c50)
- adds admin.upload.collections[collection-name].fields to the RTE to save specific data on upload elements (3adf44a)
- adds autosave to versions table (14e5d09)
- adds base revision fields (6ed11a5)
- adds indentation controls to rich text (7df50f9)
- adds most recently published comparison doc (1e093e1)
- adds originalDoc to field access control (c979513)
- adds path to GraphQL errors (#457) (ad98b29)
- adds recursion to richText field to populate relationship and upload nested fields (42af22c)
- adds restore revisions to collections (5eea398)
- adds stepnav to revisions template (a589877)
- allow empty string radio and select option values (#479) (f14e187)
- allows access control to prevent reading of drafts (c38470c)
- allows global access control to return query constraints (c0150ae)
- allows select input to receive new options (#435) (500fb1c)
- allows selection of revisions in certain locales to compare (f572230)
- attempts to render rich text diffs more appropriately (7bd60b5)
- builds a way for multipart/form-data reqs to retain non-string values (65b0ad7)
- builds a way for multipart/form-data reqs to retain non-string values (4efc2cf)
- builds autosave into existing update operation (de48f44)
- builds global publishVersion (7397d63)
- builds group and iterable diffs (bddaefd)
- builds remainder of diff field types (a479770)
- builds revert to saved, unpublish (160ab54)
- builds revisions list view (1920a93)
- builds revisions models (0686126)
- creates global revisions (ec82b92)
- disables LeaveWithoutSaving if autosave enabled (01d07bc)
- enhances rich text upload with custom field API (0e4eb90)
- ensures field hooks run on all locales when locale=all (c3f743a)
- ensures revisions are created and deleted accordingly (8df767e)
- exposes data arg within create and update access control (73f418b)
- exposes FieldWithPath type for reuse (df3a836)
- exposes useLocale for reuse (bef0206)
- finishes revision restore (0e093bf)
- functional autosave (e910d89)
- further revisions views (740d6b1)
- GraphQL version collection resolvers (7cfb2f7)
- implements versions in global ui (eb4f957)
- implements versions in globals, adds tests (a59b14b)
- improve code coverage for graphql versions (26b13a8)
- improves adding rich text voids to RTE (966c3c6)
- improves relationship field performance (13318ff)
- improves rich text link (2e9a4c7)
- improves versions UI count and list view (e81ba84)
- indexes filenames (07c8ac0)
- merges back in logic for non draft versions and draft versions (ed8abd9)
- optimization of unpublish, revert to saved (4e773c7)
- progress to Autosave (13add58)
- progress to draft types (b59bb0b)
- progress to drafts (be1da85)
- progress to restore revision (2e946a0)
- progress to revision restore (210488b)
- progress to saving drafts manually (71c49bc)
- removes mongoose required (4fbddee)
- renames revisions to versions (3a71afb)
- renders diffs (245e12e)
- reorders version creation (cd0e172)
- revision access control config (ac53bac)
- rich text indent PoC (2deed8b)
- scaffold of individual Revision view (40f93e9)
- scaffolds admin revisions (7253710)
- scaffolds drafts / autosave config (066b593)
- scaffolds new revisions operations and rest routes (4a445f0)
- scaffolds revisions tests (fbbe590)
- serverURL is no longer required (#437) (dca90c4)
- styles multiple collection actions (0463982)
- tests & autosave improvements (7220ff7)
- updates dependencies (3ca3f53)
- uses debounce in autosave (ee9cd24)
- uses DocumentInfo to fetch and maintain doc versions (8f30c3b)
- wires up restore (189bc21)
- working autosave (c62707c)
- working drafts (b00517e)
0.14.0 (2022-01-03)
Bug Fixes
- #370, only performs password functions when auth enabled (9738873)
- #390, safari rich text link bug (a16b99b)
- #393, ensures preview button gets up to date data (2f47e39)
- #408 (5c3cfa4)
- #408 (e2c5d93)
- 407 (a09570c)
- allows null in ImageSize width and height types (ba79fd4)
- cross-browser upload drag and drop (4119eec)
- ensures getDataByPath works (140a3aa)
- ensures local findByID retains user (05288ee)
- ensures row count is set properly in block fields (9e091af)
- ensures searching relationships works with many pages of results (961787d)
- globals model typing (da7c0c9)
Features
0.13.0 (2021-11-26)
Bug Fixes
- #351 (94c2b8d)
- #358 - reuploading with existing filenames (a0fb48c)
- allows sync or async preview urls (da6e1df)
- bug with relationship cell when no doc is available (40b33d9)
- ensures 'like' query param remains functional in all cases (20d4e72)
- ensures buildQuery works with fields as well as simultaneous or / and (72fc413)
- ensures non-localized relationships with many relationTos can be queried (7050b52)
- ensures relationship field search can return more than 10 options (57c0346)
- ensures richtext links retain proper formatting (abf61d0)
- ensures tquerying by relationship subpaths works (37b21b0)
- ensures uploads can be fetched with CORS (96421b3)
- issue with querying by id and using comma-separated values (d9e1b5e)
- typing for collection description (bb18e82)
- updates field description type to include react nodes (291c193)
Features
- add id fields to generated types (21a810c)
- adds field types to type generation (6dd1b0e)
- adds relationship filter field (463c4e6)
- applies upload access control to all auto-generated image sizes (051b7d4)
- azure cosmos compatibility (6fd5ac2)
- baseline type generation (5a965d2)
- ensures update hooks have access to full original docs even in spite of access control (b2c5b7e)
- finishes typing all fields (ed5a5eb)
- further types field based functions (6b150e0)
- generates further field types (2ca76ba)
- improves querying logic (4c85747)
- indexes filenames (5d43262)
- migrates admin preview to async (40ca3da)
- more typing of generics, better commenting of properties (820b6ad)
- renames useFieldType to useField (0245747)
- smarter generics (b99eb8b)
- supports custom onChange handling in text, select, and upload fields (4affdc3)
- type payload operation calls with generics (f258c59)
0.11.0 (2021-10-20)
Bug Fixes
- #338, array / block fields with only nested array block fields break admin UI (86e88d9)
- #341 - searching on multiple relationship collections (3b99ded)
- #343 - upload rte element crashes admin when no upload collection present (914cca6)
- make name required on field types (#337) (b257e01)
- more strict field typing (84f6a9d)
- per page now properly modifies search query (fcd9c28)
- properly types row field (7d49302)
- removes node 15 from CI (a2df67e)
- use proper error code on webpack build failure (2eb8154)
Features
- adds dynamic url field to upload-enabled collections (cc4d1fd)
- adds safety checks while querying on id with bad values (900f05e)
- admin: initial per page component (3715e01)
- allows richText enter key break out functionality to be extended in custom elements (ca91f47)
- improves richtext link (423ca01)
- per-page: add pagination to admin config (c132f2f)
- per-page: set and load from preferences (d88ce2d)
- saves active list filters in URL, implements per-page control (a6fc1fd)
0.10.4 (2021-09-22)
Bug Fixes
- allows image resizing if either width or height is larger (8661115)
- array objects now properly save IDs (2b8f925)
- date field error message position (03c0435)
- properly types optional req in local findByID (02e7fe3)
Features
- adjusts empty group population to be virtual only (8a890fd)
- allows local update api to replace existing files with newly uploaded ones (dbbff4c)
- defaults empty group fields to empty object (39a8e2c)
- defaults empty group fields to empty object (e39ece4)
- exposes Pill component for re-use (7e8df10)
- performance improvement while saving large docs (901ad49)
0.10.0 (2021-09-09)
Bug Fixes
- admin UI collection id is required (dc96b90)
- allow save of collection with an undefined point (f80646c)
- config validation correctly prevents empty strings for option values (41e7feb)
- ensures hooks run before access (96629f1)
- ensures proper order while transforming incoming and outgoing data (c187da0)
- improve id type semantic and restrict possible types to text and number (29529b2)
- remove media directory to improve test run consistency (d42d8f7)
- sanitize custom id number types (c7558d8)
- sort id columns (114dc1b)
Features
- add config validation for collections with custom id (fe1dc0b)
- add config validation for collections with custom id (d0aaf4a)
- add point field type (7504155)
- allows user to pass req through local findByID (8675481)
- frontend polish to point field (64ad6a3)
- graphql support for custom id types (bc2a6e1)
- point field localization and graphql (30f1750)
- replace the collection idType option with an explicit id field (4b70a12)
- support custom ids (3cc921a)
0.7.9 (2021-07-27)
Bug Fixes
- missing richtext gutter (4d1249d)
Features
- add admin description to collections and globals (4544711)
- add collection slug to schema validation errors (ebfb72c)
- add component support to collection and global description (fe0098c)
- add component support to field description (e0933f6)
- add customizable admin field descriptions (dac60a0)
- add descriptions to every allowed field type, globals and collections (29a1108)
- add global slug and field names to schema validation errors (bb63b4a)
- improves group styling when there is no label (ea358a6)
0.6.6 (2021-04-27)
Bug Fixes
- graphql returns compatible error format (6f188b1)
- handle rich text saving as empty string (382089b)
- removes incoming.data.length check, since data is typed as a keyed array when it is an instance of APIError (2643e1a)
- support image resizing on M1 chip (8cfc039)
- update operation can save password changes (a85bf9e)
0.6.0 (2021-04-19)
Bug Fixes
- clears richtext element on enter, refocuses on toolbar button click (4b19795)
- ensures api keys are properly populated in admin (4359a70)
- ensures first options are loaded only once (75a5b04)
- searching on relationship fields properly fetches results (b86c3da)
- upload useAsTitle set to filename by default (7db23f8)
Features
0.5.7 (2021-04-13)
Bug Fixes
- clears verificationToken when _verified is true (e58b152)
- custom query / mutation types (a78fc97)
- ensures email is still prefilled in auth configs (31c41c2)
- ensures failed conditions send path to form (dff72fb)
- handle add/remove labels for all usage of Array field type (ddf5df2)
- make upload cell mimetype inline (414bc01)
- pagination calculation for current range (000dee8)
- updates config schema for graphQL mutations and queries (afc9454)
Features
0.5.0 (2021-03-29)
Bug Fixes
- allows absolute urls within adminThumbnail (51b46d4)
- handles empty indices within array field data (c4a66c2)
- handles empty indices within array field data (d47e2c5)
- moving nested arrays now properly persists row count (5f9a5c8)
- validation consistency within admin (50b9937)
Features
0.4.6 (2021-03-14)
Features
- allows admin thumbnail to be set programmatically (b6a9fe4)
- exports collection field hook types from payload/types (36aae5c)
- only runs adminThumbnail func if image type (5e1ddb5)
- provides field access control with document data (339f750)
- reorders uploads to provide beforeChange hooks with upload data (3c42e6e)