From 93b3b54cac111db5eb95675a4d87ed660631b9e9 Mon Sep 17 00:00:00 2001 From: djhi <1122076+djhi@users.noreply.github.com> Date: Mon, 6 Jan 2020 12:44:07 +0100 Subject: [PATCH 1/2] Ensure resource data in redux store is initialized bebfore using it. Fixes #4196 --- packages/ra-core/src/controller/useListController.ts | 8 +++++--- packages/ra-core/src/controller/useListParams.ts | 5 ++++- packages/ra-core/src/controller/useRecordSelection.ts | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/ra-core/src/controller/useListController.ts b/packages/ra-core/src/controller/useListController.ts index ab2f3a29c48..bf15d90f715 100644 --- a/packages/ra-core/src/controller/useListController.ts +++ b/packages/ra-core/src/controller/useListController.ts @@ -171,7 +171,7 @@ const useListController = (props: ListProps): ListControllerProps => { (state: ReduxState) => state.admin.resources[resource] ? state.admin.resources[resource].data - : null, + : {}, shallowEqual ); @@ -209,7 +209,8 @@ const useListController = (props: ListProps): ListControllerProps => { displayedFilters: query.displayedFilters, filterValues: query.filterValues, hasCreate, - ids, + // ids might be null if the resource has not been initialized yet (custom routes for example) + ids: ids || [], loading, loaded, onSelect: selectionModifiers.select, @@ -225,7 +226,8 @@ const useListController = (props: ListProps): ListControllerProps => { setPage: queryModifiers.setPage, setPerPage: queryModifiers.setPerPage, setSort: queryModifiers.setSort, - total, + // total might be null if the resource has not been initialized yet (custom routes for example) + total: total != undefined ? total : 0, // eslint-disable-line eqeqeq version, }; }; diff --git a/packages/ra-core/src/controller/useListParams.ts b/packages/ra-core/src/controller/useListParams.ts index 3086fa63103..b50a87f9d8d 100644 --- a/packages/ra-core/src/controller/useListParams.ts +++ b/packages/ra-core/src/controller/useListParams.ts @@ -114,7 +114,10 @@ const useListParams = ({ const history = useHistory(); const { params } = useSelector( - (reduxState: ReduxState) => reduxState.admin.resources[resource].list, + (reduxState: ReduxState) => + reduxState.admin.resources[resource] + ? reduxState.admin.resources[resource].list + : {}, shallowEqual ); diff --git a/packages/ra-core/src/controller/useRecordSelection.ts b/packages/ra-core/src/controller/useRecordSelection.ts index f88cdf2b30d..1e4a7609857 100644 --- a/packages/ra-core/src/controller/useRecordSelection.ts +++ b/packages/ra-core/src/controller/useRecordSelection.ts @@ -14,7 +14,9 @@ const useSelectItems = (resource: string) => { const dispatch = useDispatch(); const selectedIds = useSelector( (reduxState: ReduxState) => - reduxState.admin.resources[resource].list.selectedIds, + reduxState.admin.resources[resource] + ? reduxState.admin.resources[resource].list.selectedIds + : [], shallowEqual ); const selectionModifiers = { From 58553db31cd6d7fa848e1a72f49c9790789e91d3 Mon Sep 17 00:00:00 2001 From: djhi <1122076+djhi@users.noreply.github.com> Date: Mon, 6 Jan 2020 16:51:28 +0100 Subject: [PATCH 2/2] Review --- packages/ra-core/src/controller/useListController.ts | 4 +++- packages/ra-core/src/controller/useListParams.ts | 4 +++- packages/ra-core/src/controller/useRecordSelection.ts | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/ra-core/src/controller/useListController.ts b/packages/ra-core/src/controller/useListController.ts index bf15d90f715..d08377bd15f 100644 --- a/packages/ra-core/src/controller/useListController.ts +++ b/packages/ra-core/src/controller/useListController.ts @@ -41,6 +41,8 @@ const defaultSort = { order: SORT_ASC, }; +const defaultData = {}; + export interface ListControllerProps { basePath: string; currentSort: Sort; @@ -171,7 +173,7 @@ const useListController = (props: ListProps): ListControllerProps => { (state: ReduxState) => state.admin.resources[resource] ? state.admin.resources[resource].data - : {}, + : defaultData, shallowEqual ); diff --git a/packages/ra-core/src/controller/useListParams.ts b/packages/ra-core/src/controller/useListParams.ts index b50a87f9d8d..36705352e55 100644 --- a/packages/ra-core/src/controller/useListParams.ts +++ b/packages/ra-core/src/controller/useListParams.ts @@ -52,6 +52,8 @@ const defaultSort = { order: SORT_ASC, }; +const defaultParams = {}; + /** * Get the list parameters (page, sort, filters) and modifiers. * @@ -117,7 +119,7 @@ const useListParams = ({ (reduxState: ReduxState) => reduxState.admin.resources[resource] ? reduxState.admin.resources[resource].list - : {}, + : defaultParams, shallowEqual ); diff --git a/packages/ra-core/src/controller/useRecordSelection.ts b/packages/ra-core/src/controller/useRecordSelection.ts index 1e4a7609857..106909a7578 100644 --- a/packages/ra-core/src/controller/useRecordSelection.ts +++ b/packages/ra-core/src/controller/useRecordSelection.ts @@ -3,6 +3,8 @@ import { useSelector, useDispatch, shallowEqual } from 'react-redux'; import { setListSelectedIds, toggleListItem } from '../actions/listActions'; import { Identifier, ReduxState } from '../types'; +const defaultRecords = []; + /** * Get the list of selected items for a resource, and callbacks to change the selection * @@ -16,7 +18,7 @@ const useSelectItems = (resource: string) => { (reduxState: ReduxState) => reduxState.admin.resources[resource] ? reduxState.admin.resources[resource].list.selectedIds - : [], + : defaultRecords, shallowEqual ); const selectionModifiers = {