diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index fba5aeb21b2..c7cf72e631a 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -825,7 +825,6 @@ The [``](./Pagination.md) component gets the following constants fro * `hasPreviousPage`: True if the page number is greater than 1. * `hasNextPage`: True if the page number is lower than the total number of pages. * `actions`: A component that displays the pagination buttons (default: ``) -* `limit`: An element that is displayed if there is no data to show (default: ``) If you want to replace the default pagination by a "< previous - next >" pagination, create a pagination component like the following: diff --git a/docs/Upgrade.md b/docs/Upgrade.md index 431177638e2..79f29ddd556 100644 --- a/docs/Upgrade.md +++ b/docs/Upgrade.md @@ -924,6 +924,93 @@ The `` component no longer accepts a `touched` prop. This prop If you were using this prop, you can safely remove it. +## `useCheckAuth` No Longer Accepts A `disableNotification` Param + +The `useCheckAuth` hook no longer accepts the deprecated `disableNotification` param. To disable the "Authentication required" notification when calling `checkAuth`, `authProvider.checkAuth()` should return a rejected promise with the value `{ message: false }`: + +```ts +const authProvider: AuthProvider = { + //... + checkAuth: () => Promise.reject({ message: false }), +} +``` + +## `useLogoutIfAccessDenied` No Longer Accepts A `disableNotification` Param + +The `useLogoutIfAccessDenied` hook no longer accepts the deprecated `disableNotification` param. To disable the "Authentication required" notification when `checkError` is called, `authProvider.checkError()` should return a rejected promise with the value `{ message: false }`: + +```ts +const authProvider: AuthProvider = { + //... + checkError: () => Promise.reject({ message: false }), +} +``` + +Or the `useLogoutIfAccessDenied` hook could be called with an error param as follows: + +```ts +const logoutIfAccessDenied = useLogoutIfAccessDenied(); +logoutIfAccessDenied(new Error('Denied')); +``` +## `onError` Type From `ra-core` Was Removed + +The `onError` type from `ra-core` was removed. Use `OnError` instead. + +## `linkToRecord` Helper Was Removed + +The `linkToRecord` helper was removed. Use [`useCreatePath`](https://marmelab.com/react-admin/Routing.html#linking-to-a-page) instead. + +## `resolveRedirectTo` Helper Was Removed + +The `resolveRedirectTo` helper was removed. Use [`useCreatePath`](./Routing.html#linking-to-a-page) instead. + +## `formClassName` Prop Of `FieldProps` Type Was Removed + +The deprecated `formClassName` prop of `FieldProps` type has been removed as it is no longer used. + +## `formClassName` Prop Of `CommonInputProps` Type Was Removed + +The deprecated `formClassName` prop of `CommonInputProps` type has been removed as it is no longer used. + +## `PublicFieldProps` Interface Was Removed + +`PublicFieldProps` interface has been removed. Use `FieldProps` instead. + +## `InjectedFieldProps` Interface Was Removed + +`InjectedFieldProps` interface has been removed. Use `FieldProps` instead. + +## `` Is No Longer Supported + +The deprecated `` prop was removed. Use the `ThemesContext.Provider` instead: + +```diff +-import { ThemeProvider } from 'react-admin'; ++import { ThemeProvider, ThemesContext } from 'react-admin'; + + export const ThemeWrapper = ({ children }) => { + return ( +- +- {children} +- ++ {children} ++ + ); + }; +``` + +## `` Component Was Removed + +The deprecated `` component was removed. + ## TypeScript: `BulkActionProps` Type Has Been Removed The `BulkActionProps` has been removed as it did not contain any prop. You can safely remove it from your custom bulk actions. diff --git a/packages/ra-core/src/auth/useCheckAuth.spec.tsx b/packages/ra-core/src/auth/useCheckAuth.spec.tsx index 8f21feb25b5..85d62a5fc8c 100644 --- a/packages/ra-core/src/auth/useCheckAuth.spec.tsx +++ b/packages/ra-core/src/auth/useCheckAuth.spec.tsx @@ -21,20 +21,18 @@ const TestComponent = ({ params, logoutOnFailure, redirectTo, - disableNotification, }: { params?: any; logoutOnFailure?: boolean; redirectTo?: string; - disableNotification?: boolean; }) => { const [authenticated, setAuthenticated] = useState(true); const checkAuth = useCheckAuth(); useEffect(() => { - checkAuth(params, logoutOnFailure, redirectTo, disableNotification) + checkAuth(params, logoutOnFailure, redirectTo) .then(() => setAuthenticated(true)) .catch(() => setAuthenticated(false)); - }, [params, logoutOnFailure, redirectTo, disableNotification, checkAuth]); + }, [params, logoutOnFailure, redirectTo, checkAuth]); return
{authenticated ? 'authenticated' : 'not authenticated'}
; }; @@ -132,32 +130,6 @@ describe('useCheckAuth', () => { }); }); - it('should logout without showing a notification when disableNotification is true', async () => { - let location: Location; - render( - { - location = l; - }} - > - - - - - - - ); - await waitFor(() => { - expect(notify).toHaveBeenCalledTimes(0); - expect(screen.queryByText('authenticated')).toBeNull(); - expect(location.pathname).toBe('/login'); - }); - }); - it('should logout without showing a notification when authProvider returns error with message false', async () => { let location: Location; render( diff --git a/packages/ra-core/src/auth/useCheckAuth.ts b/packages/ra-core/src/auth/useCheckAuth.ts index 2db6a4526a1..31ad6229ab9 100644 --- a/packages/ra-core/src/auth/useCheckAuth.ts +++ b/packages/ra-core/src/auth/useCheckAuth.ts @@ -52,12 +52,7 @@ export const useCheckAuth = (): CheckAuth => { ); const checkAuth = useCallback( - ( - params: any = {}, - logoutOnFailure = true, - redirectTo = loginUrl, - disableNotification = false - ) => + (params: any = {}, logoutOnFailure = true, redirectTo = loginUrl) => authProvider.checkAuth(params).catch(error => { if (logoutOnFailure) { logout( @@ -66,9 +61,7 @@ export const useCheckAuth = (): CheckAuth => { ? error.redirectTo : redirectTo ); - const shouldSkipNotify = - disableNotification || - (error && error.message === false); + const shouldSkipNotify = error && error.message === false; !shouldSkipNotify && notify( getErrorMessage(error, 'ra.auth.auth_check_error'), @@ -92,16 +85,13 @@ const checkAuthWithoutAuthProvider = () => Promise.resolve(); * @param {Object} params The parameters to pass to the authProvider * @param {boolean} logoutOnFailure Whether the user should be logged out if the authProvider fails to authenticate them. True by default. * @param {string} redirectTo The login form url. Defaults to '/login' - * @param {boolean} disableNotification Avoid showing a notification after the user is logged out. false by default. * * @return {Promise} Resolved to the authProvider response if the user passes the check, or rejected with an error otherwise */ export type CheckAuth = ( params?: any, logoutOnFailure?: boolean, - redirectTo?: string, - /** @deprecated to disable the notification, authProvider.checkAuth() should return an object with an error property set to true */ - disableNotification?: boolean + redirectTo?: string ) => Promise; const getErrorMessage = (error, defaultMessage) => diff --git a/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx b/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx index dcd79382766..f4365066849 100644 --- a/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx +++ b/packages/ra-core/src/auth/useLogoutIfAccessDenied.spec.tsx @@ -39,18 +39,12 @@ const authProvider: AuthProvider = { getPermissions: () => Promise.reject('bad method'), }; -const TestComponent = ({ - error, - disableNotification, -}: { - error?: any; - disableNotification?: boolean; -}) => { +const TestComponent = ({ error }: { error?: any }) => { const [loggedOut, setLoggedOut] = useSafeSetState(false); const logoutIfAccessDenied = useLogoutIfAccessDenied(); useEffect(() => { - logoutIfAccessDenied(error, disableNotification).then(setLoggedOut); - }, [error, disableNotification, logoutIfAccessDenied, setLoggedOut]); + logoutIfAccessDenied(error).then(setLoggedOut); + }, [error, logoutIfAccessDenied, setLoggedOut]); return
{loggedOut ? '' : 'logged in'}
; }; @@ -169,28 +163,6 @@ describe('useLogoutIfAccessDenied', () => { expect(screen.queryByText('logged in')).toBeNull(); }); - it('should logout without showing a notification if disableAuthentication is true', async () => { - render( - - } - />, - { - wrapper: TestWrapper, - } - ); - await waitFor(() => { - expect(authProvider.logout).toHaveBeenCalledTimes(1); - expect(notify).toHaveBeenCalledTimes(0); - expect(screen.queryByText('logged in')).toBeNull(); - }); - }); - it('should logout without showing a notification if authProvider returns error with message false', async () => { render( @@ -203,14 +175,7 @@ describe('useLogoutIfAccessDenied', () => { }} > - - - - } - /> + } /> @@ -222,6 +187,22 @@ describe('useLogoutIfAccessDenied', () => { }); }); + it('should logout without showing a notification if it has been called with error param', async () => { + render( + } + />, + { + wrapper: TestWrapper, + } + ); + await waitFor(() => { + expect(authProvider.logout).toHaveBeenCalledTimes(0); + expect(notify).toHaveBeenCalledTimes(0); + }); + }); + it('should notify if passed an error with a message that makes the authProvider throw', async () => { render( { const notify = useNotify(); const navigate = useNavigate(); const logoutIfAccessDenied = useCallback( - (error?: any, disableNotification?: boolean) => + (error?: any) => authProvider .checkError(error) .then(() => false) .catch(async e => { const logoutUser = e?.logoutUser ?? true; - //manual debounce if (timer) { // side effects already triggered in this tick, exit @@ -68,7 +67,6 @@ const useLogoutIfAccessDenied = (): LogoutIfAccessDenied => { : undefined; const shouldNotify = !( - disableNotification || (e && e.message === false) || (error && error.message === false) || redirectTo?.startsWith('http') @@ -127,15 +125,10 @@ const logoutIfAccessDeniedWithoutProvider = () => Promise.resolve(false); * If the authProvider rejects the call, logs the user out and shows a logged out notification. * * @param {Error} error An Error object (usually returned by the dataProvider) - * @param {boolean} disableNotification Avoid showing a notification after the user is logged out. false by default. * * @return {Promise} Resolved to true if there was a logout, false otherwise */ -type LogoutIfAccessDenied = ( - error?: any, - /** @deprecated to disable the notification, authProvider.checkAuth() should return an object with an error property set to true */ - disableNotification?: boolean -) => Promise; +type LogoutIfAccessDenied = (error?: any) => Promise; const getErrorMessage = (error, defaultMessage) => typeof error === 'string' diff --git a/packages/ra-core/src/controller/button/useDeleteWithConfirmController.tsx b/packages/ra-core/src/controller/button/useDeleteWithConfirmController.tsx index 422d57bf2b5..9b11d69a101 100644 --- a/packages/ra-core/src/controller/button/useDeleteWithConfirmController.tsx +++ b/packages/ra-core/src/controller/button/useDeleteWithConfirmController.tsx @@ -178,7 +178,6 @@ export interface UseDeleteWithConfirmControllerParams< mutationMode?: MutationMode; record?: RecordType; redirect?: RedirectionSideEffect; - // @deprecated. This hook get the resource from the context resource?: string; onClick?: ReactEventHandler; mutationOptions?: UseMutationOptions< diff --git a/packages/ra-core/src/controller/button/useDeleteWithUndoController.tsx b/packages/ra-core/src/controller/button/useDeleteWithUndoController.tsx index 547307dd0a4..954471abc1a 100644 --- a/packages/ra-core/src/controller/button/useDeleteWithUndoController.tsx +++ b/packages/ra-core/src/controller/button/useDeleteWithUndoController.tsx @@ -134,7 +134,6 @@ export interface UseDeleteWithUndoControllerParams< > { record?: RecordType; redirect?: RedirectionSideEffect; - // @deprecated. This hook get the resource from the context resource?: string; onClick?: ReactEventHandler; mutationOptions?: UseMutationOptions< diff --git a/packages/ra-core/src/controller/create/useCreateController.ts b/packages/ra-core/src/controller/create/useCreateController.ts index 26d0e3667ff..dfe97936009 100644 --- a/packages/ra-core/src/controller/create/useCreateController.ts +++ b/packages/ra-core/src/controller/create/useCreateController.ts @@ -213,9 +213,6 @@ export interface CreateControllerProps< export interface CreateControllerResult< RecordType extends Omit = any > extends SaveContextValue { - // Necessary for actions (EditActions) which expect a data prop containing the record - // @deprecated - to be removed in 4.0d - data?: RecordType; defaultTitle?: string; isFetching: boolean; isPending: boolean; diff --git a/packages/ra-core/src/controller/input/useReferenceInputController.ts b/packages/ra-core/src/controller/input/useReferenceInputController.ts index ca7418d0d15..30518aaccbe 100644 --- a/packages/ra-core/src/controller/input/useReferenceInputController.ts +++ b/packages/ra-core/src/controller/input/useReferenceInputController.ts @@ -7,9 +7,6 @@ import { ChoicesContextValue } from '../../form'; import { useReferenceParams } from './useReferenceParams'; import { UseQueryOptions } from '@tanstack/react-query'; -const defaultReferenceSource = (resource: string, source: string) => - `${resource}@${source}`; - /** * A hook for choosing a reference record. Useful for foreign keys. * @@ -218,8 +215,6 @@ export interface UseReferenceInputControllerParams< perPage?: number; record?: RaRecord; reference: string; - // @deprecated ignored - referenceSource?: typeof defaultReferenceSource; resource?: string; sort?: SortPayload; source: string; diff --git a/packages/ra-core/src/i18n/useLocale.tsx b/packages/ra-core/src/i18n/useLocale.tsx index 83f06b55a6b..0113092df5b 100644 --- a/packages/ra-core/src/i18n/useLocale.tsx +++ b/packages/ra-core/src/i18n/useLocale.tsx @@ -15,8 +15,6 @@ import { useLocaleState } from './useLocaleState'; * const locale = useLocale(); * return {availableLanguages[locale]}; * } - * - * @deprecated use useLocaleState instead */ export const useLocale = () => { const [locale] = useLocaleState(); diff --git a/packages/ra-core/src/i18n/useSetLocale.tsx b/packages/ra-core/src/i18n/useSetLocale.tsx index 80da12f08ee..6c4bcc7296e 100644 --- a/packages/ra-core/src/i18n/useSetLocale.tsx +++ b/packages/ra-core/src/i18n/useSetLocale.tsx @@ -23,8 +23,6 @@ import { useLocaleState } from './useLocaleState'; * } * ); * } - * - * @deprecated use useLocaleState instead */ export const useSetLocale = () => { const [, setLocale] = useLocaleState(); diff --git a/packages/ra-core/src/routing/index.ts b/packages/ra-core/src/routing/index.ts index 17603276874..7854460a987 100644 --- a/packages/ra-core/src/routing/index.ts +++ b/packages/ra-core/src/routing/index.ts @@ -1,7 +1,5 @@ export * from './AdminRouter'; export * from './BasenameContextProvider'; -export * from './linkToRecord'; -export * from './resolveRedirectTo'; export * from './RestoreScrollPosition'; export * from './useBasename'; export * from './useCreatePath'; diff --git a/packages/ra-core/src/routing/linkToRecord.spec.ts b/packages/ra-core/src/routing/linkToRecord.spec.ts deleted file mode 100644 index 08a955260b7..00000000000 --- a/packages/ra-core/src/routing/linkToRecord.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import expect from 'expect'; -import { linkToRecord } from './linkToRecord'; - -describe('Linking to a record', () => { - it('should generate valid edition links by default', () => { - expect(linkToRecord('books', 22)).toEqual('books/22'); - expect(linkToRecord('books', '/books/13')).toEqual( - 'books/%2Fbooks%2F13' - ); - expect(linkToRecord('blogs', 'https://dunglas.fr')).toEqual( - 'blogs/https%3A%2F%2Fdunglas.fr' - ); - }); - it('should generate valid show links if requested', () => { - expect(linkToRecord('books', 22, 'show')).toEqual('books/22/show'); - expect(linkToRecord('books', '/books/13', 'show')).toEqual( - 'books/%2Fbooks%2F13/show' - ); - expect(linkToRecord('blogs', 'https://dunglas.fr', 'show')).toEqual( - 'blogs/https%3A%2F%2Fdunglas.fr/show' - ); - }); -}); diff --git a/packages/ra-core/src/routing/linkToRecord.ts b/packages/ra-core/src/routing/linkToRecord.ts deleted file mode 100644 index 25a5488385d..00000000000 --- a/packages/ra-core/src/routing/linkToRecord.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @deprecated use useCreatePath instead - */ -export const linkToRecord = (resource, id, linkType = 'edit') => { - const link = `${resource}/${encodeURIComponent(id)}`; - - if (linkType === 'show') { - return `${link}/show`; - } - - return link; -}; diff --git a/packages/ra-core/src/routing/resolveRedirectTo.spec.ts b/packages/ra-core/src/routing/resolveRedirectTo.spec.ts deleted file mode 100644 index e386e8703d6..00000000000 --- a/packages/ra-core/src/routing/resolveRedirectTo.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import expect from 'expect'; -import { resolveRedirectTo } from './resolveRedirectTo'; - -describe('resolveRedirectTo', () => { - it('should accept a view name', () => { - expect(resolveRedirectTo('list', 'books', 1)).toEqual('/books'); - expect(resolveRedirectTo('create', 'books', 1)).toEqual( - '/books/create' - ); - expect(resolveRedirectTo('edit', 'books', 1)).toEqual('/books/1'); - expect(resolveRedirectTo('show', 'books', 1)).toEqual('/books/1/show'); - }); - - it('should accept a custom route name', () => { - expect(resolveRedirectTo('home', 'books', 1)).toEqual('home'); - }); - - it('should accept a function as parameter', () => { - const redirect = (resource, id, data) => - `/related/${data.related_id}/show`; - expect( - resolveRedirectTo(redirect, 'books', 1, { related_id: 3 }) - ).toEqual('/related/3/show'); - }); -}); diff --git a/packages/ra-core/src/routing/resolveRedirectTo.ts b/packages/ra-core/src/routing/resolveRedirectTo.ts deleted file mode 100644 index 84dfd8d404d..00000000000 --- a/packages/ra-core/src/routing/resolveRedirectTo.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { To } from 'react-router-dom'; - -/** - * @deprecated use useCreatePath instead - */ -export const resolveRedirectTo = ( - redirectTo, - resource: string, - id?, - data?, - basename: string = '' -): To => { - if (typeof redirectTo === 'function') { - const target: To = redirectTo(resource, id, data); - return typeof target === 'string' - ? removeDoubleSlashes(`${basename}/${target}`) - : { - pathname: removeDoubleSlashes( - `${basename}/${target.pathname}` - ), - ...target, - }; - } - switch (redirectTo) { - case 'list': - return removeDoubleSlashes(`${basename}/${resource}`); - case 'create': - return removeDoubleSlashes(`${basename}/${resource}/create`); - case 'edit': - return removeDoubleSlashes( - `${basename}/${resource}/${encodeURIComponent(id)}` - ); - case 'show': - return removeDoubleSlashes( - `${basename}/${resource}/${encodeURIComponent(id)}/show` - ); - default: - return redirectTo; - } -}; - -const removeDoubleSlashes = (path: string) => path.replace('//', '/'); diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index 5884f5643d8..0bf2ee45aae 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -257,8 +257,6 @@ export type OnSuccess = ( ) => void; export type OnError = (error?: any, variables?: any, context?: any) => void; -// @deprecated - use OnError instead -export type onError = OnError; export type TransformData = ( data: any, @@ -271,7 +269,7 @@ export interface UseDataProviderOptions { meta?: object; mutationMode?: MutationMode; onSuccess?: OnSuccess; - onError?: onError; + onError?: OnError; enabled?: boolean; } diff --git a/packages/ra-ui-materialui/src/detail/EditGuesser.spec.tsx b/packages/ra-ui-materialui/src/detail/EditGuesser.spec.tsx index 82d392d70fa..f8251191f4e 100644 --- a/packages/ra-ui-materialui/src/detail/EditGuesser.spec.tsx +++ b/packages/ra-ui-materialui/src/detail/EditGuesser.spec.tsx @@ -25,7 +25,7 @@ describe('', () => { getMany: () => Promise.resolve({ data: [] }), }; render( - + diff --git a/packages/ra-ui-materialui/src/detail/ShowGuesser.spec.tsx b/packages/ra-ui-materialui/src/detail/ShowGuesser.spec.tsx index e853a13fa5e..7d5e3c569de 100644 --- a/packages/ra-ui-materialui/src/detail/ShowGuesser.spec.tsx +++ b/packages/ra-ui-materialui/src/detail/ShowGuesser.spec.tsx @@ -24,7 +24,7 @@ describe('', () => { }), }; render( - + diff --git a/packages/ra-ui-materialui/src/field/index.ts b/packages/ra-ui-materialui/src/field/index.ts index aef0eef461a..b46f2bc4670 100644 --- a/packages/ra-ui-materialui/src/field/index.ts +++ b/packages/ra-ui-materialui/src/field/index.ts @@ -1,4 +1,4 @@ -import { FieldProps, InjectedFieldProps, PublicFieldProps } from './types'; +import { FieldProps } from './types'; export * from './ArrayField'; export * from './BooleanField'; @@ -24,4 +24,4 @@ export * from './TranslatableFieldsTabContent'; export * from './UrlField'; export * from './WrapperField'; -export type { FieldProps, InjectedFieldProps, PublicFieldProps }; +export type { FieldProps }; diff --git a/packages/ra-ui-materialui/src/field/sanitizeFieldRestProps.ts b/packages/ra-ui-materialui/src/field/sanitizeFieldRestProps.ts index cc66f58174a..4b981fc6c11 100644 --- a/packages/ra-ui-materialui/src/field/sanitizeFieldRestProps.ts +++ b/packages/ra-ui-materialui/src/field/sanitizeFieldRestProps.ts @@ -2,7 +2,6 @@ export const sanitizeFieldRestProps: (props: any) => any = ({ cellClassName, className, emptyText, - formClassName, fullWidth, headerClassName, label, diff --git a/packages/ra-ui-materialui/src/field/types.ts b/packages/ra-ui-materialui/src/field/types.ts index 847e34a0f5c..5e061835a3d 100644 --- a/packages/ra-ui-materialui/src/field/types.ts +++ b/packages/ra-ui-materialui/src/field/types.ts @@ -112,11 +112,6 @@ export interface FieldProps< */ headerClassName?: string; - /* - * @deprecated this property is not used anymore - */ - formClassName?: string; - /** * The text alignment for the cell content, when used inside . * @@ -168,42 +163,6 @@ export interface FieldProps< resource?: string; } -/** - * @deprecated use FieldProps instead - */ -export interface PublicFieldProps< - RecordType extends Record = Record, - SortByType = unknown -> { - sortBy?: unknown extends SortByType - ? Call - : SortByType; - sortByOrder?: SortOrder; - source?: Call; - label?: string | ReactElement | boolean; - sortable?: boolean; - className?: string; - cellClassName?: string; - headerClassName?: string; - /* - * @deprecated this property is not used anymore - */ - formClassName?: string; - textAlign?: TextAlign; - emptyText?: string; - fullWidth?: boolean; - record?: RecordType; - resource?: string; -} - -/** - * @deprecated use FieldProps instead - */ -export interface InjectedFieldProps { - record?: RecordType; - resource?: string; -} - export const fieldPropTypes = { sortBy: PropTypes.string, sortByOrder: PropTypes.oneOf(['ASC', 'DESC']), diff --git a/packages/ra-ui-materialui/src/input/CommonInputProps.ts b/packages/ra-ui-materialui/src/input/CommonInputProps.ts index 86a79712451..4cab53bc3c4 100644 --- a/packages/ra-ui-materialui/src/input/CommonInputProps.ts +++ b/packages/ra-ui-materialui/src/input/CommonInputProps.ts @@ -2,10 +2,6 @@ import { InputProps } from 'ra-core'; export type CommonInputProps = InputProps & { cellClassName?: string; - /* - * @deprecated this property is not used anymore - */ - formClassName?: string; fullWidth?: boolean; headerCellClassName?: string; margin?: 'none' | 'dense' | 'normal'; diff --git a/packages/ra-ui-materialui/src/input/SelectArrayInput.tsx b/packages/ra-ui-materialui/src/input/SelectArrayInput.tsx index 10e93f1be84..a523c236e29 100644 --- a/packages/ra-ui-materialui/src/input/SelectArrayInput.tsx +++ b/packages/ra-ui-materialui/src/input/SelectArrayInput.tsx @@ -403,7 +403,6 @@ const sanitizeRestProps = ({ enableGetChoices, filter, filterToQuery, - formClassName, initializeForm, initialValue, input, diff --git a/packages/ra-ui-materialui/src/input/sanitizeInputRestProps.ts b/packages/ra-ui-materialui/src/input/sanitizeInputRestProps.ts index 604ea26cec7..774adbbc820 100644 --- a/packages/ra-ui-materialui/src/input/sanitizeInputRestProps.ts +++ b/packages/ra-ui-materialui/src/input/sanitizeInputRestProps.ts @@ -9,7 +9,6 @@ export const sanitizeInputRestProps = ({ error, format, formatOnBlur, - formClassName, initialValue, initializeForm, input, diff --git a/packages/ra-ui-materialui/src/list/ListGuesser.spec.tsx b/packages/ra-ui-materialui/src/list/ListGuesser.spec.tsx index cfe30aa083a..242d752d531 100644 --- a/packages/ra-ui-materialui/src/list/ListGuesser.spec.tsx +++ b/packages/ra-ui-materialui/src/list/ListGuesser.spec.tsx @@ -28,7 +28,7 @@ describe('', () => { getMany: () => Promise.resolve({ data: [], total: 0 }), }); render( - + diff --git a/packages/ra-ui-materialui/src/list/SimpleList/SimpleList.tsx b/packages/ra-ui-materialui/src/list/SimpleList/SimpleList.tsx index 9d8bdacf3fe..c4e83048072 100644 --- a/packages/ra-ui-materialui/src/list/SimpleList/SimpleList.tsx +++ b/packages/ra-ui-materialui/src/list/SimpleList/SimpleList.tsx @@ -285,9 +285,6 @@ export interface SimpleListProps secondaryText?: FunctionToElement | ReactElement | string; tertiaryText?: FunctionToElement | ReactElement | string; rowSx?: (record: RecordType, index: number) => SxProps; - /** - * @deprecated Use rowSx instead - */ rowStyle?: (record: RecordType, index: number) => any; // can be injected when using the component without context resource?: string; diff --git a/packages/ra-ui-materialui/src/list/pagination/PaginationLimit.tsx b/packages/ra-ui-materialui/src/list/pagination/PaginationLimit.tsx deleted file mode 100644 index cc8b9cf9fa3..00000000000 --- a/packages/ra-ui-materialui/src/list/pagination/PaginationLimit.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from 'react'; -import { memo } from 'react'; -import CardContent from '@mui/material/CardContent'; -import Typography from '@mui/material/Typography'; -import { useTranslate } from 'ra-core'; - -/** - * @deprecated Empty state should be handled by the component displaying data (Datagrid, SimpleList). - */ -export const PaginationLimit = memo(() => { - const translate = useTranslate(); - return ( - - - {translate('ra.navigation.no_results')} - - - ); -}); diff --git a/packages/ra-ui-materialui/src/list/pagination/index.ts b/packages/ra-ui-materialui/src/list/pagination/index.ts index 6680e52590a..fe096e58938 100644 --- a/packages/ra-ui-materialui/src/list/pagination/index.ts +++ b/packages/ra-ui-materialui/src/list/pagination/index.ts @@ -1,4 +1,3 @@ export * from './InfinitePagination'; export * from './Pagination'; export * from './PaginationActions'; -export * from './PaginationLimit'; diff --git a/packages/ra-ui-materialui/src/theme/ThemeProvider.spec.tsx b/packages/ra-ui-materialui/src/theme/ThemeProvider.spec.tsx index 1488d592da4..d925a0fe8de 100644 --- a/packages/ra-ui-materialui/src/theme/ThemeProvider.spec.tsx +++ b/packages/ra-ui-materialui/src/theme/ThemeProvider.spec.tsx @@ -82,14 +82,4 @@ describe('ThemeProvider', () => { const button = screen.getByText('Test'); expect(getComputedStyle(button).color).toBe(DARK_MODE_TEXT_COLOR); }); - - it('should fallback to using theme prop when used outside of a ThemesContext (for backwards compatibility)', () => { - render( - - - - ); - const button = screen.getByText('Test'); - expect(getComputedStyle(button).color).toBe(DARK_MODE_TEXT_COLOR); - }); }); diff --git a/packages/ra-ui-materialui/src/theme/ThemeProvider.tsx b/packages/ra-ui-materialui/src/theme/ThemeProvider.tsx index 64d6f3a652d..9cd03ebe055 100644 --- a/packages/ra-ui-materialui/src/theme/ThemeProvider.tsx +++ b/packages/ra-ui-materialui/src/theme/ThemeProvider.tsx @@ -6,7 +6,6 @@ import { } from '@mui/material/styles'; import { useMediaQuery } from '@mui/material'; -import { RaThemeOptions } from './types'; import { useTheme } from './useTheme'; import { useThemesContext } from './useThemesContext'; import { AdminChildren } from 'ra-core'; @@ -30,10 +29,7 @@ import { AdminChildren } from 'ra-core'; * * ); */ -export const ThemeProvider = ({ - children, - theme: themeOverride, -}: ThemeProviderProps) => { +export const ThemeProvider = ({ children }: ThemeProviderProps) => { const { lightTheme, darkTheme, defaultTheme } = useThemesContext(); const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)', { @@ -45,14 +41,12 @@ export const ThemeProvider = ({ const themeValue = useMemo(() => { try { - return createTheme( - mode === 'dark' ? darkTheme : lightTheme || themeOverride - ); + return createTheme(mode === 'dark' ? darkTheme : lightTheme); } catch (e) { console.warn('Failed to reuse custom theme from store', e); return createTheme(); } - }, [mode, themeOverride, lightTheme, darkTheme]); + }, [mode, lightTheme, darkTheme]); return ( @@ -64,8 +58,4 @@ export const ThemeProvider = ({ export interface ThemeProviderProps { children: AdminChildren; - /** - * @deprecated Use the `ThemesProvider` component instead. - */ - theme?: RaThemeOptions; }