feat!: re-order DefaultCellComponentProps generics (#9207)

### What?
Changes the order of the `DefaultCellComponentProps` generic type,
allowing us to infer the type of cellData when a ClientField type is
passed as the first generic argument. You can override the cellData type
by passing the second generic.

Previously:
```ts
type DefaultCellComponentProps<TCellData = any, TField extends ClientField = ClientField>
```

New:
```ts
type DefaultCellComponentProps<TField extends ClientField = ClientField, TCellData = undefined>
```

### Why?
Changing the ClientField type to be the first argument allows us to
infer the cellData value type based on the type of field.

I could have kept the same signature but the usage would look like:
```ts
// Not very DX friendly
const MyCellComponent<DefaultCellComponentProps<,ClientField>> = () => null
```

### How?
The changes made
[here](https://github.com/payloadcms/payload/compare/chore/beta/simplify-DefaultCellComponentProps?expand=1#diff-24f3c92e546c2be3fed0bab305236bba83001309a7239c20a3e3dbd6f5f71dc6R29-R73)
allow this. You can override the type by passing in the second argument
to the generic.
This commit is contained in:
Jarrod Flesch
2024-11-14 12:31:42 -05:00
committed by GitHub
parent 5ff1bb366c
commit 77c99c2f49
12 changed files with 81 additions and 23 deletions

View File

@@ -6,8 +6,7 @@ import React from 'react'
import { useTranslation } from '../../../../../providers/Translation/index.js'
export interface ArrayCellProps
extends DefaultCellComponentProps<Record<string, unknown>[], ArrayFieldClient> {}
export interface ArrayCellProps extends DefaultCellComponentProps<ArrayFieldClient> {}
export const ArrayCell: React.FC<ArrayCellProps> = ({ cellData, field: { labels } }) => {
const { i18n } = useTranslation()

View File

@@ -6,7 +6,7 @@ import React from 'react'
import { useTranslation } from '../../../../../providers/Translation/index.js'
export interface BlocksCellProps extends DefaultCellComponentProps<any, BlocksFieldClient> {}
export interface BlocksCellProps extends DefaultCellComponentProps<BlocksFieldClient> {}
export const BlocksCell: React.FC<BlocksCellProps> = ({ cellData, field: { blocks, labels } }) => {
const { i18n } = useTranslation()

View File

@@ -6,7 +6,7 @@ import React from 'react'
import { useTranslation } from '../../../../../providers/Translation/index.js'
import './index.scss'
export const CheckboxCell: React.FC<DefaultCellComponentProps<boolean, CheckboxFieldClient>> = ({
export const CheckboxCell: React.FC<DefaultCellComponentProps<CheckboxFieldClient>> = ({
cellData,
}) => {
const { t } = useTranslation()

View File

@@ -5,7 +5,7 @@ import React from 'react'
import './index.scss'
export interface CodeCellProps extends DefaultCellComponentProps<string, CodeFieldClient> {
export interface CodeCellProps extends DefaultCellComponentProps<CodeFieldClient> {
readonly nowrap?: boolean
}

View File

@@ -7,9 +7,10 @@ import { useConfig } from '../../../../../providers/Config/index.js'
import { useTranslation } from '../../../../../providers/Translation/index.js'
import { formatDate } from '../../../../../utilities/formatDate.js'
export const DateCell: React.FC<
DefaultCellComponentProps<Date | number | string, DateFieldClient>
> = ({ cellData, field: { admin: { date } = {} } }) => {
export const DateCell: React.FC<DefaultCellComponentProps<DateFieldClient>> = ({
cellData,
field: { admin: { date } = {} },
}) => {
const {
config: {
admin: { dateFormat: dateFormatFromRoot },

View File

@@ -9,7 +9,7 @@ import './index.scss'
const baseClass = 'file'
export interface FileCellProps
extends DefaultCellComponentProps<any, TextFieldClient | UploadFieldClient> {}
extends DefaultCellComponentProps<TextFieldClient | UploadFieldClient> {}
export const FileCell: React.FC<FileCellProps> = ({
cellData: filename,

View File

@@ -5,9 +5,7 @@ import React from 'react'
import './index.scss'
export const JSONCell: React.FC<DefaultCellComponentProps<string, JSONFieldClient>> = ({
cellData,
}) => {
export const JSONCell: React.FC<DefaultCellComponentProps<JSONFieldClient>> = ({ cellData }) => {
const textToShow = cellData?.length > 100 ? `${cellData.substring(0, 100)}\u2026` : cellData
return (

View File

@@ -24,7 +24,6 @@ const baseClass = 'relationship-cell'
const totalToShow = 3
export type RelationshipCellProps = DefaultCellComponentProps<
any,
JoinFieldClient | RelationshipFieldClient | UploadFieldClient
>

View File

@@ -7,7 +7,7 @@ import React from 'react'
import { useTranslation } from '../../../../../providers/Translation/index.js'
export interface SelectCellProps extends DefaultCellComponentProps<any, SelectFieldClient> {}
export interface SelectCellProps extends DefaultCellComponentProps<SelectFieldClient> {}
export const SelectCell: React.FC<SelectCellProps> = ({ cellData, field: { options } }) => {
const { i18n } = useTranslation()

View File

@@ -3,7 +3,7 @@ import type { DefaultCellComponentProps, TextareaFieldClient } from 'payload'
import React from 'react'
export const TextareaCell: React.FC<DefaultCellComponentProps<string, TextareaFieldClient>> = ({
export const TextareaCell: React.FC<DefaultCellComponentProps<TextareaFieldClient>> = ({
cellData,
}) => {
const textToShow = cellData?.length > 100 ? `${cellData.substring(0, 100)}\u2026` : cellData