Commit Graph

12120 Commits

Author SHA1 Message Date
Alessio Gravili
963387f7b0 feat(ui): export CodeEditor (#9650)
Requirement for https://github.com/payloadcms/payload/pull/9645
2024-12-02 03:19:26 +00:00
Alessio Gravili
4cd31ce343 fix: prevent workflow destructuring errors for failing tasks (#9649)
When destructuring the output of task in a job workflow handler, there
is a chance of a destructuring error being thrown if the task fails
2024-12-02 02:31:17 +00:00
Alessio Gravili
f151723745 feat(ui): export TabsProvider and TabComponent (#9647)
Requirement for https://github.com/payloadcms/payload/pull/9645
2024-12-02 02:28:13 +00:00
Said Akhrarov
2b4522b1db fix(translations): changes rs and rs-Latin dateFNSkey to proper locale instead of en-US (#9621)
### What?
Adds Serbian `rs` and `rs-Latin` to `importDateFNSLocale` as well as
changes their `dateFNSKey` in the language definition to the appropriate
key instead of `en-US`

### Why?
To support Serbian language with appropriately localized dates.

### How?
Minor changes in translations package.
2024-12-01 21:09:56 +00:00
Alessio Gravili
e6ea68e848 fix: ensure job errors are saved in payload (#9644)
Previously, job errors were not saved in payload
2024-12-01 20:57:14 +00:00
Elliot DeNolf
1e8c9d3a09 docs: add upgrade from previous beta section to migration guide (#9642) 2024-12-01 11:25:44 -05:00
Elliot DeNolf
fdfa07b863 feat(examples): add custom server example [skip-lint] (#9641)
Example using [Next.js Custom
Server](https://nextjs.org/docs/pages/building-your-application/configuring/custom-server)
with express.

Made from official
[examples/custom-server](https://github.com/vercel/next.js/tree/canary/examples/custom-server)
from Next.js repository.
2024-12-01 11:11:47 -05:00
Elliot DeNolf
519752f152 feat: export built-in field validations (#9622)
Export the built-in field validations that Payload uses.
2024-11-29 23:13:42 -05:00
Riley Pearce
2d2e7d50f0 fix(next): remove keyboard focus for closed nav items (#9558)
Fixes: #9610.

### What?

Currently some links inside the main nav are still focusable with a
keyboard when the main nav is closed.

### Why?

This leads to the active keyboard focus getting lost until it eventually
finds its way to the hamburger menu button. It can also lead to links
that are not currently visible being selected accidentally.

### How?

When the [inert
attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inert)
is set to `true`, we can prevent focus on any child elements
automatically. We simply toggle the attribute on or off based on whether
the nav is open or closed.

The inert attribute has [great
compatibility](https://caniuse.com/mdn-html_global_attributes_inert)
with modern browsers these days, making it a solid choice to resolve
this issue.

### Recordings

#### Before

You can see down the bottom left of the screen that links available in
the main nav are still focusable even when the main nav is closed.


https://github.com/user-attachments/assets/e16d5336-7d2b-42f1-886b-cfa3ed82dbb1

#### After

You can see that focus is immediately moved to the hamburger menu when
the main nav is closed.


https://github.com/user-attachments/assets/8c81197a-53aa-4af1-8e5c-f6835ba955a5
2024-11-29 13:58:40 -07:00
Alessio Gravili
030b759529 fix(richtext-lexical): ensure lexical doesn't break if used without react installed (#9620) 2024-11-29 20:54:38 +00:00
Jacob Fletcher
3d1a0656d2 fix(live-preview): populates localized relationships in client-side live preview (#9617)
Fixes #5026. When using client-side Live Preview, switching locale would
not populate relationships in that locale, and would use the default
locale instead. This was because locale was simply not being handled.
Now, we pass the locale through the event, and use it to make localized
queries when populating those relationships.
2024-11-29 15:41:39 -05:00
Yunsup Sim
9892303f1f fix(richtext-lexical): add form id to drawSlug (#9613)
Fixes #9532 

The error occurs because the drawerSlug declaration in
`blocks/client/component` contains `formData.id`, while
`blocks/client/componentInline` does not. So I add `formData.id`.

### Before



https://github.com/user-attachments/assets/14247634-ab60-437f-8986-c76cafec5c09


### After


https://github.com/user-attachments/assets/b26bc1ca-b071-4bf5-a9f0-fda4e9282538
2024-11-29 20:40:35 +00:00
Elliot DeNolf
0716128b3b chore: add contributor count badge to readme 2024-11-29 14:40:34 -05:00
Sasha
bc2d7c91e0 docs: fix links to /access-control/overview (#9619)
Fixes links to **Access Control** like here
https://payloadcms.com/docs/access-control/fields
2024-11-29 21:40:03 +02:00
Sasha
b8965077b8 fix(plugin-search): delete proper search document when doc has the same value but different relationTo (#9616)
Fixes https://github.com/payloadcms/payload/issues/9612

Previously, the plugin search with different collections but the same
IDs could delete a wrong search document on synchronization, because we
queried the search document only by `doc.value`. Instead, we should also
query by `doc.relationTo`.
2024-11-29 21:25:26 +02:00
Vasileios Drosatos
aa5dd8a77f docs: adds missing comma to example config in localization.mdx (#9618) 2024-11-29 19:02:39 +00:00
Elliot DeNolf
702df1f5da ci: add github-releases-to-discord 2024-11-29 13:57:37 -05:00
Elliot DeNolf
f150a68f56 ci: small tweaks to post-release 2024-11-29 13:57:25 -05:00
Elliot DeNolf
07e40d37ac chore(release): v3.2.2 [skip ci] v3.2.2 2024-11-29 12:59:59 -05:00
Alessio Gravili
c4327f2294 fix(ui): ensure UI is reactive to HMR changes, without having to refresh the page (#9602)
**Before:**

https://github.com/user-attachments/assets/c4ad9184-4629-419d-a30e-68dd802da387


**After:**

https://github.com/user-attachments/assets/4f7bcd4a-e1a7-464e-8036-55f48c1d5da1
2024-11-28 14:55:41 -07:00
Sasha
61a51ca02a fix(plugin-sentry): capture non APIError errors to sentry (#9595)
Previously, non Payload errors (that aren't `APIError`, for example from
`throw new Error()`) weren't captured to Sentry
2024-11-28 23:53:32 +02:00
Marwin Hormiz
27eeac2568 fix: add generic to LabelFunction to prevent type error for custom translation keys (#9335)
When creating custom translations and merging the custom translation
keys with the default translation keys, and then pass it to the generic
TFunction type, Typescript complains that the function does not satisfy
the LabelFunction type in a label field.

The reason for this is that the LabelFunction type is not generic, and
it's always using the default TFunction which itself uses the
DefaultTranslationKey if no type is passed to it.

This is solved by making the LabelFunction generic and forward the
TTranslationKeys to the TFunction type.

Following this documentation:
https://payloadcms.com/docs/configuration/i18n#typescript 

Example:

![image](https://github.com/user-attachments/assets/583ae9ca-63e7-4f49-9ded-0fca0a4a3d80)
2024-11-28 21:48:49 +00:00
Chris Aprea
3e4f7dbae2 docs: update the "More details" URLs in email.mdx (#9479)
Updates the "More details" link URLs in the generateEmailHTML and
generateEmailSubject rows to link to the correct element.

The links current use camelcase but the corresponding element IDs are
lowercase.

See this page: https://payloadcms.com/docs/authentication/email
2024-11-28 21:17:30 +00:00
Said Akhrarov
36c9a19b0e docs: fix names in examples for formBuilder and nestedDocs plugins (#9600)
### What?
The examples in nestedDocs and formBuilder plugins were referencing the
plugins incorrectly.

### Why?
To prevent confusion for readers.

### How?
Changes to `docs/plugins/form-builder.mdx` and
`docs/plugins/nested-docs.mdx`.
2024-11-28 14:15:36 -07:00
Arne Wiese
b5ddc328ef docs: fix typo in postgres docs (#9585)
This PR fixes a typo in the postgres docs

```
- disale
+ disable
```
2024-11-28 21:13:28 +00:00
Alessio Gravili
36a6a19de8 fix(ui): css is not defined error in production build (#9603)
Related: https://github.com/payloadcms/payload/pull/9456
Fixes https://github.com/payloadcms/payload/issues/9598

This ensures that the `CSS` property is accessed safely, preventing the
"CSS is not defined" error
2024-11-28 21:00:23 +00:00
Alessio Gravili
3da9be00bc fix: do not send admin dependencies to client (#9583)
We were sending unrendered `PayloadComponent`s to the client, which is a
remnant of old betas where those were actually rendered.

There is no point sending them to the client as they are useless there
and cannot be rendered without the server-only importMap. Additionally,
this could have potentially caused server-only modules to be sent to the
client (e.g. if serverProps was used), which would have lead to a
webpack error.

The types were also incorrect, as admin.dependencies on the ClientConfig
did not contain the React nodes.
2024-11-27 23:51:57 +00:00
Jarrod Flesch
4b302f22a0 fix: incorrect formState after doc save (#9573)
### What?
When the document is saved the formState was not being reset from the
server.

### Why?
getFormState was not being called onSuccess of the form submission

### How?
The `Form` onSuccess function now allows for an optional return type of
`FormState` if the functions returns formState then we check to see if
that differs from the current formState on the client. If it does then
we dispatch the `REPLACE_STATE` action with the newState.

Fixes https://github.com/payloadcms/payload/issues/9423
2024-11-27 16:45:10 -05:00
Alessio Gravili
c7138b9aab chore: update generated types for all test suites (#9577) 2024-11-27 20:36:37 +00:00
Riley Pearce
3c35d81fe5 fix(richtext-lexical): allow exiting the RTE with the keyboard in Firefox (#8654)
Closes #8653.

Originally this PR was for making the `IndentFeature` opt-in instead of
opt-out, which would have been a breaking change. After some discussion
it was determined it would be better if we could keep the
`IndentFeature` by default and instead come up with a custom escape key
solution to prevent keyboard users from becoming trapped in the editor.

These changes are my interpretation of how we can solve this problem in
a way that feels natural for a keyboard user. When a keyboard user
becomes trapped, the usual approach is to press the escape key (e.g.
modals) to be able to leave the current context and continue navigating.
These changes allow that to happen while minimising the cognitive load
by not needing to remember whether the `IndentFeature` is toggled on or
off.

I've also ensured the `IndentFeature` can actually be turned off if
consciously removed from the lexical editor features (previously it was
still enabled even if it was removed).

Ideally this should be handled on the lexical side in the
`TabIndentationPlugin` itself (I will begin to look into the feasibility
of this), but for now this should be suitable to ensure the experience
for keyboard users isn't completely blocked (there are a number of other
improvements that could be made but I will create more specific issues
for those).

Open to discussion and amendments. Once we're aligned on the approach
I'm happy to implement tests as needed.

### Before


https://github.com/user-attachments/assets/95183bb6-f36e-4b44-8c3b-d880c822d315

### After


https://github.com/user-attachments/assets/d34be50a-8f31-4b81-83d1-236d5ce9d8b5

---------

Co-authored-by: Germán Jabloñski <43938777+GermanJablo@users.noreply.github.com>
2024-11-27 16:53:19 -03:00
Jacob Fletcher
3961223cc1 fix(ui): retains search params when navigating back (#9576)
Closes #9132. When query params are present in the URL, such as after
searching or filtering in the list view, they are not being retained
after navigating back to that view via `history.back()` (i.e. the back
button). This makes it difficult to quickly navigate in and out of
documents from the list view when an underlying search exists. This was
because the `SearchParamsProvider` is stale when the new view renders,
which then replaces the URL with these stale params. The fix here is to
_not_ use the `SearchParamsProvider` at all, and instead use
`next/navigation` directly. Ultimately, this provider should likely be
marked deprecated and then removed in the next major release for this
very reason.
2024-11-27 14:49:53 -05:00
Sasha
303227363b chore(deps): bump react-error-boundary to 4.1.2 (#9575)
Bumps `react-error-boundary` as the current version breaks `pnpm != 9`
versions
8f48596c67
2024-11-27 18:42:24 +00:00
Alessio Gravili
ca07c9f0d7 fix(ui): ensure Form submit button only uses onClick handler when needed, as that was causing issues with password manager extensions (#9572) 2024-11-27 17:50:26 +00:00
Alessio Gravili
17c79454e3 fix(richtext-lexical): various JSX converter issues (#9570) 2024-11-27 10:19:34 -07:00
Sasha
4a854f86ae chore(examples): multi-tenant compatible with postgres ID check (#9568)
Fixes https://github.com/payloadcms/payload/issues/9565 multi-tenant
compatibility with Postgres (and custom IDs)

Adds a useful `extractID` utility:
```ts
import { Config } from '@/payload-types'
import type { CollectionSlug } from 'payload'

export const extractID = <T extends Config['collections'][CollectionSlug]>(
  objectOrID: T | T['id'],
): T['id'] => {
  if (objectOrID && typeof objectOrID === 'object') return objectOrID.id

  return objectOrID
}
```
2024-11-27 11:27:44 -05:00
Alessio Gravili
519bb790d8 feat(richtext-lexical): fully-typed blocks in JSX serializer (#9554)
This allows for full type-safety when using our official JSX converter
with blocks:

![CleanShot 2024-11-26 at 21 35
18@2x](https://github.com/user-attachments/assets/70ceb3e9-d5d1-4074-a5dd-bb9d514dc229)

![CleanShot 2024-11-26 at 21 35
25@2x](https://github.com/user-attachments/assets/5100133c-8a91-4cfe-8e44-c091b2d86ffa)
2024-11-26 22:56:22 -07:00
Elliot DeNolf
b47ebb6550 chore(templates): bump lock 3.2.1 (#9553) 2024-11-26 22:51:28 -05:00
Elliot DeNolf
be59d52ac7 chore(release): v3.2.1 [skip ci] v3.2.1 2024-11-26 22:29:29 -05:00
Elliot DeNolf
6af4deefc2 fix(plugin-search): missing copyfiles script, incorrect scss import (#9552)
.tsx files were introduced into the plugin-search package, but an
appropriate `copyfiles` script was not introduced to get these files
into the dist output.

This was causing a `Module not found: Can't resolve './index.scss'`
error on build.

---------

Co-authored-by: Alessio Gravili <alessio@gravili.de>
2024-11-26 20:28:07 -07:00
Elliot DeNolf
072f1efb41 chore(templates): bump lock 3.2 (#9551) 2024-11-26 21:22:29 -05:00
Elliot DeNolf
c8bee29920 chore(release): v3.2.0 [skip ci] v3.2.0 2024-11-26 20:39:41 -05:00
Jarrod Flesch
2248be4a2e fix: utilizes override access false (#9550)
### What?
overrideAccess was missing on local operations inside the server
function for copy locale.

### How?
Adds overrideAccess: false
2024-11-26 20:29:16 -05:00
Anthony Bouch
21db058e2e feat(richtext-lexical): export hasText helper (#9484)
### What?

Extracted `hasText` helper method in `richTextValidateHOC`

### Why?

The new exported `hasText` helper method can now also be used during
front-end serialization - for example, to check whether a caption
element should be rendered when text is optional and therefore possibly
empty (which would allow us to prevent rendering an empty caption
element).
2024-11-26 18:22:16 -07:00
Germán Jabloñski
90f893a558 fix(richtext-lexical): prevent use of text formats whose features were not enabled (#9507)
Fixes #8811

Before this PR, even if you did not include text formatting features
(such as BoldFeature, ItalicFeature, etc), it was possible to apply that
formatting by (a) pasting content from the clipboard and (b) using
keyboard shortcuts.

This PR fixes that by requiring the formatting features to be registered
so that they can be inserted in the editor.
2024-11-26 23:50:24 +00:00
Jacob Fletcher
5d18a5288e fix: overrides entity visibility within drawers (#9546)
When using the `admin.hidden: true` property on a collection, it
rightfully removes all navigation and routing for that particular
collection. However, this also affects the expected behavior of hidden
entities when they are rendered within a drawer, such as the document
drawer or list drawer. For example, when creating a new _admin.hidden_
document through the relationship or join field, the drawer should still
render the view, despite the underlying route for that view being
disabled. This change was a result of the introduction of on-demand
server components in #8364, where we now make a server roundtrip to
render the view in its entirety, which include the logic that redirects
these hidden entities.

Now, we pass a new `overrideEntityVisibility` argument through the
server function that, when true, skips this step. This way documents can
continue to respect `admin.hidden` while also having the ability to
override on a case-by-case basis throughout the UI.
2024-11-26 18:22:04 -05:00
Said Akhrarov
defa13e4fe feat(plugin-search): added support for reindexing collections on demand (#9391)
### What?
This PR aims to add reindexing capabilities to `plugin-search` to allow
users to reindex entire searchable collections on demand.

### Why?
As it stands, end users must either perform document reindexing manually
one-by-one or via bulk operations. Both of these approaches are
undesirable because they result in new versions being published on
existing documents. Consider the case when `plugin-search` is only added
_after_ the project has started and documents have been added to
existing collections. It would be nice if users could simply click a
button, choose the searchable collections to reindex, and have the
custom endpoint handle the rest.

### How?
This PR adds on to the existing plugin configuration, creating a custom
endpoint and a custom `beforeListTable` component in the form of a popup
button. Upon clicking the button, a dropdown/popup is opened with
options to select which collection to reindex, as well as a useful `All
Collections` option to run reindexing on all configured search
collections. It also adds a `reindexBatchSize` option in the config to
allow users to specify in what quantity to batch documents to sync with
search.

Big shoutout to @paulpopus & @r1tsuu for the triple-A level support on
this one!

Fixes #8902 

See it in action:


https://github.com/user-attachments/assets/ee8dd68c-ea89-49cd-adc3-151973eea28b

Notes:
- Traditionally these kinds of long-running tasks would be better suited
for a job. However, given how many users enjoy deploying to serverless
environments, it would be problematic to offer this feature exclusive to
jobs queues. I thought a significant amount about this and decided it
would be best to ship the feature as-is with the intention of creating
an opt-in method to use job queues in the future if/when this gets
merged.
- In my testing, the collection description somehow started to appear in
the document views after the on-demand RSC merge. I haven't reproduced
this, but this PR has an example of that problem. Super strange.

---------

Co-authored-by: Sasha <64744993+r1tsuu@users.noreply.github.com>
Co-authored-by: Paul Popus <paul@nouance.io>
2024-11-26 23:14:31 +00:00
Alessio Gravili
bffd98f019 feat(richtext-lexical): lexical => JSX converter (#8795)
Example:

```tsx
import React from 'react'
import {
  type JSXConvertersFunction,
  RichText,
} from '@payloadcms/richtext-lexical/react'

const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({
  ...defaultConverters,
  blocks: {
      // myTextBlock is the slug of the block
      myTextBlock: ({ node }) => <div style={{ backgroundColor: 'red' }}>{node.fields.text}</div>,
   },
})

export const MyComponent = ({ lexicalContent }) => {
  return (
    <RichText
      converters={jsxConverters}
      data={data.lexicalWithBlocks as SerializedEditorState}
    />
  )
}
```
2024-11-26 22:40:24 +00:00
Jessica Chowdhury
601759d967 feat: adds ability to copy data from across locales (#8203)
### What?

Adds ability to copy data from one locale to another at a document
level.

### How?

For any localized collection, you will find a new option in the document
controls called `Copy to Locale`.

This option will open a drawer, from here you can select your origin and
destination locales.

If data already exists in the destination locale, you can choose to: 
1. Overwrite this data (this will copy any empty fields in your origin
locale)
2. Not overwrite existing data (this will only copy data into empty
fields in the destination locale)

---------

Co-authored-by: Jarrod Flesch <jarrodmflesch@gmail.com>
2024-11-26 17:06:30 -05:00
Elliot DeNolf
61d6614746 chore(eslint): ignore examples dir 2024-11-26 17:02:07 -05:00
Patrik
f8b7e3eb14 chore(examples): removes external draft-preview examples (#9545)
In an effort to keep the Examples Directory as easy to navigate as
possible, and to keep the Payload Monorepo only as verbose as it needs
to be, we need to remove all alternatives from the Examples Directory.
This includes setups that interact with Payload from a standalone
server, keeping only the Payload recommended "combined" Next.js +
Payload setups.
2024-11-26 16:59:16 -05:00