diff --git a/packages/ra-core/src/controller/CreateController.js b/packages/ra-core/src/controller/CreateController.js index 2b05171800f..6550410d326 100644 --- a/packages/ra-core/src/controller/CreateController.js +++ b/packages/ra-core/src/controller/CreateController.js @@ -7,6 +7,7 @@ import { parse } from 'query-string'; import translate from '../i18n/translate'; import { crudCreate as crudCreateAction } from '../actions'; +import checkMinimumRequiredProps from './checkMinimumRequiredProps'; /** * Page component for the Create view @@ -139,9 +140,14 @@ function mapStateToProps(state) { } export default compose( + checkMinimumRequiredProps('Create', [ + 'basePath', + 'location', + 'resource', + ]), connect( mapStateToProps, { crudCreate: crudCreateAction } ), - translate + translate, )(CreateController); diff --git a/packages/ra-core/src/controller/EditController.js b/packages/ra-core/src/controller/EditController.js index 7a3afb4d7d8..a1ad1836044 100644 --- a/packages/ra-core/src/controller/EditController.js +++ b/packages/ra-core/src/controller/EditController.js @@ -7,6 +7,7 @@ import { reset } from 'redux-form'; import translate from '../i18n/translate'; import { crudGetOne, crudUpdate, startUndoable } from '../actions'; import { REDUX_FORM_NAME } from '../form'; +import checkMinimumRequiredProps from './checkMinimumRequiredProps'; /** * Page component for the Edit view @@ -175,6 +176,11 @@ function mapStateToProps(state, props) { } export default compose( + checkMinimumRequiredProps('Edit', [ + 'basePath', + 'location', + 'resource', + ]), connect( mapStateToProps, { diff --git a/packages/ra-core/src/controller/ListController.js b/packages/ra-core/src/controller/ListController.js index 41cc0782f12..7284e66b795 100644 --- a/packages/ra-core/src/controller/ListController.js +++ b/packages/ra-core/src/controller/ListController.js @@ -27,6 +27,7 @@ import { } from '../actions/listActions'; import translate from '../i18n/translate'; import removeKey from '../util/removeKey'; +import checkMinimumRequiredProps from './checkMinimumRequiredProps'; /** * List page component @@ -439,7 +440,14 @@ function mapStateToProps(state, props) { }; } + + export default compose( + checkMinimumRequiredProps('List', [ + 'basePath', + 'location', + 'resource', + ]), connect( mapStateToProps, { diff --git a/packages/ra-core/src/controller/ShowController.js b/packages/ra-core/src/controller/ShowController.js index 05156758fed..084c94974b1 100644 --- a/packages/ra-core/src/controller/ShowController.js +++ b/packages/ra-core/src/controller/ShowController.js @@ -5,6 +5,7 @@ import compose from 'recompose/compose'; import inflection from 'inflection'; import translate from '../i18n/translate'; import { crudGetOne as crudGetOneAction } from '../actions'; +import checkMinimumRequiredProps from './checkMinimumRequiredProps'; /** * Page component for the Show view @@ -132,6 +133,11 @@ function mapStateToProps(state, props) { } export default compose( + checkMinimumRequiredProps('Show', [ + 'basePath', + 'location', + 'resource', + ]), connect( mapStateToProps, { crudGetOne: crudGetOneAction } diff --git a/packages/ra-core/src/controller/checkMinimumRequiredProps.js b/packages/ra-core/src/controller/checkMinimumRequiredProps.js new file mode 100644 index 00000000000..f95ee61be5f --- /dev/null +++ b/packages/ra-core/src/controller/checkMinimumRequiredProps.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const checkMinimumRequiredProps = (displayName, requiredProps) => WrappedComponent => (props) => { + const propNames = Object.keys(props); + const missingProps = requiredProps.filter(prop => !propNames.includes(prop)); + + if (missingProps.length > 0) { + throw new Error( +`<${displayName}> component is not properly configured, some essential props are missing. +Be sure to pass the props from the parent. Example: + +const My${displayName} = props => ( + <${displayName} {...props}> +); + +The missing props are: ${missingProps.join(', ')}`) + } + + return ; +}; + +export default checkMinimumRequiredProps;