From 74a35c7f35a642d9ed79384f0e7afbf7181c6a9f Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 28 Jan 2021 12:23:13 +0100 Subject: [PATCH 1/4] Ensure Resource Definition is Overridable with Props --- .../ra-core/src/core/useResourceDefinition.ts | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts index 416d84cf5eb..e0d1ebbd4ab 100644 --- a/packages/ra-core/src/core/useResourceDefinition.ts +++ b/packages/ra-core/src/core/useResourceDefinition.ts @@ -6,9 +6,34 @@ import { useResourceContext } from './useResourceContext'; /** * Hook which returns the definition of the requested resource */ -export const useResourceDefinition = (props): ResourceDefinition => { +export const useResourceDefinition = ( + props: UseResourceDefinitionOptions +): ResourceDefinition => { const resource = useResourceContext(props); const resources = useSelector(getResources); + if ( + props.resource && + (typeof props.hasCreate !== 'undefined' || + typeof props.hasEdit !== 'undefined' || + typeof props.hasList !== 'undefined' || + typeof props.hasShow !== 'undefined') + ) { + return { + ...props, + name: props.resource, + }; + } + return resources.find(r => r?.name === resource) || props; }; + +export interface UseResourceDefinitionOptions { + readonly resource?: string; + readonly options?: any; + readonly hasList?: boolean; + readonly hasEdit?: boolean; + readonly hasShow?: boolean; + readonly hasCreate?: boolean; + readonly icon?: any; +} From 65016ce43c986eeec977d8221faf56d0fd7cb975 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 28 Jan 2021 14:25:53 +0100 Subject: [PATCH 2/4] Apply review --- .../ra-core/src/core/useResourceDefinition.ts | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts index e0d1ebbd4ab..d5e69d2997d 100644 --- a/packages/ra-core/src/core/useResourceDefinition.ts +++ b/packages/ra-core/src/core/useResourceDefinition.ts @@ -1,4 +1,5 @@ import { useSelector } from 'react-redux'; +import merge from 'lodash/merge'; import { getResources } from '../reducer'; import { ResourceDefinition } from '../types'; import { useResourceContext } from './useResourceContext'; @@ -11,21 +12,17 @@ export const useResourceDefinition = ( ): ResourceDefinition => { const resource = useResourceContext(props); const resources = useSelector(getResources); - - if ( - props.resource && - (typeof props.hasCreate !== 'undefined' || - typeof props.hasEdit !== 'undefined' || - typeof props.hasList !== 'undefined' || - typeof props.hasShow !== 'undefined') - ) { - return { - ...props, - name: props.resource, - }; - } - - return resources.find(r => r?.name === resource) || props; + const definition = resources.find(r => r?.name === resource) || props; + const { hasCreate, hasEdit, hasList, hasShow } = props; + return props != null + ? merge({}, definition, { + hasCreate, + hasEdit, + hasList, + hasShow, + name: props.resource || definition.name, + }) + : definition; }; export interface UseResourceDefinitionOptions { From 08ed5d2df3f0b0a1f629cd0388240987c897efff Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 28 Jan 2021 16:33:00 +0100 Subject: [PATCH 3/4] Memoize definition --- .../ra-core/src/core/useResourceDefinition.ts | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts index d5e69d2997d..0f281826c17 100644 --- a/packages/ra-core/src/core/useResourceDefinition.ts +++ b/packages/ra-core/src/core/useResourceDefinition.ts @@ -3,6 +3,7 @@ import merge from 'lodash/merge'; import { getResources } from '../reducer'; import { ResourceDefinition } from '../types'; import { useResourceContext } from './useResourceContext'; +import { useMemo } from 'react'; /** * Hook which returns the definition of the requested resource @@ -12,17 +13,28 @@ export const useResourceDefinition = ( ): ResourceDefinition => { const resource = useResourceContext(props); const resources = useSelector(getResources); - const definition = resources.find(r => r?.name === resource) || props; + const definitionFromRedux = resources.find(r => r?.name === resource); const { hasCreate, hasEdit, hasList, hasShow } = props; - return props != null - ? merge({}, definition, { - hasCreate, - hasEdit, - hasList, - hasShow, - name: props.resource || definition.name, - }) - : definition; + const definitionFromProps = merge({}, definitionFromRedux, { + hasCreate, + hasEdit, + hasList, + hasShow, + name: props.resource || definitionFromRedux.name, + }); + + const definition = useMemo( + () => (props != null ? definitionFromProps : definitionFromRedux), + // eslint-disable-next-line + [ + // eslint-disable-next-line + JSON.stringify(definitionFromProps), + // eslint-disable-next-line + JSON.stringify(definitionFromRedux), + ] + ); + + return definition; }; export interface UseResourceDefinitionOptions { From 6f892bfb6c589d6bda56dde6be0d44e2b1e6b8be Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 28 Jan 2021 17:00:31 +0100 Subject: [PATCH 4/4] Apply review --- .../ra-core/src/core/useResourceDefinition.ts | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts index 0f281826c17..c204ae1c869 100644 --- a/packages/ra-core/src/core/useResourceDefinition.ts +++ b/packages/ra-core/src/core/useResourceDefinition.ts @@ -13,26 +13,17 @@ export const useResourceDefinition = ( ): ResourceDefinition => { const resource = useResourceContext(props); const resources = useSelector(getResources); - const definitionFromRedux = resources.find(r => r?.name === resource); const { hasCreate, hasEdit, hasList, hasShow } = props; - const definitionFromProps = merge({}, definitionFromRedux, { - hasCreate, - hasEdit, - hasList, - hasShow, - name: props.resource || definitionFromRedux.name, - }); - const definition = useMemo( - () => (props != null ? definitionFromProps : definitionFromRedux), - // eslint-disable-next-line - [ - // eslint-disable-next-line - JSON.stringify(definitionFromProps), - // eslint-disable-next-line - JSON.stringify(definitionFromRedux), - ] - ); + const definition = useMemo(() => { + const definitionFromRedux = resources.find(r => r?.name === resource); + return merge({}, definitionFromRedux, { + hasCreate, + hasEdit, + hasList, + hasShow, + }); + }, [resource, resources, hasCreate, hasEdit, hasList, hasShow]); return definition; };