Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Fields Record Type Parameter #9092

Merged
merged 3 commits into from
Aug 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/Fields.md
Original file line number Diff line number Diff line change
Expand Up @@ -639,6 +639,6 @@ export const PostShow = () => (
);
```

**Limitation**: You must not extend `RaRecord` for this to work. This is because `RaRecord` extends `Record<string, any>` and TypeScript would not be able to infer your types properties.
**Limitation**: You must not extend `RaRecord` for this to work or TypeScript would not be able to infer your types properties.

Specifying the record type will also allow your IDE to provide auto-completion for both the `source` and `sortBy` prop. Note that the `sortBy` prop also accepts any string.
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/ArrayField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ import { genericMemo } from './genericMemo';
* @see useListContext
*/
const ArrayFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: ArrayFieldProps<RecordType>
) => {
Expand All @@ -98,7 +98,7 @@ ArrayFieldImpl.displayName = 'ArrayFieldImpl';
export const ArrayField = genericMemo(ArrayFieldImpl);

export interface ArrayFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType> {
children?: ReactNode;
perPage?: number;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/BooleanField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { FieldProps, fieldPropTypes } from './types';
import { sanitizeFieldRestProps } from './sanitizeFieldRestProps';

const BooleanFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: BooleanFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -90,7 +90,7 @@ BooleanFieldImpl.displayName = 'BooleanFieldImpl';
export const BooleanField = genericMemo(BooleanFieldImpl);

export interface BooleanFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {
valueLabelTrue?: string;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/ChipField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { FieldProps, fieldPropTypes } from './types';
import { genericMemo } from './genericMemo';

const ChipFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: ChipFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -52,7 +52,7 @@ ChipFieldImpl.displayName = 'ChipFieldImpl';
export const ChipField = genericMemo(ChipFieldImpl);

export interface ChipFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<ChipProps, 'label' | 'children'> {
/**
Expand Down
6 changes: 3 additions & 3 deletions packages/ra-ui-materialui/src/field/DateField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import { genericMemo } from './genericMemo';
* <span>mercredi 7 novembre 2012</span>
*/
const DateFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: DateFieldProps<RecordType>
) => {
Expand All @@ -60,7 +60,7 @@ const DateFieldImpl = <
return null;
}

const value = get(record, source);
const value = get(record, source) as any;
if (value == null || value === '') {
return emptyText ? (
<Typography
Expand Down Expand Up @@ -137,7 +137,7 @@ DateFieldImpl.displayName = 'DateFieldImpl';
export const DateField = genericMemo(DateFieldImpl);

export interface DateFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {
locales?: Intl.LocalesArgument;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/EmailField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { FieldProps, fieldPropTypes } from './types';
import { genericMemo } from './genericMemo';

const EmailFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: EmailFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -50,7 +50,7 @@ EmailFieldImpl.displayName = 'EmailFieldImpl';
export const EmailField = genericMemo(EmailFieldImpl);

export interface EmailFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<LinkProps, 'textAlign'> {}

Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/FileField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { Link } from '@mui/material';
* </div>
*/
export const FileField = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: FileFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -107,7 +107,7 @@ export const FileField = <
};

export interface FileFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType> {
src?: string;
title?: string;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/FunctionField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { FieldProps, fieldPropTypes } from './types';
* />
*/

export const FunctionField = <RecordType extends Record<string, unknown> = any>(
export const FunctionField = <RecordType extends Record<string, any> = any>(
props: FunctionFieldProps<RecordType>
) => {
const { className, source = '', render, ...rest } = props;
Expand Down Expand Up @@ -47,7 +47,7 @@ FunctionField.propTypes = {
};

export interface FunctionFieldProps<
RecordType extends Record<string, unknown> = any
RecordType extends Record<string, any> = any
> extends FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {
render: (record: RecordType, source?: string) => ReactNode;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/ImageField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { FieldProps, fieldPropTypes } from './types';
import { SxProps } from '@mui/system';

export const ImageField = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: ImageFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -109,7 +109,7 @@ const Root = styled(Box, {
});

export interface ImageFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType> {
src?: string;
title?: string;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/NumberField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import { genericMemo } from './genericMemo';
* <span>25,99 $US</span>
*/
const NumberFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: NumberFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -105,7 +105,7 @@ NumberFieldImpl.defaultProps = {
export const NumberField = genericMemo(NumberFieldImpl);

export interface NumberFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {
locales?: string | string[];
Expand Down
8 changes: 4 additions & 4 deletions packages/ra-ui-materialui/src/field/ReferenceField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ import { genericMemo } from './genericMemo';
* backward-compatibility is still kept
*/
export const ReferenceField = <
RecordType extends Record<string, unknown> = Record<string, any>,
RecordType extends Record<string, any> = Record<string, any>,
ReferenceRecordType extends RaRecord = RaRecord
>(
props: ReferenceFieldProps<RecordType, ReferenceRecordType>
Expand Down Expand Up @@ -107,7 +107,7 @@ ReferenceField.propTypes = {
};

export interface ReferenceFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>,
RecordType extends Record<string, any> = Record<string, any>,
ReferenceRecordType extends RaRecord = RaRecord
> extends Omit<FieldProps<RecordType>, 'source'>,
Required<Pick<FieldProps<RecordType>, 'source'>> {
Expand All @@ -126,7 +126,7 @@ export interface ReferenceFieldProps<
* which cannot be called conditionally when get(record, source) is empty.
*/
export const NonEmptyReferenceField = <
RecordType extends Record<string, unknown> = Record<string, any>,
RecordType extends Record<string, any> = Record<string, any>,
ReferenceRecordType extends RaRecord = RaRecord
>({
children,
Expand Down Expand Up @@ -264,7 +264,7 @@ ReferenceFieldView.propTypes = {
};

export interface ReferenceFieldViewProps<
RecordType extends Record<string, unknown> = Record<string, any>,
RecordType extends Record<string, any> = Record<string, any>,
ReferenceRecordType extends RaRecord = RaRecord
> extends FieldProps<RecordType>,
UseReferenceResult {
Expand Down
2 changes: 1 addition & 1 deletion packages/ra-ui-materialui/src/field/ReferenceManyField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export const ReferenceManyField = <
};

export interface ReferenceManyFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType> {
children: ReactNode;
filter?: FilterPayload;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/RichTextField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import { genericMemo } from './genericMemo';
* <RichTextField source="description" stripTags />
*/
const RichTextFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: RichTextFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -83,7 +83,7 @@ export type PurifyOptions = purify.Config & {
};

export interface RichTextFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {
stripTags?: boolean;
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/SelectField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ import { genericMemo } from './genericMemo';
* **Tip**: <ReferenceField> sets `translateChoice` to false by default.
*/
const SelectFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: SelectFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -147,7 +147,7 @@ SelectFieldImpl.displayName = 'SelectFieldImpl';
export const SelectField = genericMemo(SelectFieldImpl);

export interface SelectFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends ChoicesProps,
FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {}
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/TextField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { FieldProps, fieldPropTypes } from './types';
import { genericMemo } from './genericMemo';

const TextFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: TextFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -45,7 +45,7 @@ TextFieldImpl.displayName = 'TextFieldImpl';
export const TextField = genericMemo(TextFieldImpl);

export interface TextFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
Omit<TypographyProps, 'textAlign'> {
// TypographyProps do not expose the component props, see https://github.com/mui/material-ui/issues/19512
Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/UrlField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { FieldProps, fieldPropTypes } from './types';
import { genericMemo } from './genericMemo';

const UrlFieldImpl = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>(
props: UrlFieldProps<RecordType>
) => {
Expand Down Expand Up @@ -49,7 +49,7 @@ UrlFieldImpl.displayName = 'UrlFieldImpl';
export const UrlField = genericMemo(UrlFieldImpl);

export interface UrlFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType>,
AnchorHTMLAttributes<HTMLAnchorElement> {}

Expand Down
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/WrapperField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { FieldProps, fieldPropTypes } from './types';
* );
*/
export const WrapperField = <
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
>({
children,
}: WrapperFieldProps<RecordType>) => <>{children}</>;
Expand All @@ -34,7 +34,7 @@ WrapperField.displayName = 'WrapperField';
WrapperField.propTypes = fieldPropTypes;

export interface WrapperFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> extends FieldProps<RecordType> {
children: ReactNode;
}
4 changes: 2 additions & 2 deletions packages/ra-ui-materialui/src/field/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ type SortOrder = 'ASC' | 'DESC';
type AnyString = string & {};

export interface FieldProps<
RecordType extends Record<string, unknown> = Record<string, any>
RecordType extends Record<string, any> = Record<string, any>
> {
sortBy?: Call<Objects.AllPaths, RecordType> | AnyString;
sortByOrder?: SortOrder;
Expand All @@ -35,7 +35,7 @@ export interface FieldProps<
* @deprecated use FieldProps instead
*/
export interface PublicFieldProps<
RecordType extends Record<string, unknown> = Record<string, any>,
RecordType extends Record<string, any> = Record<string, any>,
SortByType = unknown
> {
sortBy?: unknown extends SortByType
Expand Down