From 9e52e97753ea039d0bdb758b351a6ae59f2c28ad Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Wed, 2 Jan 2019 17:21:54 +0100 Subject: [PATCH 01/13] Port crudGetAll and crudGetList to typescript --- .../src/actions/dataActions/crudGetAll.ts | 63 +++++++++++++++++++ .../src/actions/dataActions/crudGetList.ts | 56 +++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 packages/ra-core/src/actions/dataActions/crudGetAll.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudGetList.ts diff --git a/packages/ra-core/src/actions/dataActions/crudGetAll.ts b/packages/ra-core/src/actions/dataActions/crudGetAll.ts new file mode 100644 index 00000000000..1b70cc1952a --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudGetAll.ts @@ -0,0 +1,63 @@ +import { GET_LIST } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; + +interface CrudGetAllGenericAction { + readonly type: T; + readonly payload: { + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; + }; + readonly meta: { + resource: string; + fetch: typeof GET_LIST; + onFailure: { + notification: NotificationSideEffect; + }; + onSuccess: { + callback: any; + }; + }; +} + +export const CRUD_GET_ALL = 'RA/CRUD_GET_ALL'; +export type CrudGetAllAction = CrudGetAllGenericAction; + +export const crudGetAll = ( + resource, + sort, + filter, + maxResults, + callback +): CrudGetAllAction => ({ + type: CRUD_GET_ALL, + payload: { sort, filter, pagination: { page: 1, perPage: maxResults } }, + meta: { + resource, + fetch: GET_LIST, + onSuccess: { + callback, + }, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_GET_ALL_LOADING = 'RA/CRUD_GET_ALL_LOADING'; +export type CrudGetAllLoadingAction = CrudGetAllGenericAction< + typeof CRUD_GET_ALL_LOADING +>; + +export const CRUD_GET_ALL_FAILURE = 'RA/CRUD_GET_ALL_FAILURE'; +export type CrudGetAllFailingAction = CrudGetAllGenericAction< + typeof CRUD_GET_ALL_FAILURE +>; + +export const CRUD_GET_ALL_SUCCESS = 'RA/CRUD_GET_ALL_SUCCESS'; +export type CrudGetAllSuccessAction = CrudGetAllGenericAction< + typeof CRUD_GET_ALL_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudGetList.ts b/packages/ra-core/src/actions/dataActions/crudGetList.ts new file mode 100644 index 00000000000..aeeb9240195 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudGetList.ts @@ -0,0 +1,56 @@ +import { GET_LIST } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; + +interface CrudGetListGenericAction { + readonly type: T; + readonly payload: { + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; + }; + readonly meta: { + resource: string; + fetch: typeof GET_LIST; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_GET_LIST = 'RA/CRUD_GET_LIST'; +export type CrudGetListAction = CrudGetListGenericAction; + +export const crudGetList = ( + resource, + pagination, + sort, + filter +): CrudGetListAction => ({ + type: CRUD_GET_LIST, + payload: { pagination, sort, filter }, + meta: { + resource, + fetch: GET_LIST, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_GET_LIST_LOADING = 'RA/CRUD_GET_LIST_LOADING'; +export type CrudGetListLoadingAction = CrudGetListGenericAction< + typeof CRUD_GET_LIST_LOADING +>; + +export const CRUD_GET_LIST_FAILURE = 'RA/CRUD_GET_LIST_FAILURE'; +export type CrudGetListFailureAction = CrudGetListGenericAction< + typeof CRUD_GET_LIST_FAILURE +>; + +export const CRUD_GET_LIST_SUCCESS = 'RA/CRUD_GET_LIST_SUCCESS'; +export type CrudGetListSuccessAction = CrudGetListGenericAction< + typeof CRUD_GET_LIST_SUCCESS +>; From 3c44345fa4a8db2f767ff56dd2005c5a39c17b6f Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Mon, 28 Jan 2019 23:00:03 +0100 Subject: [PATCH 02/13] Add missing data actions --- packages/ra-core/src/actions/dataActions.js | 342 ------------------ .../src/actions/dataActions/crudCreate.ts | 71 ++++ .../src/actions/dataActions/crudDelete.ts | 77 ++++ .../src/actions/dataActions/crudDeleteMany.ts | 75 ++++ .../src/actions/dataActions/crudGetMany.ts | 49 +++ .../dataActions/crudGetManyReference.ts | 70 ++++ .../actions/dataActions/crudGetMatching.ts | 61 ++++ .../src/actions/dataActions/crudGetOne.ts | 62 ++++ .../src/actions/dataActions/crudUpdate.ts | 75 ++++ .../src/actions/dataActions/crudUpdateMany.ts | 77 ++++ .../ra-core/src/actions/dataActions/index.ts | 11 + 11 files changed, 628 insertions(+), 342 deletions(-) delete mode 100644 packages/ra-core/src/actions/dataActions.js create mode 100644 packages/ra-core/src/actions/dataActions/crudCreate.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudDelete.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudDeleteMany.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudGetMany.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudGetManyReference.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudGetMatching.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudGetOne.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudUpdate.ts create mode 100644 packages/ra-core/src/actions/dataActions/crudUpdateMany.ts create mode 100644 packages/ra-core/src/actions/dataActions/index.ts diff --git a/packages/ra-core/src/actions/dataActions.js b/packages/ra-core/src/actions/dataActions.js deleted file mode 100644 index 134662564e9..00000000000 --- a/packages/ra-core/src/actions/dataActions.js +++ /dev/null @@ -1,342 +0,0 @@ -import { - GET_LIST, - GET_ONE, - CREATE, - UPDATE, - UPDATE_MANY, - DELETE, - DELETE_MANY, - GET_MANY, - GET_MANY_REFERENCE, -} from '../dataFetchActions'; - -export const CRUD_GET_LIST = 'RA/CRUD_GET_LIST'; -export const CRUD_GET_LIST_LOADING = 'RA/CRUD_GET_LIST_LOADING'; -export const CRUD_GET_LIST_FAILURE = 'RA/CRUD_GET_LIST_FAILURE'; -export const CRUD_GET_LIST_SUCCESS = 'RA/CRUD_GET_LIST_SUCCESS'; - -export const crudGetList = (resource, pagination, sort, filter) => ({ - type: CRUD_GET_LIST, - payload: { pagination, sort, filter }, - meta: { - resource, - fetch: GET_LIST, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_GET_ALL = 'RA/CRUD_GET_ALL'; -export const CRUD_GET_ALL_LOADING = 'RA/CRUD_GET_ALL_LOADING'; -export const CRUD_GET_ALL_FAILURE = 'RA/CRUD_GET_ALL_FAILURE'; -export const CRUD_GET_ALL_SUCCESS = 'RA/CRUD_GET_ALL_SUCCESS'; - -export const crudGetAll = (resource, sort, filter, maxResults, callback) => ({ - type: CRUD_GET_ALL, - payload: { sort, filter, pagination: { page: 1, perPage: maxResults } }, - meta: { - resource, - fetch: GET_LIST, - onSuccess: { - callback, - }, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; -export const CRUD_GET_ONE_LOADING = 'RA/CRUD_GET_ONE_LOADING'; -export const CRUD_GET_ONE_FAILURE = 'RA/CRUD_GET_ONE_FAILURE'; -export const CRUD_GET_ONE_SUCCESS = 'RA/CRUD_GET_ONE_SUCCESS'; - -export const crudGetOne = (resource, id, basePath, refresh = true) => ({ - type: CRUD_GET_ONE, - payload: { id }, - meta: { - resource, - fetch: GET_ONE, - basePath, - onFailure: { - notification: { - body: 'ra.notification.item_doesnt_exist', - level: 'warning', - }, - redirectTo: 'list', - refresh, - }, - }, -}); - -export const CRUD_CREATE = 'RA/CRUD_CREATE'; -export const CRUD_CREATE_LOADING = 'RA/CRUD_CREATE_LOADING'; -export const CRUD_CREATE_FAILURE = 'RA/CRUD_CREATE_FAILURE'; -export const CRUD_CREATE_SUCCESS = 'RA/CRUD_CREATE_SUCCESS'; - -export const crudCreate = (resource, data, basePath, redirectTo = 'edit') => ({ - type: CRUD_CREATE, - payload: { data }, - meta: { - resource, - fetch: CREATE, - onSuccess: { - notification: { - body: 'ra.notification.created', - level: 'info', - messageArgs: { - smart_count: 1, - }, - }, - redirectTo, - basePath, - }, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_UPDATE = 'RA/CRUD_UPDATE'; -export const CRUD_UPDATE_LOADING = 'RA/CRUD_UPDATE_LOADING'; -export const CRUD_UPDATE_FAILURE = 'RA/CRUD_UPDATE_FAILURE'; -export const CRUD_UPDATE_SUCCESS = 'RA/CRUD_UPDATE_SUCCESS'; -export const CRUD_UPDATE_OPTIMISTIC = 'RA/CRUD_UPDATE_OPTIMISTIC'; - -export const crudUpdate = ( - resource, - id, - data, - previousData, - basePath, - redirectTo = 'show' -) => ({ - type: CRUD_UPDATE, - payload: { id, data, previousData }, - meta: { - resource, - fetch: UPDATE, - onSuccess: { - notification: { - body: 'ra.notification.updated', - level: 'info', - messageArgs: { - smart_count: 1, - }, - }, - redirectTo, - basePath, - }, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_UPDATE_MANY = 'RA/CRUD_UPDATE_MANY'; -export const CRUD_UPDATE_MANY_LOADING = 'RA/CRUD_UPDATE_MANY_LOADING'; -export const CRUD_UPDATE_MANY_FAILURE = 'RA/CRUD_UPDATE_MANY_FAILURE'; -export const CRUD_UPDATE_MANY_SUCCESS = 'RA/CRUD_UPDATE_MANY_SUCCESS'; -export const CRUD_UPDATE_MANY_OPTIMISTIC = 'RA/CRUD_UPDATE_MANY_OPTIMISTIC'; - -export const crudUpdateMany = ( - resource, - ids, - data, - basePath, - refresh = true -) => ({ - type: CRUD_UPDATE_MANY, - payload: { ids, data }, - meta: { - resource, - fetch: UPDATE_MANY, - cancelPrevious: false, - onSuccess: { - notification: { - body: 'ra.notification.updated', - level: 'info', - messageArgs: { - smart_count: ids.length, - }, - }, - basePath, - refresh, - unselectAll: true, - }, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_DELETE = 'RA/CRUD_DELETE'; -export const CRUD_DELETE_LOADING = 'RA/CRUD_DELETE_LOADING'; -export const CRUD_DELETE_FAILURE = 'RA/CRUD_DELETE_FAILURE'; -export const CRUD_DELETE_SUCCESS = 'RA/CRUD_DELETE_SUCCESS'; -export const CRUD_DELETE_OPTIMISTIC = 'RA/CRUD_DELETE_OPTIMISTIC'; - -export const crudDelete = ( - resource, - id, - previousData, - basePath, - redirectTo = 'list', - refresh = true -) => ({ - type: CRUD_DELETE, - payload: { id, previousData }, - meta: { - resource, - fetch: DELETE, - onSuccess: { - notification: { - body: 'ra.notification.deleted', - level: 'info', - messageArgs: { - smart_count: 1, - }, - }, - refresh, - redirectTo, - basePath, - }, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; -export const CRUD_DELETE_MANY_LOADING = 'RA/CRUD_DELETE_MANY_LOADING'; -export const CRUD_DELETE_MANY_FAILURE = 'RA/CRUD_DELETE_MANY_FAILURE'; -export const CRUD_DELETE_MANY_SUCCESS = 'RA/CRUD_DELETE_MANY_SUCCESS'; -export const CRUD_DELETE_MANY_OPTIMISTIC = 'RA/CRUD_DELETE_MANY_OPTIMISTIC'; - -export const crudDeleteMany = (resource, ids, basePath, refresh = true) => ({ - type: CRUD_DELETE_MANY, - payload: { ids }, - meta: { - resource, - fetch: DELETE_MANY, - onSuccess: { - notification: { - body: 'ra.notification.deleted', - level: 'info', - messageArgs: { - smart_count: ids.length, - }, - }, - basePath, - refresh, - unselectAll: true, - }, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; -export const CRUD_GET_MANY_LOADING = 'RA/CRUD_GET_MANY_LOADING'; -export const CRUD_GET_MANY_FAILURE = 'RA/CRUD_GET_MANY_FAILURE'; -export const CRUD_GET_MANY_SUCCESS = 'RA/CRUD_GET_MANY_SUCCESS'; - -// Reference related actions - -export const crudGetMany = (resource, ids) => ({ - type: CRUD_GET_MANY, - payload: { ids }, - meta: { - resource, - fetch: GET_MANY, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_GET_MATCHING = 'RA/CRUD_GET_MATCHING'; -export const CRUD_GET_MATCHING_LOADING = 'RA/CRUD_GET_MATCHING_LOADING'; -export const CRUD_GET_MATCHING_FAILURE = 'RA/CRUD_GET_MATCHING_FAILURE'; -export const CRUD_GET_MATCHING_SUCCESS = 'RA/CRUD_GET_MATCHING_SUCCESS'; - -export const crudGetMatching = ( - reference, - relatedTo, - pagination, - sort, - filter -) => ({ - type: CRUD_GET_MATCHING, - payload: { pagination, sort, filter }, - meta: { - resource: reference, - relatedTo, - fetch: GET_LIST, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); - -export const CRUD_GET_MANY_REFERENCE = 'RA/CRUD_GET_MANY_REFERENCE'; -export const CRUD_GET_MANY_REFERENCE_LOADING = - 'RA/CRUD_GET_MANY_REFERENCE_LOADING'; -export const CRUD_GET_MANY_REFERENCE_FAILURE = - 'RA/CRUD_GET_MANY_REFERENCE_FAILURE'; -export const CRUD_GET_MANY_REFERENCE_SUCCESS = - 'RA/CRUD_GET_MANY_REFERENCE_SUCCESS'; - -export const crudGetManyReference = ( - reference, - target, - id, - relatedTo, - pagination, - sort, - filter, - source -) => ({ - type: CRUD_GET_MANY_REFERENCE, - payload: { target, id, pagination, sort, filter, source }, - meta: { - resource: reference, - relatedTo, - fetch: GET_MANY_REFERENCE, - onFailure: { - notification: { - body: 'ra.notification.http_error', - level: 'warning', - }, - }, - }, -}); diff --git a/packages/ra-core/src/actions/dataActions/crudCreate.ts b/packages/ra-core/src/actions/dataActions/crudCreate.ts new file mode 100644 index 00000000000..7b5636f286f --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudCreate.ts @@ -0,0 +1,71 @@ +import { CREATE } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; +import { RedirectionSideEffect } from '../../sideEffect/redirection'; + +interface CrudCreateGenericAction { + readonly type: T; + readonly payload: { + data: any; + }; + readonly meta: { + resource: string; + fetch: typeof CREATE; + onSuccess: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + basePath: string; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_CREATE = 'RA/CRUD_CREATE'; +export type CrudCreateAction = CrudCreateGenericAction; + +export const crudCreate = ( + resource, + data, + basePath, + redirectTo = 'edit' +): CrudCreateAction => ({ + type: CRUD_CREATE, + payload: { data }, + meta: { + resource, + fetch: CREATE, + onSuccess: { + notification: { + body: 'ra.notification.created', + level: 'info', + messageArgs: { + smart_count: 1, + }, + }, + redirectTo, + basePath, + }, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_CREATE_LOADING = 'RA/CRUD_CREATE_LOADING'; +export type CrudCreateLoadingAction = CrudCreateGenericAction< + typeof CRUD_CREATE_LOADING +>; + +export const CRUD_CREATE_FAILURE = 'RA/CRUD_CREATE_FAILURE'; +export type CrudCreateFailingAction = CrudCreateGenericAction< + typeof CRUD_CREATE_FAILURE +>; + +export const CRUD_CREATE_SUCCESS = 'RA/CRUD_CREATE_SUCCESS'; +export type CrudCreateSuccessAction = CrudCreateGenericAction< + typeof CRUD_CREATE_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudDelete.ts b/packages/ra-core/src/actions/dataActions/crudDelete.ts new file mode 100644 index 00000000000..3c4fcec6c24 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudDelete.ts @@ -0,0 +1,77 @@ +import { DELETE } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; +import { RedirectionSideEffect } from '../../sideEffect/redirection'; +import { RefreshSideEffect } from '../../sideEffect/refresh'; + +interface CrudDeleteGenericAction { + readonly type: T; + readonly payload: { + id: string; + previousData: any; + }; + readonly meta: { + resource: string; + fetch: typeof DELETE; + onSuccess: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + refresh: RefreshSideEffect; + basePath: string; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_DELETE = 'RA/CRUD_DELETE'; +export type CrudDeleteAction = CrudDeleteGenericAction; + +export const crudDelete = ( + resource, + id, + previousData, + basePath, + redirectTo = 'list', + refresh = true +): CrudDeleteAction => ({ + type: CRUD_DELETE, + payload: { id, previousData }, + meta: { + resource, + fetch: DELETE, + onSuccess: { + notification: { + body: 'ra.notification.deleted', + level: 'info', + messageArgs: { + smart_count: 1, + }, + }, + refresh, + redirectTo, + basePath, + }, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_DELETE_LOADING = 'RA/CRUD_DELETE_LOADING'; +export type CrudDeleteLoadingAction = CrudDeleteGenericAction< + typeof CRUD_DELETE_LOADING +>; + +export const CRUD_DELETE_FAILURE = 'RA/CRUD_DELETE_FAILURE'; +export type CrudDeleteFailingAction = CrudDeleteGenericAction< + typeof CRUD_DELETE_FAILURE +>; + +export const CRUD_DELETE_SUCCESS = 'RA/CRUD_DELETE_SUCCESS'; +export type CrudDeleteSuccessAction = CrudDeleteGenericAction< + typeof CRUD_DELETE_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts new file mode 100644 index 00000000000..58ca4ecd673 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts @@ -0,0 +1,75 @@ +import { DELETE_MANY } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; +import { RefreshSideEffect } from '../../sideEffect/refresh'; + +interface CrudDeleteManyGenericAction { + readonly type: T; + readonly payload: { + ids: [string]; + }; + readonly meta: { + resource: string; + fetch: typeof DELETE_MANY; + onSuccess: { + notification: NotificationSideEffect; + refresh: RefreshSideEffect; + basePath: string; + unselectAll: boolean; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; +export type CrudDeleteManyAction = CrudDeleteManyGenericAction< + typeof CRUD_DELETE_MANY +>; + +export const crudDeleteMany = ( + resource, + ids, + basePath, + refresh = true +): CrudDeleteManyAction => ({ + type: CRUD_DELETE_MANY, + payload: { ids }, + meta: { + resource, + fetch: DELETE_MANY, + onSuccess: { + notification: { + body: 'ra.notification.deleted', + level: 'info', + messageArgs: { + smart_count: ids.length, + }, + }, + basePath, + refresh, + unselectAll: true, + }, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_DELETE_MANY_LOADING = 'RA/CRUD_DELETE_MANY_LOADING'; +export type CrudDeleteManyLoadingAction = CrudDeleteManyGenericAction< + typeof CRUD_DELETE_MANY_LOADING +>; + +export const CRUD_DELETE_MANY_FAILURE = 'RA/CRUD_DELETE_MANY_FAILURE'; +export type CrudDeleteManyFailingAction = CrudDeleteManyGenericAction< + typeof CRUD_DELETE_MANY_FAILURE +>; + +export const CRUD_DELETE_MANY_SUCCESS = 'RA/CRUD_DELETE_MANY_SUCCESS'; +export type CrudDeleteManySuccessAction = CrudDeleteManyGenericAction< + typeof CRUD_DELETE_MANY_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMany.ts b/packages/ra-core/src/actions/dataActions/crudGetMany.ts new file mode 100644 index 00000000000..07ac20beb48 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudGetMany.ts @@ -0,0 +1,49 @@ +import { GET_MANY } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; + +interface CrudGetManyGenericAction { + readonly type: T; + readonly payload: { + ids: [string]; + }; + readonly meta: { + resource: string; + fetch: typeof GET_MANY; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; +export type CrudGetManyAction = CrudGetManyGenericAction; + +export const crudGetMany = (resource, ids): CrudGetManyAction => ({ + type: CRUD_GET_MANY, + payload: { ids }, + meta: { + resource, + fetch: GET_MANY, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_GET_MANY_LOADING = 'RA/CRUD_GET_MANY_LOADING'; +export type CrudGetManyLoadingAction = CrudGetManyGenericAction< + typeof CRUD_GET_MANY_LOADING +>; + +export const CRUD_GET_MANY_FAILURE = 'RA/CRUD_GET_MANY_FAILURE'; +export type CrudGetManyFailingAction = CrudGetManyGenericAction< + typeof CRUD_GET_MANY_FAILURE +>; + +export const CRUD_GET_MANY_SUCCESS = 'RA/CRUD_GET_MANY_SUCCESS'; +export type CrudGetManySuccessAction = CrudGetManyGenericAction< + typeof CRUD_GET_MANY_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts new file mode 100644 index 00000000000..ee2274e0695 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts @@ -0,0 +1,70 @@ +import { GET_MANY_REFERENCE } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; + +interface CrudGetManyReferenceGenericAction { + readonly type: T; + readonly payload: { + source: string; + target: string; + id: string; + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; + }; + readonly meta: { + resource: string; + fetch: typeof GET_MANY_REFERENCE; + relatedTo: string; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_GET_MANY_REFERENCE = 'RA/CRUD_GET_MANY_REFERENCE'; +export type CrudGetManyReferenceAction = CrudGetManyReferenceGenericAction< + typeof CRUD_GET_MANY_REFERENCE +>; + +export const crudGetManyReference = ( + reference, + target, + id, + relatedTo, + pagination, + sort, + filter, + source +): CrudGetManyReferenceAction => ({ + type: CRUD_GET_MANY_REFERENCE, + payload: { target, id, pagination, sort, filter, source }, + meta: { + resource: reference, + relatedTo, + fetch: GET_MANY_REFERENCE, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_GET_MANY_REFERENCE_LOADING = + 'RA/CRUD_GET_MANY_REFERENCE_LOADING'; +export type CrudGetManyReferenceLoadingAction = CrudGetManyReferenceGenericAction< + typeof CRUD_GET_MANY_REFERENCE_LOADING +>; + +export const CRUD_GET_MANY_REFERENCE_FAILURE = + 'RA/CRUD_GET_MANY_REFERENCE_FAILURE'; +export type CrudGetManyReferenceFailingAction = CrudGetManyReferenceGenericAction< + typeof CRUD_GET_MANY_REFERENCE_FAILURE +>; + +export const CRUD_GET_MANY_REFERENCE_SUCCESS = + 'RA/CRUD_GET_MANY_REFERENCE_SUCCESS'; +export type CrudGetManyReferenceSuccessAction = CrudGetManyReferenceGenericAction< + typeof CRUD_GET_MANY_REFERENCE_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts new file mode 100644 index 00000000000..0f165dee46d --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts @@ -0,0 +1,61 @@ +import { GET_LIST } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; + +interface CrudGetMatchingGenericAction { + readonly type: T; + readonly payload: { + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; + }; + readonly meta: { + resource: string; + fetch: typeof GET_LIST; + relatedTo: string; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_GET_MATCHING = 'RA/CRUD_GET_MATCHING'; +export type CrudGetMatchingAction = CrudGetMatchingGenericAction< + typeof CRUD_GET_MATCHING +>; + +export const crudGetMatching = ( + reference, + relatedTo, + pagination, + sort, + filter +): CrudGetMatchingAction => ({ + type: CRUD_GET_MATCHING, + payload: { pagination, sort, filter }, + meta: { + resource: reference, + relatedTo, + fetch: GET_LIST, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_GET_MATCHING_LOADING = 'RA/CRUD_GET_MATCHING_LOADING'; +export type CrudGetMatchingLoadingAction = CrudGetMatchingGenericAction< + typeof CRUD_GET_MATCHING_LOADING +>; + +export const CRUD_GET_MATCHING_FAILURE = 'RA/CRUD_GET_MATCHING_FAILURE'; +export type CrudGetMatchingFailingAction = CrudGetMatchingGenericAction< + typeof CRUD_GET_MATCHING_FAILURE +>; + +export const CRUD_GET_MATCHING_SUCCESS = 'RA/CRUD_GET_MATCHING_SUCCESS'; +export type CrudGetMatchingSuccessAction = CrudGetMatchingGenericAction< + typeof CRUD_GET_MATCHING_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudGetOne.ts b/packages/ra-core/src/actions/dataActions/crudGetOne.ts new file mode 100644 index 00000000000..4a533816745 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudGetOne.ts @@ -0,0 +1,62 @@ +import { GET_ONE } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; +import { RedirectionSideEffect } from '../../sideEffect/redirection'; +import { RefreshSideEffect } from '../../sideEffect/refresh'; + +interface CrudGetOneGenericAction { + readonly type: T; + readonly payload: { + id: string; + }; + readonly meta: { + resource: string; + fetch: typeof GET_ONE; + basePath: string; + onFailure: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + refresh: RefreshSideEffect; + }; + }; +} + +export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; +export type CrudGetOneAction = CrudGetOneGenericAction; + +export const crudGetOne = ( + resource, + id, + basePath, + refresh = true +): CrudGetOneAction => ({ + type: CRUD_GET_ONE, + payload: { id }, + meta: { + resource, + fetch: GET_ONE, + basePath, + onFailure: { + notification: { + body: 'ra.notification.item_doesnt_exist', + level: 'warning', + }, + redirectTo: 'list', + refresh, + }, + }, +}); + +export const CRUD_GET_ONE_LOADING = 'RA/CRUD_GET_ONE_LOADING'; +export type CrudGetOneLoadingAction = CrudGetOneGenericAction< + typeof CRUD_GET_ONE_LOADING +>; + +export const CRUD_GET_ONE_FAILURE = 'RA/CRUD_GET_ONE_FAILURE'; +export type CrudGetOneFailingAction = CrudGetOneGenericAction< + typeof CRUD_GET_ONE_FAILURE +>; + +export const CRUD_GET_ONE_SUCCESS = 'RA/CRUD_GET_ONE_SUCCESS'; +export type CrudGetOneSuccessAction = CrudGetOneGenericAction< + typeof CRUD_GET_ONE_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudUpdate.ts b/packages/ra-core/src/actions/dataActions/crudUpdate.ts new file mode 100644 index 00000000000..1ac6c32e021 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudUpdate.ts @@ -0,0 +1,75 @@ +import { UPDATE } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; +import { RedirectionSideEffect } from '../../sideEffect/redirection'; + +interface CrudUpdateGenericAction { + readonly type: T; + readonly payload: { + id: string; + data: any; + previousData?: any; + }; + readonly meta: { + resource: string; + fetch: typeof UPDATE; + onSuccess: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + basePath: string; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_UPDATE = 'RA/CRUD_UPDATE'; +export type CrudUpdateAction = CrudUpdateGenericAction; + +export const crudUpdate = ( + resource, + id, + data, + previousData, + basePath, + redirectTo = 'show' +): CrudUpdateAction => ({ + type: CRUD_UPDATE, + payload: { id, data, previousData }, + meta: { + resource, + fetch: UPDATE, + onSuccess: { + notification: { + body: 'ra.notification.updated', + level: 'info', + messageArgs: { + smart_count: 1, + }, + }, + redirectTo, + basePath, + }, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_UPDATE_LOADING = 'RA/CRUD_UPDATE_LOADING'; +export type CrudUpdateLoadingAction = CrudUpdateGenericAction< + typeof CRUD_UPDATE_LOADING +>; + +export const CRUD_UPDATE_FAILURE = 'RA/CRUD_UPDATE_FAILURE'; +export type CrudUpdateFailingAction = CrudUpdateGenericAction< + typeof CRUD_UPDATE_FAILURE +>; + +export const CRUD_UPDATE_SUCCESS = 'RA/CRUD_UPDATE_SUCCESS'; +export type CrudUpdateSuccessAction = CrudUpdateGenericAction< + typeof CRUD_UPDATE_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts new file mode 100644 index 00000000000..62b7e6e7fe9 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts @@ -0,0 +1,77 @@ +import { UPDATE_MANY } from '../../dataFetchActions'; +import { NotificationSideEffect } from '../../sideEffect/notification'; +import { RefreshSideEffect } from '../../sideEffect/refresh'; + +interface CrudUpdateManyGenericAction { + readonly type: T; + readonly payload: { + ids: [string]; + data: any; + }; + readonly meta: { + resource: string; + fetch: typeof UPDATE_MANY; + onSuccess: { + notification: NotificationSideEffect; + refresh: RefreshSideEffect; + basePath: string; + unselectAll: boolean; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + +export const CRUD_UPDATE_MANY = 'RA/CRUD_UPDATE_MANY'; +export type CrudUpdateManyAction = CrudUpdateManyGenericAction< + typeof CRUD_UPDATE_MANY +>; + +export const crudUpdateMany = ( + resource, + ids, + data, + basePath, + refresh = true +): CrudUpdateManyAction => ({ + type: CRUD_UPDATE_MANY, + payload: { ids, data }, + meta: { + resource, + fetch: UPDATE_MANY, + onSuccess: { + notification: { + body: 'ra.notification.updated', + level: 'info', + messageArgs: { + smart_count: ids.length, + }, + }, + basePath, + refresh, + unselectAll: true, + }, + onFailure: { + notification: { + body: 'ra.notification.http_error', + level: 'warning', + }, + }, + }, +}); + +export const CRUD_UPDATE_MANY_LOADING = 'RA/CRUD_UPDATE_MANY_LOADING'; +export type CrudUpdateManyLoadingAction = CrudUpdateManyGenericAction< + typeof CRUD_UPDATE_MANY_LOADING +>; + +export const CRUD_UPDATE_MANY_FAILURE = 'RA/CRUD_UPDATE_MANY_FAILURE'; +export type CrudUpdateManyFailingAction = CrudUpdateManyGenericAction< + typeof CRUD_UPDATE_MANY_FAILURE +>; + +export const CRUD_UPDATE_MANY_SUCCESS = 'RA/CRUD_UPDATE_MANY_SUCCESS'; +export type CrudUpdateManySuccessAction = CrudUpdateManyGenericAction< + typeof CRUD_UPDATE_MANY_SUCCESS +>; diff --git a/packages/ra-core/src/actions/dataActions/index.ts b/packages/ra-core/src/actions/dataActions/index.ts new file mode 100644 index 00000000000..22c8f7cb1d6 --- /dev/null +++ b/packages/ra-core/src/actions/dataActions/index.ts @@ -0,0 +1,11 @@ +export * from './crudCreate'; +export * from './crudDelete'; +export * from './crudDeleteMany'; +export * from './crudGetAll'; +export * from './crudGetList'; +export * from './crudGetMany'; +export * from './crudGetManyReference'; +export * from './crudGetMatching'; +export * from './crudGetOne'; +export * from './crudUpdate'; +export * from './crudUpdateMany'; From d7ecfdb8d0e7ff3af971f156cfb47b14ae154acd Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Tue, 29 Jan 2019 00:32:37 +0100 Subject: [PATCH 03/13] Fix derivative fetch actions --- .../src/actions/dataActions/crudCreate.ts | 68 +++++++++----- .../src/actions/dataActions/crudDelete.ts | 75 +++++++++++----- .../src/actions/dataActions/crudDeleteMany.ts | 72 ++++++++++----- .../src/actions/dataActions/crudGetAll.ts | 73 ++++++++++----- .../src/actions/dataActions/crudGetList.ts | 70 ++++++++++----- .../src/actions/dataActions/crudGetMany.ts | 57 ++++++++---- .../dataActions/crudGetManyReference.ts | 89 ++++++++++++------- .../actions/dataActions/crudGetMatching.ts | 77 ++++++++++------ .../src/actions/dataActions/crudGetOne.ts | 68 +++++++++----- .../src/actions/dataActions/crudUpdate.ts | 74 ++++++++++----- .../src/actions/dataActions/crudUpdateMany.ts | 75 ++++++++++------ 11 files changed, 537 insertions(+), 261 deletions(-) diff --git a/packages/ra-core/src/actions/dataActions/crudCreate.ts b/packages/ra-core/src/actions/dataActions/crudCreate.ts index 7b5636f286f..d267ee0d4bd 100644 --- a/packages/ra-core/src/actions/dataActions/crudCreate.ts +++ b/packages/ra-core/src/actions/dataActions/crudCreate.ts @@ -1,12 +1,16 @@ import { CREATE } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RedirectionSideEffect } from '../../sideEffect/redirection'; -interface CrudCreateGenericAction { - readonly type: T; - readonly payload: { - data: any; - }; +interface RequestPayload { + data: any; +} + +export const CRUD_CREATE = 'RA/CRUD_CREATE'; +export interface CrudCreateAction { + readonly type: typeof CRUD_CREATE; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof CREATE; @@ -21,14 +25,11 @@ interface CrudCreateGenericAction { }; } -export const CRUD_CREATE = 'RA/CRUD_CREATE'; -export type CrudCreateAction = CrudCreateGenericAction; - export const crudCreate = ( - resource, - data, - basePath, - redirectTo = 'edit' + resource: string, + data: any, + basePath: string, + redirectTo: string = 'edit' ): CrudCreateAction => ({ type: CRUD_CREATE, payload: { data }, @@ -56,16 +57,41 @@ export const crudCreate = ( }); export const CRUD_CREATE_LOADING = 'RA/CRUD_CREATE_LOADING'; -export type CrudCreateLoadingAction = CrudCreateGenericAction< - typeof CRUD_CREATE_LOADING ->; +export interface CrudCreateLoadingAction { + readonly type: typeof CRUD_CREATE_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_CREATE_FAILURE = 'RA/CRUD_CREATE_FAILURE'; -export type CrudCreateFailingAction = CrudCreateGenericAction< - typeof CRUD_CREATE_FAILURE ->; +export interface CrudCreateFailureAction { + readonly type: typeof CRUD_CREATE_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof CREATE; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_CREATE_SUCCESS = 'RA/CRUD_CREATE_SUCCESS'; -export type CrudCreateSuccessAction = CrudCreateGenericAction< - typeof CRUD_CREATE_SUCCESS ->; +export interface CrudCreateSuccessAction { + readonly type: typeof CRUD_CREATE_SUCCESS; + readonly payload: { + data: any; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + basePath: string; + fetchResponse: typeof CREATE; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudDelete.ts b/packages/ra-core/src/actions/dataActions/crudDelete.ts index 3c4fcec6c24..b8eeeea8599 100644 --- a/packages/ra-core/src/actions/dataActions/crudDelete.ts +++ b/packages/ra-core/src/actions/dataActions/crudDelete.ts @@ -1,14 +1,18 @@ import { DELETE } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RedirectionSideEffect } from '../../sideEffect/redirection'; import { RefreshSideEffect } from '../../sideEffect/refresh'; -interface CrudDeleteGenericAction { - readonly type: T; - readonly payload: { - id: string; - previousData: any; - }; +interface RequestPayload { + id: string; + previousData: any; +} + +export const CRUD_DELETE = 'RA/CRUD_DELETE'; +export interface CrudDeleteAction { + readonly type: typeof CRUD_DELETE; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof DELETE; @@ -24,16 +28,13 @@ interface CrudDeleteGenericAction { }; } -export const CRUD_DELETE = 'RA/CRUD_DELETE'; -export type CrudDeleteAction = CrudDeleteGenericAction; - export const crudDelete = ( - resource, - id, - previousData, - basePath, - redirectTo = 'list', - refresh = true + resource: string, + id: string, + previousData: any, + basePath: string, + redirectTo: string = 'list', + refresh: boolean = true ): CrudDeleteAction => ({ type: CRUD_DELETE, payload: { id, previousData }, @@ -62,16 +63,42 @@ export const crudDelete = ( }); export const CRUD_DELETE_LOADING = 'RA/CRUD_DELETE_LOADING'; -export type CrudDeleteLoadingAction = CrudDeleteGenericAction< - typeof CRUD_DELETE_LOADING ->; +export interface CrudDeleteLoadingAction { + readonly type: typeof CRUD_DELETE_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_DELETE_FAILURE = 'RA/CRUD_DELETE_FAILURE'; -export type CrudDeleteFailingAction = CrudDeleteGenericAction< - typeof CRUD_DELETE_FAILURE ->; +export interface CrudDeleteFailureAction { + readonly type: typeof CRUD_DELETE_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof CRUD_DELETE; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_DELETE_SUCCESS = 'RA/CRUD_DELETE_SUCCESS'; -export type CrudDeleteSuccessAction = CrudDeleteGenericAction< - typeof CRUD_DELETE_SUCCESS ->; +export interface CrudDeleteSuccessAction { + readonly type: typeof CRUD_DELETE_SUCCESS; + readonly payload: { + data: any; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + refresh: RefreshSideEffect; + basePath: string; + fetchResponse: typeof CRUD_DELETE; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts index 58ca4ecd673..35e79522f35 100644 --- a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts @@ -1,12 +1,16 @@ import { DELETE_MANY } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RefreshSideEffect } from '../../sideEffect/refresh'; -interface CrudDeleteManyGenericAction { - readonly type: T; - readonly payload: { - ids: [string]; - }; +interface RequestPayload { + ids: string[]; +} + +export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; +export interface CrudDeleteManyAction { + readonly type: typeof CRUD_DELETE_MANY; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof DELETE_MANY; @@ -21,17 +25,11 @@ interface CrudDeleteManyGenericAction { }; }; } - -export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; -export type CrudDeleteManyAction = CrudDeleteManyGenericAction< - typeof CRUD_DELETE_MANY ->; - export const crudDeleteMany = ( - resource, - ids, - basePath, - refresh = true + resource: string, + ids: string[], + basePath: string, + refresh: boolean = true ): CrudDeleteManyAction => ({ type: CRUD_DELETE_MANY, payload: { ids }, @@ -60,16 +58,42 @@ export const crudDeleteMany = ( }); export const CRUD_DELETE_MANY_LOADING = 'RA/CRUD_DELETE_MANY_LOADING'; -export type CrudDeleteManyLoadingAction = CrudDeleteManyGenericAction< - typeof CRUD_DELETE_MANY_LOADING ->; +export interface CrudDeleteManyLoadingAction { + readonly type: typeof CRUD_DELETE_MANY_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_DELETE_MANY_FAILURE = 'RA/CRUD_DELETE_MANY_FAILURE'; -export type CrudDeleteManyFailingAction = CrudDeleteManyGenericAction< - typeof CRUD_DELETE_MANY_FAILURE ->; +export interface CrudDeleteMAnyFailureAction { + readonly type: typeof CRUD_DELETE_MANY_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof DELETE_MANY; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_DELETE_MANY_SUCCESS = 'RA/CRUD_DELETE_MANY_SUCCESS'; -export type CrudDeleteManySuccessAction = CrudDeleteManyGenericAction< - typeof CRUD_DELETE_MANY_SUCCESS ->; +export interface CrudDeleteManySuccessAction { + readonly type: typeof CRUD_DELETE_MANY_SUCCESS; + readonly payload: { + data: string[]; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + refresh: RefreshSideEffect; + basePath: string; + unselectAll: boolean; + fetchResponse: typeof DELETE_MANY; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudGetAll.ts b/packages/ra-core/src/actions/dataActions/crudGetAll.ts index 1b70cc1952a..44a3a9fd764 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetAll.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetAll.ts @@ -1,13 +1,17 @@ import { GET_LIST } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; -interface CrudGetAllGenericAction { - readonly type: T; - readonly payload: { - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; - filter: object; - }; +interface RequestPayload { + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; +} + +export const CRUD_GET_ALL = 'RA/CRUD_GET_ALL'; +interface CrudGetAllAction { + readonly type: typeof CRUD_GET_ALL; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof GET_LIST; @@ -20,15 +24,12 @@ interface CrudGetAllGenericAction { }; } -export const CRUD_GET_ALL = 'RA/CRUD_GET_ALL'; -export type CrudGetAllAction = CrudGetAllGenericAction; - export const crudGetAll = ( - resource, - sort, - filter, - maxResults, - callback + resource: string, + sort: { field: string; order: string }, + filter: object, + maxResults: number, + callback?: () => any ): CrudGetAllAction => ({ type: CRUD_GET_ALL, payload: { sort, filter, pagination: { page: 1, perPage: maxResults } }, @@ -48,16 +49,40 @@ export const crudGetAll = ( }); export const CRUD_GET_ALL_LOADING = 'RA/CRUD_GET_ALL_LOADING'; -export type CrudGetAllLoadingAction = CrudGetAllGenericAction< - typeof CRUD_GET_ALL_LOADING ->; +export interface CrudGetAllLoadingAction { + readonly type: typeof CRUD_GET_ALL_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_GET_ALL_FAILURE = 'RA/CRUD_GET_ALL_FAILURE'; -export type CrudGetAllFailingAction = CrudGetAllGenericAction< - typeof CRUD_GET_ALL_FAILURE ->; +export interface CrudGetAllFailureAction { + readonly type: typeof CRUD_GET_ALL_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof GET_LIST; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_GET_ALL_SUCCESS = 'RA/CRUD_GET_ALL_SUCCESS'; -export type CrudGetAllSuccessAction = CrudGetAllGenericAction< - typeof CRUD_GET_ALL_SUCCESS ->; +export interface CrudGetAllSuccessAction { + readonly type: typeof CRUD_GET_ALL_SUCCESS; + readonly payload: { + data: any[]; + total: number; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + callback: any; + fetchResponse: typeof GET_LIST; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudGetList.ts b/packages/ra-core/src/actions/dataActions/crudGetList.ts index aeeb9240195..b9d1ac1d181 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetList.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetList.ts @@ -1,13 +1,17 @@ import { GET_LIST } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; -interface CrudGetListGenericAction { - readonly type: T; - readonly payload: { - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; - filter: object; - }; +interface RequestPayload { + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; +} + +export const CRUD_GET_LIST = 'RA/CRUD_GET_LIST'; +export interface CrudGetListAction { + readonly type: typeof CRUD_GET_LIST; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof GET_LIST; @@ -17,14 +21,11 @@ interface CrudGetListGenericAction { }; } -export const CRUD_GET_LIST = 'RA/CRUD_GET_LIST'; -export type CrudGetListAction = CrudGetListGenericAction; - export const crudGetList = ( - resource, - pagination, - sort, - filter + resource: string, + pagination: { page: number; perPage: number }, + sort: { field: string; order: string }, + filter: object ): CrudGetListAction => ({ type: CRUD_GET_LIST, payload: { pagination, sort, filter }, @@ -41,16 +42,39 @@ export const crudGetList = ( }); export const CRUD_GET_LIST_LOADING = 'RA/CRUD_GET_LIST_LOADING'; -export type CrudGetListLoadingAction = CrudGetListGenericAction< - typeof CRUD_GET_LIST_LOADING ->; +export interface CrudGetListLoadingAction { + readonly type: typeof CRUD_GET_LIST_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_GET_LIST_FAILURE = 'RA/CRUD_GET_LIST_FAILURE'; -export type CrudGetListFailureAction = CrudGetListGenericAction< - typeof CRUD_GET_LIST_FAILURE ->; +export interface CrudGetListFailureAction { + readonly type: typeof CRUD_GET_LIST_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof GET_LIST; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_GET_LIST_SUCCESS = 'RA/CRUD_GET_LIST_SUCCESS'; -export type CrudGetListSuccessAction = CrudGetListGenericAction< - typeof CRUD_GET_LIST_SUCCESS ->; +export interface CrudGetListSuccessAction { + readonly type: typeof CRUD_GET_LIST_SUCCESS; + readonly payload: { + data: any[]; + total: number; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + fetchResponse: typeof GET_LIST; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudGetMany.ts b/packages/ra-core/src/actions/dataActions/crudGetMany.ts index 07ac20beb48..28d1cb1e816 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMany.ts @@ -1,11 +1,15 @@ import { GET_MANY } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; -interface CrudGetManyGenericAction { - readonly type: T; - readonly payload: { - ids: [string]; - }; +interface RequestPayload { + ids: string[]; +} + +export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; +export interface CrudGetManyAction { + readonly type: typeof CRUD_GET_MANY; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof GET_MANY; @@ -15,9 +19,6 @@ interface CrudGetManyGenericAction { }; } -export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; -export type CrudGetManyAction = CrudGetManyGenericAction; - export const crudGetMany = (resource, ids): CrudGetManyAction => ({ type: CRUD_GET_MANY, payload: { ids }, @@ -34,16 +35,38 @@ export const crudGetMany = (resource, ids): CrudGetManyAction => ({ }); export const CRUD_GET_MANY_LOADING = 'RA/CRUD_GET_MANY_LOADING'; -export type CrudGetManyLoadingAction = CrudGetManyGenericAction< - typeof CRUD_GET_MANY_LOADING ->; +export interface CrudGetManyLoadingAction { + readonly type: typeof CRUD_GET_MANY_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_GET_MANY_FAILURE = 'RA/CRUD_GET_MANY_FAILURE'; -export type CrudGetManyFailingAction = CrudGetManyGenericAction< - typeof CRUD_GET_MANY_FAILURE ->; +export interface CrudGetManyFailureAction { + readonly type: typeof CRUD_GET_MANY_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof GET_MANY; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_GET_MANY_SUCCESS = 'RA/CRUD_GET_MANY_SUCCESS'; -export type CrudGetManySuccessAction = CrudGetManyGenericAction< - typeof CRUD_GET_MANY_SUCCESS ->; +export interface CrudGetManySuccessAction { + readonly type: typeof CRUD_GET_MANY_SUCCESS; + readonly payload: { + data: any[]; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + fetchResponse: typeof GET_MANY; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts index ee2274e0695..4088083fc08 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts @@ -1,16 +1,20 @@ import { GET_MANY_REFERENCE } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; -interface CrudGetManyReferenceGenericAction { - readonly type: T; - readonly payload: { - source: string; - target: string; - id: string; - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; - filter: object; - }; +interface RequestPayload { + source: string; + target: string; + id: string; + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; +} + +export const CRUD_GET_MANY_REFERENCE = 'RA/CRUD_GET_MANY_REFERENCE'; +export interface CrudGetManyReferenceAction { + readonly type: typeof CRUD_GET_MANY_REFERENCE; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof GET_MANY_REFERENCE; @@ -21,20 +25,15 @@ interface CrudGetManyReferenceGenericAction { }; } -export const CRUD_GET_MANY_REFERENCE = 'RA/CRUD_GET_MANY_REFERENCE'; -export type CrudGetManyReferenceAction = CrudGetManyReferenceGenericAction< - typeof CRUD_GET_MANY_REFERENCE ->; - export const crudGetManyReference = ( - reference, - target, - id, - relatedTo, - pagination, - sort, - filter, - source + reference: string, + target: string, + id: string, + relatedTo: string, + pagination: { page: number; perPage: number }, + sort: { field: string; order: string }, + filter: object, + source: string ): CrudGetManyReferenceAction => ({ type: CRUD_GET_MANY_REFERENCE, payload: { target, id, pagination, sort, filter, source }, @@ -53,18 +52,44 @@ export const crudGetManyReference = ( export const CRUD_GET_MANY_REFERENCE_LOADING = 'RA/CRUD_GET_MANY_REFERENCE_LOADING'; -export type CrudGetManyReferenceLoadingAction = CrudGetManyReferenceGenericAction< - typeof CRUD_GET_MANY_REFERENCE_LOADING ->; +export interface CrudGetManyReferenceLoadingAction { + readonly type: typeof CRUD_GET_MANY_REFERENCE_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + relatedTo: string; + }; +} export const CRUD_GET_MANY_REFERENCE_FAILURE = 'RA/CRUD_GET_MANY_REFERENCE_FAILURE'; -export type CrudGetManyReferenceFailingAction = CrudGetManyReferenceGenericAction< - typeof CRUD_GET_MANY_REFERENCE_FAILURE ->; +export interface CrudGetManyReferenceFailureAction { + readonly type: typeof CRUD_GET_MANY_REFERENCE_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + relatedTo: string; + notification: NotificationSideEffect; + fetchResponse: typeof GET_MANY_REFERENCE; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_GET_MANY_REFERENCE_SUCCESS = 'RA/CRUD_GET_MANY_REFERENCE_SUCCESS'; -export type CrudGetManyReferenceSuccessAction = CrudGetManyReferenceGenericAction< - typeof CRUD_GET_MANY_REFERENCE_SUCCESS ->; +export interface CrudGetManyReferenceSuccessAction { + readonly type: typeof CRUD_GET_MANY_REFERENCE_SUCCESS; + readonly payload: { + data: any[]; + total: number; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + relatedTo: string; + fetchResponse: typeof GET_MANY_REFERENCE; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts index 0f165dee46d..d00cafeaf7e 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts @@ -1,13 +1,17 @@ import { GET_LIST } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; -interface CrudGetMatchingGenericAction { - readonly type: T; - readonly payload: { - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; - filter: object; - }; +interface RequestPayload { + pagination: { page: number; perPage: number }; + sort: { field: string; order: string }; + filter: object; +} + +export const CRUD_GET_MATCHING = 'RA/CRUD_GET_MATCHING'; +interface CrudGetMatchingAction { + readonly type: typeof CRUD_GET_MATCHING; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof GET_LIST; @@ -18,17 +22,12 @@ interface CrudGetMatchingGenericAction { }; } -export const CRUD_GET_MATCHING = 'RA/CRUD_GET_MATCHING'; -export type CrudGetMatchingAction = CrudGetMatchingGenericAction< - typeof CRUD_GET_MATCHING ->; - export const crudGetMatching = ( - reference, - relatedTo, - pagination, - sort, - filter + reference: string, + relatedTo: string, + pagination: { page: number; perPage: number }, + sort: { field: string; order: string }, + filter: object ): CrudGetMatchingAction => ({ type: CRUD_GET_MATCHING, payload: { pagination, sort, filter }, @@ -46,16 +45,42 @@ export const crudGetMatching = ( }); export const CRUD_GET_MATCHING_LOADING = 'RA/CRUD_GET_MATCHING_LOADING'; -export type CrudGetMatchingLoadingAction = CrudGetMatchingGenericAction< - typeof CRUD_GET_MATCHING_LOADING ->; +export interface CrudGetMatchingLoadingAction { + readonly type: typeof CRUD_GET_MATCHING_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + relatedTo: string; + }; +} export const CRUD_GET_MATCHING_FAILURE = 'RA/CRUD_GET_MATCHING_FAILURE'; -export type CrudGetMatchingFailingAction = CrudGetMatchingGenericAction< - typeof CRUD_GET_MATCHING_FAILURE ->; +export interface CrudGetMatchingFailureAction { + readonly type: typeof CRUD_GET_MATCHING_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + relatedTo: string; + notification: NotificationSideEffect; + fetchResponse: typeof GET_LIST; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_GET_MATCHING_SUCCESS = 'RA/CRUD_GET_MATCHING_SUCCESS'; -export type CrudGetMatchingSuccessAction = CrudGetMatchingGenericAction< - typeof CRUD_GET_MATCHING_SUCCESS ->; +export interface CrudGetMatchingSuccessAction { + readonly type: typeof CRUD_GET_MATCHING_SUCCESS; + readonly payload: { + data: any[]; + total: number; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + relatedTo: string; + fetchResponse: typeof GET_LIST; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudGetOne.ts b/packages/ra-core/src/actions/dataActions/crudGetOne.ts index 4a533816745..c21bfa6f0d4 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetOne.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetOne.ts @@ -1,13 +1,17 @@ import { GET_ONE } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RedirectionSideEffect } from '../../sideEffect/redirection'; import { RefreshSideEffect } from '../../sideEffect/refresh'; -interface CrudGetOneGenericAction { - readonly type: T; - readonly payload: { - id: string; - }; +interface RequestPayload { + id: string; +} + +export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; +export interface CrudGetOneAction { + readonly type: typeof CRUD_GET_ONE; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof GET_ONE; @@ -20,14 +24,11 @@ interface CrudGetOneGenericAction { }; } -export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; -export type CrudGetOneAction = CrudGetOneGenericAction; - export const crudGetOne = ( - resource, - id, - basePath, - refresh = true + resource: string, + id: string, + basePath: string, + refresh: boolean = true ): CrudGetOneAction => ({ type: CRUD_GET_ONE, payload: { id }, @@ -47,16 +48,41 @@ export const crudGetOne = ( }); export const CRUD_GET_ONE_LOADING = 'RA/CRUD_GET_ONE_LOADING'; -export type CrudGetOneLoadingAction = CrudGetOneGenericAction< - typeof CRUD_GET_ONE_LOADING ->; +export interface CrudGetOneLoadingAction { + readonly type: typeof CRUD_GET_ONE_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + basePath: string; + }; +} export const CRUD_GET_ONE_FAILURE = 'RA/CRUD_GET_ONE_FAILURE'; -export type CrudGetOneFailingAction = CrudGetOneGenericAction< - typeof CRUD_GET_ONE_FAILURE ->; +export interface CrudGetOneFailureAction { + readonly type: typeof CRUD_GET_ONE_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + refresh: RefreshSideEffect; + fetchResponse: typeof GET_ONE; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_GET_ONE_SUCCESS = 'RA/CRUD_GET_ONE_SUCCESS'; -export type CrudGetOneSuccessAction = CrudGetOneGenericAction< - typeof CRUD_GET_ONE_SUCCESS ->; +export interface CrudGetOneSuccessAction { + readonly type: typeof CRUD_GET_ONE_SUCCESS; + readonly payload: { + data: any; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + fetchResponse: typeof GET_ONE; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudUpdate.ts b/packages/ra-core/src/actions/dataActions/crudUpdate.ts index 1ac6c32e021..88d97b8bf96 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdate.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdate.ts @@ -1,14 +1,18 @@ import { UPDATE } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RedirectionSideEffect } from '../../sideEffect/redirection'; -interface CrudUpdateGenericAction { - readonly type: T; - readonly payload: { - id: string; - data: any; - previousData?: any; - }; +interface RequestPayload { + id: string; + data: any; + previousData?: any; +} + +export const CRUD_UPDATE = 'RA/CRUD_UPDATE'; +export interface CrudUpdateAction { + readonly type: typeof CRUD_UPDATE; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof UPDATE; @@ -23,15 +27,12 @@ interface CrudUpdateGenericAction { }; } -export const CRUD_UPDATE = 'RA/CRUD_UPDATE'; -export type CrudUpdateAction = CrudUpdateGenericAction; - export const crudUpdate = ( - resource, - id, - data, - previousData, - basePath, + resource: string, + id: string, + data: any, + previousData: any, + basePath: string, redirectTo = 'show' ): CrudUpdateAction => ({ type: CRUD_UPDATE, @@ -60,16 +61,41 @@ export const crudUpdate = ( }); export const CRUD_UPDATE_LOADING = 'RA/CRUD_UPDATE_LOADING'; -export type CrudUpdateLoadingAction = CrudUpdateGenericAction< - typeof CRUD_UPDATE_LOADING ->; +export interface CrudUpdateLoadingAction { + readonly type: typeof CRUD_UPDATE_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_UPDATE_FAILURE = 'RA/CRUD_UPDATE_FAILURE'; -export type CrudUpdateFailingAction = CrudUpdateGenericAction< - typeof CRUD_UPDATE_FAILURE ->; +export interface CrudUpdateFailureAction { + readonly type: typeof CRUD_UPDATE_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof UPDATE; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_UPDATE_SUCCESS = 'RA/CRUD_UPDATE_SUCCESS'; -export type CrudUpdateSuccessAction = CrudUpdateGenericAction< - typeof CRUD_UPDATE_SUCCESS ->; +export interface CrudUpdateSuccessAction { + readonly type: typeof CRUD_UPDATE_SUCCESS; + readonly payload: { + data: any; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + basePath: string; + fetchResponse: typeof UPDATE; + fetchStatus: typeof FETCH_END; + }; +} diff --git a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts index 62b7e6e7fe9..295f4782939 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts @@ -1,13 +1,17 @@ import { UPDATE_MANY } from '../../dataFetchActions'; +import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RefreshSideEffect } from '../../sideEffect/refresh'; -interface CrudUpdateManyGenericAction { - readonly type: T; - readonly payload: { - ids: [string]; - data: any; - }; +interface RequestPayload { + ids: string[]; + data: any; +} + +export const CRUD_UPDATE_MANY = 'RA/CRUD_UPDATE_MANY'; +export interface CrudUpdateManyAction { + readonly type: typeof CRUD_UPDATE_MANY; + readonly payload: RequestPayload; readonly meta: { resource: string; fetch: typeof UPDATE_MANY; @@ -23,17 +27,12 @@ interface CrudUpdateManyGenericAction { }; } -export const CRUD_UPDATE_MANY = 'RA/CRUD_UPDATE_MANY'; -export type CrudUpdateManyAction = CrudUpdateManyGenericAction< - typeof CRUD_UPDATE_MANY ->; - export const crudUpdateMany = ( - resource, - ids, - data, - basePath, - refresh = true + resource: string, + ids: string[], + data: any, + basePath: string, + refresh: boolean = true ): CrudUpdateManyAction => ({ type: CRUD_UPDATE_MANY, payload: { ids, data }, @@ -62,16 +61,42 @@ export const crudUpdateMany = ( }); export const CRUD_UPDATE_MANY_LOADING = 'RA/CRUD_UPDATE_MANY_LOADING'; -export type CrudUpdateManyLoadingAction = CrudUpdateManyGenericAction< - typeof CRUD_UPDATE_MANY_LOADING ->; +export interface CrudUpdateManyLoadingAction { + readonly type: typeof CRUD_UPDATE_MANY_LOADING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + }; +} export const CRUD_UPDATE_MANY_FAILURE = 'RA/CRUD_UPDATE_MANY_FAILURE'; -export type CrudUpdateManyFailingAction = CrudUpdateManyGenericAction< - typeof CRUD_UPDATE_MANY_FAILURE ->; +export interface CrudUpdateManyFailureAction { + readonly type: typeof CRUD_UPDATE_MANY_FAILURE; + readonly error: string | object; + readonly payload: string; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + fetchResponse: typeof UPDATE_MANY; + fetchStatus: typeof FETCH_ERROR; + }; +} export const CRUD_UPDATE_MANY_SUCCESS = 'RA/CRUD_UPDATE_MANY_SUCCESS'; -export type CrudUpdateManySuccessAction = CrudUpdateManyGenericAction< - typeof CRUD_UPDATE_MANY_SUCCESS ->; +export interface CrudUpdateManySuccessAction { + readonly type: typeof CRUD_UPDATE_MANY_SUCCESS; + readonly payload: { + data: any[]; + }; + readonly requestPayload: RequestPayload; + readonly meta: { + resource: string; + notification: NotificationSideEffect; + refresh: RefreshSideEffect; + basePath: string; + unselectAll: boolean; + fetchResponse: typeof UPDATE_MANY; + fetchStatus: typeof FETCH_END; + }; +} From 21b2f8673f84b91aed047959d33d2f7112f62141 Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Tue, 29 Jan 2019 00:32:54 +0100 Subject: [PATCH 04/13] Migrate total reducer to TypeScript --- .../src/reducer/admin/resource/list/total.js | 23 ---------- .../src/reducer/admin/resource/list/total.ts | 42 +++++++++++++++++++ 2 files changed, 42 insertions(+), 23 deletions(-) delete mode 100644 packages/ra-core/src/reducer/admin/resource/list/total.js create mode 100644 packages/ra-core/src/reducer/admin/resource/list/total.ts diff --git a/packages/ra-core/src/reducer/admin/resource/list/total.js b/packages/ra-core/src/reducer/admin/resource/list/total.js deleted file mode 100644 index d61c1c31241..00000000000 --- a/packages/ra-core/src/reducer/admin/resource/list/total.js +++ /dev/null @@ -1,23 +0,0 @@ -import { - CRUD_GET_ONE_SUCCESS, - CRUD_GET_LIST_SUCCESS, -} from '../../../../actions/dataActions'; -import { DELETE, DELETE_MANY } from '../../../../dataFetchActions'; - -export default (previousState = 0, { type, payload, meta }) => { - if (type === CRUD_GET_ONE_SUCCESS) { - return previousState == 0 ? 1 : previousState; - } - if (type === CRUD_GET_LIST_SUCCESS) { - return payload.total; - } - if (meta && meta.optimistic) { - if (meta.fetch === DELETE) { - return previousState - 1; - } - if (meta.fetch === DELETE_MANY) { - return previousState - payload.ids.length; - } - } - return previousState; -}; diff --git a/packages/ra-core/src/reducer/admin/resource/list/total.ts b/packages/ra-core/src/reducer/admin/resource/list/total.ts new file mode 100644 index 00000000000..3de0d300771 --- /dev/null +++ b/packages/ra-core/src/reducer/admin/resource/list/total.ts @@ -0,0 +1,42 @@ +import { Reducer } from 'redux'; +import { + CRUD_GET_ONE_SUCCESS, + CrudGetOneSuccessAction, + CRUD_GET_LIST_SUCCESS, + CrudGetListSuccessAction, +} from '../../../../actions/dataActions'; +import { DELETE, DELETE_MANY } from '../../../../dataFetchActions'; + +type ActionTypes = + | CrudGetOneSuccessAction + | CrudGetListSuccessAction + | { + type: 'OTHER_TYPE'; + payload?: { ids: string[] }; + meta?: { optimistic?: boolean; fetch?: string }; + }; + +type State = number; + +const totalReducer: Reducer = ( + previousState = 0, + action: ActionTypes +) => { + if (action.type === CRUD_GET_ONE_SUCCESS) { + return previousState === 0 ? 1 : previousState; + } + if (action.type === CRUD_GET_LIST_SUCCESS) { + return action.payload.total; + } + if (action.meta && action.meta.optimistic) { + if (action.meta.fetch === DELETE) { + return previousState - 1; + } + if (action.meta.fetch === DELETE_MANY) { + return previousState - action.payload.ids.length; + } + } + return previousState; +}; + +export default totalReducer; From 735bc0acb43a29f46051d7f1d11d1e5446e9f210 Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Tue, 29 Jan 2019 00:35:31 +0100 Subject: [PATCH 05/13] Fix imprecise param types in accumulate actions --- packages/ra-core/src/actions/accumulateActions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ra-core/src/actions/accumulateActions.ts b/packages/ra-core/src/actions/accumulateActions.ts index 1b583fb0e9f..c1342001ac1 100644 --- a/packages/ra-core/src/actions/accumulateActions.ts +++ b/packages/ra-core/src/actions/accumulateActions.ts @@ -36,8 +36,8 @@ export interface CrudGetMatchingAccumulateAction { export const crudGetMatchingAccumulate = ( reference: string, relatedTo: string, - pagination: object, - sort: object, + pagination: { page: number; perPage: number }, + sort: { field: string; order: string }, filter: object ): CrudGetMatchingAccumulateAction => { const action = crudGetMatching( From c7ebb49cdc0e2d297028b0843cb448438c0580bb Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 09:27:12 +0100 Subject: [PATCH 06/13] Add Record and Identifier types --- .../ra-core/src/actions/dataActions/crudCreate.ts | 3 ++- .../ra-core/src/actions/dataActions/crudDelete.ts | 11 ++++++----- .../ra-core/src/actions/dataActions/crudDeleteMany.ts | 7 ++++--- .../ra-core/src/actions/dataActions/crudGetAll.ts | 8 +++++--- .../ra-core/src/actions/dataActions/crudGetList.ts | 3 ++- .../ra-core/src/actions/dataActions/crudGetMany.ts | 10 +++++++--- .../src/actions/dataActions/crudGetManyReference.ts | 7 ++++--- .../src/actions/dataActions/crudGetMatching.ts | 3 ++- .../ra-core/src/actions/dataActions/crudGetOne.ts | 7 ++++--- .../ra-core/src/actions/dataActions/crudUpdate.ts | 7 ++++--- .../ra-core/src/actions/dataActions/crudUpdateMany.ts | 7 ++++--- packages/ra-core/src/types.ts | 6 ++++++ 12 files changed, 50 insertions(+), 29 deletions(-) diff --git a/packages/ra-core/src/actions/dataActions/crudCreate.ts b/packages/ra-core/src/actions/dataActions/crudCreate.ts index d267ee0d4bd..263f3aa8ab0 100644 --- a/packages/ra-core/src/actions/dataActions/crudCreate.ts +++ b/packages/ra-core/src/actions/dataActions/crudCreate.ts @@ -1,3 +1,4 @@ +import { Record } from '../../types'; import { CREATE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -83,7 +84,7 @@ export const CRUD_CREATE_SUCCESS = 'RA/CRUD_CREATE_SUCCESS'; export interface CrudCreateSuccessAction { readonly type: typeof CRUD_CREATE_SUCCESS; readonly payload: { - data: any; + data: Record; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/actions/dataActions/crudDelete.ts b/packages/ra-core/src/actions/dataActions/crudDelete.ts index b8eeeea8599..54db2d9cef9 100644 --- a/packages/ra-core/src/actions/dataActions/crudDelete.ts +++ b/packages/ra-core/src/actions/dataActions/crudDelete.ts @@ -1,3 +1,4 @@ +import { Identifier, Record } from '../../types'; import { DELETE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -5,8 +6,8 @@ import { RedirectionSideEffect } from '../../sideEffect/redirection'; import { RefreshSideEffect } from '../../sideEffect/refresh'; interface RequestPayload { - id: string; - previousData: any; + id: Identifier; + previousData: Record; } export const CRUD_DELETE = 'RA/CRUD_DELETE'; @@ -30,8 +31,8 @@ export interface CrudDeleteAction { export const crudDelete = ( resource: string, - id: string, - previousData: any, + id: Identifier, + previousData: Record, basePath: string, redirectTo: string = 'list', refresh: boolean = true @@ -89,7 +90,7 @@ export const CRUD_DELETE_SUCCESS = 'RA/CRUD_DELETE_SUCCESS'; export interface CrudDeleteSuccessAction { readonly type: typeof CRUD_DELETE_SUCCESS; readonly payload: { - data: any; + data: Record; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts index 35e79522f35..3d654529033 100644 --- a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts @@ -1,10 +1,11 @@ +import { Identifier, Record } from '../../types'; import { DELETE_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RefreshSideEffect } from '../../sideEffect/refresh'; interface RequestPayload { - ids: string[]; + ids: Identifier[]; } export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; @@ -27,7 +28,7 @@ export interface CrudDeleteManyAction { } export const crudDeleteMany = ( resource: string, - ids: string[], + ids: Identifier[], basePath: string, refresh: boolean = true ): CrudDeleteManyAction => ({ @@ -84,7 +85,7 @@ export const CRUD_DELETE_MANY_SUCCESS = 'RA/CRUD_DELETE_MANY_SUCCESS'; export interface CrudDeleteManySuccessAction { readonly type: typeof CRUD_DELETE_MANY_SUCCESS; readonly payload: { - data: string[]; + data: Record[]; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/actions/dataActions/crudGetAll.ts b/packages/ra-core/src/actions/dataActions/crudGetAll.ts index 44a3a9fd764..318960c14ad 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetAll.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetAll.ts @@ -1,6 +1,8 @@ +import { Record } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; +import { CallbackSideEffect } from '../../sideEffect/callback'; interface RequestPayload { pagination: { page: number; perPage: number }; @@ -19,7 +21,7 @@ interface CrudGetAllAction { notification: NotificationSideEffect; }; onSuccess: { - callback: any; + callback: CallbackSideEffect; }; }; } @@ -29,7 +31,7 @@ export const crudGetAll = ( sort: { field: string; order: string }, filter: object, maxResults: number, - callback?: () => any + callback?: CallbackSideEffect ): CrudGetAllAction => ({ type: CRUD_GET_ALL, payload: { sort, filter, pagination: { page: 1, perPage: maxResults } }, @@ -75,7 +77,7 @@ export const CRUD_GET_ALL_SUCCESS = 'RA/CRUD_GET_ALL_SUCCESS'; export interface CrudGetAllSuccessAction { readonly type: typeof CRUD_GET_ALL_SUCCESS; readonly payload: { - data: any[]; + data: Record[]; total: number; }; readonly requestPayload: RequestPayload; diff --git a/packages/ra-core/src/actions/dataActions/crudGetList.ts b/packages/ra-core/src/actions/dataActions/crudGetList.ts index b9d1ac1d181..3a191c415ce 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetList.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetList.ts @@ -1,3 +1,4 @@ +import { Record } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -68,7 +69,7 @@ export const CRUD_GET_LIST_SUCCESS = 'RA/CRUD_GET_LIST_SUCCESS'; export interface CrudGetListSuccessAction { readonly type: typeof CRUD_GET_LIST_SUCCESS; readonly payload: { - data: any[]; + data: Record[]; total: number; }; readonly requestPayload: RequestPayload; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMany.ts b/packages/ra-core/src/actions/dataActions/crudGetMany.ts index 28d1cb1e816..2f8502fa1b8 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMany.ts @@ -1,9 +1,10 @@ +import { Identifier, Record } from '../../types'; import { GET_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; interface RequestPayload { - ids: string[]; + ids: Identifier[]; } export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; @@ -19,7 +20,10 @@ export interface CrudGetManyAction { }; } -export const crudGetMany = (resource, ids): CrudGetManyAction => ({ +export const crudGetMany = ( + resource: string, + ids: Identifier[] +): CrudGetManyAction => ({ type: CRUD_GET_MANY, payload: { ids }, meta: { @@ -61,7 +65,7 @@ export const CRUD_GET_MANY_SUCCESS = 'RA/CRUD_GET_MANY_SUCCESS'; export interface CrudGetManySuccessAction { readonly type: typeof CRUD_GET_MANY_SUCCESS; readonly payload: { - data: any[]; + data: Record[]; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts index 4088083fc08..600b96cfa15 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts @@ -1,3 +1,4 @@ +import { Identifier, Record } from '../../types'; import { GET_MANY_REFERENCE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -5,7 +6,7 @@ import { NotificationSideEffect } from '../../sideEffect/notification'; interface RequestPayload { source: string; target: string; - id: string; + id: Identifier; pagination: { page: number; perPage: number }; sort: { field: string; order: string }; filter: object; @@ -28,7 +29,7 @@ export interface CrudGetManyReferenceAction { export const crudGetManyReference = ( reference: string, target: string, - id: string, + id: Identifier, relatedTo: string, pagination: { page: number; perPage: number }, sort: { field: string; order: string }, @@ -82,7 +83,7 @@ export const CRUD_GET_MANY_REFERENCE_SUCCESS = export interface CrudGetManyReferenceSuccessAction { readonly type: typeof CRUD_GET_MANY_REFERENCE_SUCCESS; readonly payload: { - data: any[]; + data: Record[]; total: number; }; readonly requestPayload: RequestPayload; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts index d00cafeaf7e..e4ea1afc5bf 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts @@ -1,3 +1,4 @@ +import { Record } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -73,7 +74,7 @@ export const CRUD_GET_MATCHING_SUCCESS = 'RA/CRUD_GET_MATCHING_SUCCESS'; export interface CrudGetMatchingSuccessAction { readonly type: typeof CRUD_GET_MATCHING_SUCCESS; readonly payload: { - data: any[]; + data: Record[]; total: number; }; readonly requestPayload: RequestPayload; diff --git a/packages/ra-core/src/actions/dataActions/crudGetOne.ts b/packages/ra-core/src/actions/dataActions/crudGetOne.ts index c21bfa6f0d4..2435067252f 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetOne.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetOne.ts @@ -1,3 +1,4 @@ +import { Identifier, Record } from '../../types'; import { GET_ONE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -5,7 +6,7 @@ import { RedirectionSideEffect } from '../../sideEffect/redirection'; import { RefreshSideEffect } from '../../sideEffect/refresh'; interface RequestPayload { - id: string; + id: Identifier; } export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; @@ -26,7 +27,7 @@ export interface CrudGetOneAction { export const crudGetOne = ( resource: string, - id: string, + id: Identifier, basePath: string, refresh: boolean = true ): CrudGetOneAction => ({ @@ -77,7 +78,7 @@ export const CRUD_GET_ONE_SUCCESS = 'RA/CRUD_GET_ONE_SUCCESS'; export interface CrudGetOneSuccessAction { readonly type: typeof CRUD_GET_ONE_SUCCESS; readonly payload: { - data: any; + data: Record; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/actions/dataActions/crudUpdate.ts b/packages/ra-core/src/actions/dataActions/crudUpdate.ts index 88d97b8bf96..1f5b7f85a84 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdate.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdate.ts @@ -1,10 +1,11 @@ +import { Identifier, Record } from '../../types'; import { UPDATE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RedirectionSideEffect } from '../../sideEffect/redirection'; interface RequestPayload { - id: string; + id: Identifier; data: any; previousData?: any; } @@ -29,7 +30,7 @@ export interface CrudUpdateAction { export const crudUpdate = ( resource: string, - id: string, + id: Identifier, data: any, previousData: any, basePath: string, @@ -87,7 +88,7 @@ export const CRUD_UPDATE_SUCCESS = 'RA/CRUD_UPDATE_SUCCESS'; export interface CrudUpdateSuccessAction { readonly type: typeof CRUD_UPDATE_SUCCESS; readonly payload: { - data: any; + data: Record; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts index 295f4782939..adf61218140 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts @@ -1,10 +1,11 @@ +import { Identifier, Record } from '../../types'; import { UPDATE_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { RefreshSideEffect } from '../../sideEffect/refresh'; interface RequestPayload { - ids: string[]; + ids: Identifier[]; data: any; } @@ -29,7 +30,7 @@ export interface CrudUpdateManyAction { export const crudUpdateMany = ( resource: string, - ids: string[], + ids: Identifier[], data: any, basePath: string, refresh: boolean = true @@ -87,7 +88,7 @@ export const CRUD_UPDATE_MANY_SUCCESS = 'RA/CRUD_UPDATE_MANY_SUCCESS'; export interface CrudUpdateManySuccessAction { readonly type: typeof CRUD_UPDATE_MANY_SUCCESS; readonly payload: { - data: any[]; + data: Identifier[]; }; readonly requestPayload: RequestPayload; readonly meta: { diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index 688762b8353..bceca7e6763 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -1,3 +1,9 @@ +export type Identifier = string | boolean; +export interface Record { + id: Identifier; + [key: string]: any; +} + export type I18nProvider = (locale: string) => object | Promise; export type Translate = (id: string, options?: any) => string; From 85c2b64f7a8d907fdabdef6210017473b0776d93 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 09:42:13 +0100 Subject: [PATCH 07/13] Make action creator side effect parameters explicit in type --- packages/ra-core/src/actions/dataActions/crudCreate.ts | 2 +- packages/ra-core/src/actions/dataActions/crudDelete.ts | 4 ++-- packages/ra-core/src/actions/dataActions/crudDeleteMany.ts | 2 +- packages/ra-core/src/actions/dataActions/crudGetOne.ts | 2 +- packages/ra-core/src/actions/dataActions/crudUpdate.ts | 2 +- packages/ra-core/src/actions/dataActions/crudUpdateMany.ts | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/ra-core/src/actions/dataActions/crudCreate.ts b/packages/ra-core/src/actions/dataActions/crudCreate.ts index 263f3aa8ab0..dca42b378b7 100644 --- a/packages/ra-core/src/actions/dataActions/crudCreate.ts +++ b/packages/ra-core/src/actions/dataActions/crudCreate.ts @@ -30,7 +30,7 @@ export const crudCreate = ( resource: string, data: any, basePath: string, - redirectTo: string = 'edit' + redirectTo: RedirectionSideEffect = 'edit' ): CrudCreateAction => ({ type: CRUD_CREATE, payload: { data }, diff --git a/packages/ra-core/src/actions/dataActions/crudDelete.ts b/packages/ra-core/src/actions/dataActions/crudDelete.ts index 54db2d9cef9..8cd5f15efb4 100644 --- a/packages/ra-core/src/actions/dataActions/crudDelete.ts +++ b/packages/ra-core/src/actions/dataActions/crudDelete.ts @@ -34,8 +34,8 @@ export const crudDelete = ( id: Identifier, previousData: Record, basePath: string, - redirectTo: string = 'list', - refresh: boolean = true + redirectTo: RedirectionSideEffect = 'list', + refresh: RefreshSideEffect = true ): CrudDeleteAction => ({ type: CRUD_DELETE, payload: { id, previousData }, diff --git a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts index 3d654529033..f2d736fbf54 100644 --- a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts @@ -30,7 +30,7 @@ export const crudDeleteMany = ( resource: string, ids: Identifier[], basePath: string, - refresh: boolean = true + refresh: RefreshSideEffect = true ): CrudDeleteManyAction => ({ type: CRUD_DELETE_MANY, payload: { ids }, diff --git a/packages/ra-core/src/actions/dataActions/crudGetOne.ts b/packages/ra-core/src/actions/dataActions/crudGetOne.ts index 2435067252f..c6009abde90 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetOne.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetOne.ts @@ -29,7 +29,7 @@ export const crudGetOne = ( resource: string, id: Identifier, basePath: string, - refresh: boolean = true + refresh: RefreshSideEffect = true ): CrudGetOneAction => ({ type: CRUD_GET_ONE, payload: { id }, diff --git a/packages/ra-core/src/actions/dataActions/crudUpdate.ts b/packages/ra-core/src/actions/dataActions/crudUpdate.ts index 1f5b7f85a84..5a859d0aa95 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdate.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdate.ts @@ -34,7 +34,7 @@ export const crudUpdate = ( data: any, previousData: any, basePath: string, - redirectTo = 'show' + redirectTo: RedirectionSideEffect = 'show' ): CrudUpdateAction => ({ type: CRUD_UPDATE, payload: { id, data, previousData }, diff --git a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts index adf61218140..96abc1fc6ea 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts @@ -33,7 +33,7 @@ export const crudUpdateMany = ( ids: Identifier[], data: any, basePath: string, - refresh: boolean = true + refresh: RefreshSideEffect = true ): CrudUpdateManyAction => ({ type: CRUD_UPDATE_MANY, payload: { ids, data }, From aaf73de8cfb5810cc63924e0c7450a2985ea2e5d Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 10:21:47 +0100 Subject: [PATCH 08/13] Add types for Pagination and Sort parameters --- .../ra-core/src/actions/dataActions/crudGetAll.ts | 8 ++++---- .../src/actions/dataActions/crudGetList.ts | 10 +++++----- .../actions/dataActions/crudGetManyReference.ts | 10 +++++----- .../src/actions/dataActions/crudGetMatching.ts | 10 +++++----- packages/ra-core/src/sideEffect/i18n.ts | 3 +-- packages/ra-core/src/types.ts | 15 ++++++++++++++- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/packages/ra-core/src/actions/dataActions/crudGetAll.ts b/packages/ra-core/src/actions/dataActions/crudGetAll.ts index 318960c14ad..ac04cf73a68 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetAll.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetAll.ts @@ -1,12 +1,12 @@ -import { Record } from '../../types'; +import { Record, Pagination, Sort } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; import { CallbackSideEffect } from '../../sideEffect/callback'; interface RequestPayload { - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; + pagination: Pagination; + sort: Sort; filter: object; } @@ -28,7 +28,7 @@ interface CrudGetAllAction { export const crudGetAll = ( resource: string, - sort: { field: string; order: string }, + sort: Sort, filter: object, maxResults: number, callback?: CallbackSideEffect diff --git a/packages/ra-core/src/actions/dataActions/crudGetList.ts b/packages/ra-core/src/actions/dataActions/crudGetList.ts index 3a191c415ce..81f4d19ad44 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetList.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetList.ts @@ -1,11 +1,11 @@ -import { Record } from '../../types'; +import { Record, Pagination, Sort } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; interface RequestPayload { - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; + pagination: Pagination; + sort: Sort; filter: object; } @@ -24,8 +24,8 @@ export interface CrudGetListAction { export const crudGetList = ( resource: string, - pagination: { page: number; perPage: number }, - sort: { field: string; order: string }, + pagination: Pagination, + sort: Sort, filter: object ): CrudGetListAction => ({ type: CRUD_GET_LIST, diff --git a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts index 600b96cfa15..eb154e0b2f5 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts @@ -1,4 +1,4 @@ -import { Identifier, Record } from '../../types'; +import { Identifier, Record, Pagination, Sort } from '../../types'; import { GET_MANY_REFERENCE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; @@ -7,8 +7,8 @@ interface RequestPayload { source: string; target: string; id: Identifier; - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; + pagination: Pagination; + sort: Sort; filter: object; } @@ -31,8 +31,8 @@ export const crudGetManyReference = ( target: string, id: Identifier, relatedTo: string, - pagination: { page: number; perPage: number }, - sort: { field: string; order: string }, + pagination: Pagination, + sort: Sort, filter: object, source: string ): CrudGetManyReferenceAction => ({ diff --git a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts index e4ea1afc5bf..a1c8a6f5c8e 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts @@ -1,11 +1,11 @@ -import { Record } from '../../types'; +import { Record, Pagination, Sort } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect/notification'; interface RequestPayload { - pagination: { page: number; perPage: number }; - sort: { field: string; order: string }; + pagination: Pagination; + sort: Sort; filter: object; } @@ -26,8 +26,8 @@ interface CrudGetMatchingAction { export const crudGetMatching = ( reference: string, relatedTo: string, - pagination: { page: number; perPage: number }, - sort: { field: string; order: string }, + pagination: Pagination, + sort: Sort, filter: object ): CrudGetMatchingAction => ({ type: CRUD_GET_MATCHING, diff --git a/packages/ra-core/src/sideEffect/i18n.ts b/packages/ra-core/src/sideEffect/i18n.ts index 6a8811d320d..4a75079755a 100644 --- a/packages/ra-core/src/sideEffect/i18n.ts +++ b/packages/ra-core/src/sideEffect/i18n.ts @@ -1,12 +1,11 @@ import { all, call, put, takeLatest } from 'redux-saga/effects'; +import { I18nProvider } from '../types'; import { CHANGE_LOCALE, changeLocaleSuccess, changeLocaleFailure, } from '../actions'; -export type I18nProvider = (locale: string) => object | Promise; - /** * The i18n side effect reacts to the CHANGE_LOCALE actions, calls * the i18nProvider (which may be asynchronous) with the requested locale, diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index bceca7e6763..5c8149da77e 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -4,6 +4,15 @@ export interface Record { [key: string]: any; } +export interface Sort { + field: string; + order: string; +} +export interface Pagination { + page: number; + perPage: number; +} + export type I18nProvider = (locale: string) => object | Promise; export type Translate = (id: string, options?: any) => string; @@ -16,7 +25,11 @@ export type AuthActionType = export type AuthProvider = (type: AuthActionType, params: any) => Promise; -export type DataProvider = (action: any) => Promise; +export type DataProvider = ( + type: string, + resource: string, + params: any +) => Promise; export interface ReduxState { i18n: { From fc1a258ff1a566ae5fc7f84c09ac3be462afb88d Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 11:02:48 +0100 Subject: [PATCH 09/13] Migrate remaining side effects to TypeScript --- .../src/actions/dataActions/crudCreate.ts | 6 ++-- .../src/actions/dataActions/crudDelete.ts | 8 +++-- .../src/actions/dataActions/crudDeleteMany.ts | 3 +- .../src/actions/dataActions/crudGetAll.ts | 3 +- .../src/actions/dataActions/crudGetList.ts | 2 +- .../src/actions/dataActions/crudGetMany.ts | 2 +- .../dataActions/crudGetManyReference.ts | 2 +- .../actions/dataActions/crudGetMatching.ts | 2 +- .../src/actions/dataActions/crudGetOne.ts | 8 +++-- .../src/actions/dataActions/crudUpdate.ts | 6 ++-- .../src/actions/dataActions/crudUpdateMany.ts | 3 +- ...{accumulate.spec.js => accumulate.spec.ts} | 8 ++--- .../{accumulate.js => accumulate.ts} | 0 .../src/sideEffect/{admin.js => admin.ts} | 7 +++- .../src/sideEffect/{auth.js => auth.ts} | 14 ++++++-- .../src/sideEffect/{error.js => error.ts} | 14 ++++++-- .../src/sideEffect/{fetch.js => fetch.ts} | 32 +++++++++++++++---- .../src/sideEffect/{index.js => index.ts} | 12 ++++--- packages/ra-core/src/types.ts | 9 ++++-- tsconfig.json | 3 +- 20 files changed, 99 insertions(+), 45 deletions(-) rename packages/ra-core/src/sideEffect/{accumulate.spec.js => accumulate.spec.ts} (94%) rename packages/ra-core/src/sideEffect/{accumulate.js => accumulate.ts} (100%) rename packages/ra-core/src/sideEffect/{admin.js => admin.ts} (80%) rename packages/ra-core/src/sideEffect/{auth.js => auth.ts} (91%) rename packages/ra-core/src/sideEffect/{error.js => error.ts} (65%) rename packages/ra-core/src/sideEffect/{fetch.js => fetch.ts} (86%) rename packages/ra-core/src/sideEffect/{index.js => index.ts} (53%) diff --git a/packages/ra-core/src/actions/dataActions/crudCreate.ts b/packages/ra-core/src/actions/dataActions/crudCreate.ts index dca42b378b7..6738f711973 100644 --- a/packages/ra-core/src/actions/dataActions/crudCreate.ts +++ b/packages/ra-core/src/actions/dataActions/crudCreate.ts @@ -1,8 +1,10 @@ import { Record } from '../../types'; import { CREATE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { RedirectionSideEffect } from '../../sideEffect/redirection'; +import { + NotificationSideEffect, + RedirectionSideEffect, +} from '../../sideEffect'; interface RequestPayload { data: any; diff --git a/packages/ra-core/src/actions/dataActions/crudDelete.ts b/packages/ra-core/src/actions/dataActions/crudDelete.ts index 8cd5f15efb4..fc884eb8d63 100644 --- a/packages/ra-core/src/actions/dataActions/crudDelete.ts +++ b/packages/ra-core/src/actions/dataActions/crudDelete.ts @@ -1,9 +1,11 @@ import { Identifier, Record } from '../../types'; import { DELETE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { RedirectionSideEffect } from '../../sideEffect/redirection'; -import { RefreshSideEffect } from '../../sideEffect/refresh'; +import { + NotificationSideEffect, + RedirectionSideEffect, + RefreshSideEffect, +} from '../../sideEffect'; interface RequestPayload { id: Identifier; diff --git a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts index f2d736fbf54..b247afd67f0 100644 --- a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts @@ -1,8 +1,7 @@ import { Identifier, Record } from '../../types'; import { DELETE_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { RefreshSideEffect } from '../../sideEffect/refresh'; +import { NotificationSideEffect, RefreshSideEffect } from '../../sideEffect'; interface RequestPayload { ids: Identifier[]; diff --git a/packages/ra-core/src/actions/dataActions/crudGetAll.ts b/packages/ra-core/src/actions/dataActions/crudGetAll.ts index ac04cf73a68..786a99a4b84 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetAll.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetAll.ts @@ -1,8 +1,7 @@ import { Record, Pagination, Sort } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { CallbackSideEffect } from '../../sideEffect/callback'; +import { NotificationSideEffect, CallbackSideEffect } from '../../sideEffect'; interface RequestPayload { pagination: Pagination; diff --git a/packages/ra-core/src/actions/dataActions/crudGetList.ts b/packages/ra-core/src/actions/dataActions/crudGetList.ts index 81f4d19ad44..ccf3d0cc52c 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetList.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetList.ts @@ -1,7 +1,7 @@ import { Record, Pagination, Sort } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; +import { NotificationSideEffect } from '../../sideEffect'; interface RequestPayload { pagination: Pagination; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMany.ts b/packages/ra-core/src/actions/dataActions/crudGetMany.ts index 2f8502fa1b8..0e0e6e02940 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMany.ts @@ -1,7 +1,7 @@ import { Identifier, Record } from '../../types'; import { GET_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; +import { NotificationSideEffect } from '../../sideEffect'; interface RequestPayload { ids: Identifier[]; diff --git a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts index eb154e0b2f5..b1592b44b52 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts @@ -1,7 +1,7 @@ import { Identifier, Record, Pagination, Sort } from '../../types'; import { GET_MANY_REFERENCE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; +import { NotificationSideEffect } from '../../sideEffect'; interface RequestPayload { source: string; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts index a1c8a6f5c8e..aaa37b2cbe0 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts @@ -1,7 +1,7 @@ import { Record, Pagination, Sort } from '../../types'; import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; +import { NotificationSideEffect } from '../../sideEffect'; interface RequestPayload { pagination: Pagination; diff --git a/packages/ra-core/src/actions/dataActions/crudGetOne.ts b/packages/ra-core/src/actions/dataActions/crudGetOne.ts index c6009abde90..e3483dc57e3 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetOne.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetOne.ts @@ -1,9 +1,11 @@ import { Identifier, Record } from '../../types'; import { GET_ONE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { RedirectionSideEffect } from '../../sideEffect/redirection'; -import { RefreshSideEffect } from '../../sideEffect/refresh'; +import { + NotificationSideEffect, + RedirectionSideEffect, + RefreshSideEffect, +} from '../../sideEffect'; interface RequestPayload { id: Identifier; diff --git a/packages/ra-core/src/actions/dataActions/crudUpdate.ts b/packages/ra-core/src/actions/dataActions/crudUpdate.ts index 5a859d0aa95..75645f2844c 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdate.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdate.ts @@ -1,8 +1,10 @@ import { Identifier, Record } from '../../types'; import { UPDATE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { RedirectionSideEffect } from '../../sideEffect/redirection'; +import { + NotificationSideEffect, + RedirectionSideEffect, +} from '../../sideEffect'; interface RequestPayload { id: Identifier; diff --git a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts index 96abc1fc6ea..3003125c058 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts @@ -1,8 +1,7 @@ import { Identifier, Record } from '../../types'; import { UPDATE_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; -import { NotificationSideEffect } from '../../sideEffect/notification'; -import { RefreshSideEffect } from '../../sideEffect/refresh'; +import { NotificationSideEffect, RefreshSideEffect } from '../../sideEffect'; interface RequestPayload { ids: Identifier[]; diff --git a/packages/ra-core/src/sideEffect/accumulate.spec.js b/packages/ra-core/src/sideEffect/accumulate.spec.ts similarity index 94% rename from packages/ra-core/src/sideEffect/accumulate.spec.js rename to packages/ra-core/src/sideEffect/accumulate.spec.ts index ef6d7f1f486..23673855e4b 100644 --- a/packages/ra-core/src/sideEffect/accumulate.spec.js +++ b/packages/ra-core/src/sideEffect/accumulate.spec.ts @@ -82,8 +82,8 @@ describe('accumulate saga', () => { payload: { ids: [1, 2] }, meta: { accumulate: crudGetMany, - accumulateValues: (accumulations, action) => [ - ...(accumulations || []), + accumulateValues: (accumulations2, action) => [ + ...(accumulations2 || []), ...action.payload.ids, ], accumulateKey: 'posts', @@ -110,8 +110,8 @@ describe('accumulate saga', () => { payload: { ids: [3, 4] }, meta: { accumulate: crudGetMany, - accumulateValues: (accumulations, action) => [ - ...(accumulations || []), + accumulateValues: (accumulations2, action) => [ + ...(accumulations2 || []), ...action.payload.ids, ], accumulateKey: 'posts', diff --git a/packages/ra-core/src/sideEffect/accumulate.js b/packages/ra-core/src/sideEffect/accumulate.ts similarity index 100% rename from packages/ra-core/src/sideEffect/accumulate.js rename to packages/ra-core/src/sideEffect/accumulate.ts diff --git a/packages/ra-core/src/sideEffect/admin.js b/packages/ra-core/src/sideEffect/admin.ts similarity index 80% rename from packages/ra-core/src/sideEffect/admin.js rename to packages/ra-core/src/sideEffect/admin.ts index 3ed89b2763c..4e17c2cdf0a 100644 --- a/packages/ra-core/src/sideEffect/admin.js +++ b/packages/ra-core/src/sideEffect/admin.ts @@ -1,3 +1,4 @@ +import { DataProvider, AuthProvider, I18nProvider } from '../types'; import { all } from 'redux-saga/effects'; import auth from './auth'; import callback from './callback'; @@ -13,7 +14,11 @@ import undo from './undo'; /** * @param {Object} dataProvider A Data Provider function */ -export default (dataProvider, authProvider, i18nProvider) => +export default ( + dataProvider: DataProvider, + authProvider: AuthProvider | null, + i18nProvider: I18nProvider +) => function* admin() { yield all([ i18n(i18nProvider)(), diff --git a/packages/ra-core/src/sideEffect/auth.js b/packages/ra-core/src/sideEffect/auth.ts similarity index 91% rename from packages/ra-core/src/sideEffect/auth.js rename to packages/ra-core/src/sideEffect/auth.ts index 2ca59430137..39345975400 100644 --- a/packages/ra-core/src/sideEffect/auth.js +++ b/packages/ra-core/src/sideEffect/auth.ts @@ -1,6 +1,7 @@ import { all, put, call, select, takeEvery } from 'redux-saga/effects'; import { push, replace } from 'react-router-redux'; +import { AuthProvider } from '../types'; import { showNotification, hideNotification, @@ -22,8 +23,10 @@ const nextPathnameSelector = state => { const currentPathnameSelector = state => state.router.location; -export default authProvider => { - if (!authProvider) return () => null; +export default (authProvider?: AuthProvider) => { + if (!authProvider) { + return () => null; + } function* handleAuth(action) { const { type, payload, error, meta } = action; switch (type) { @@ -95,7 +98,12 @@ export default authProvider => { }) ); yield put(hideNotification()); - yield put(showNotification('ra.notification.logged_out', 'warning')); + yield put( + showNotification( + 'ra.notification.logged_out', + 'warning' + ) + ); } break; } diff --git a/packages/ra-core/src/sideEffect/error.js b/packages/ra-core/src/sideEffect/error.ts similarity index 65% rename from packages/ra-core/src/sideEffect/error.js rename to packages/ra-core/src/sideEffect/error.ts index b1a52bcd5d6..06b7c278a80 100644 --- a/packages/ra-core/src/sideEffect/error.js +++ b/packages/ra-core/src/sideEffect/error.ts @@ -1,18 +1,26 @@ import { all, put, takeEvery } from 'redux-saga/effects'; -import { CRUD_GET_ONE_SUCCESS } from '../actions/dataActions'; +import { + CRUD_GET_ONE_SUCCESS, + CrudGetOneSuccessAction, +} from '../actions/dataActions'; import { showNotification } from '../actions/notificationActions'; +type ActionTypes = + | CrudGetOneSuccessAction + | { type: 'OTHER_TYPE'; requestPayload?: any; payload?: any }; + /** * Side effects for fetch responses * * Mostly corner case handling */ -function* handleResponse({ type, requestPayload, payload }) { +function* handleResponse(action: ActionTypes) { + const { type, requestPayload, payload } = action; switch (type) { case CRUD_GET_ONE_SUCCESS: if ( !('id' in payload.data) || - payload.data.id != requestPayload.id + payload.data.id !== requestPayload.id ) { return yield put( showNotification('ra.notification.bad_item', 'warning') diff --git a/packages/ra-core/src/sideEffect/fetch.js b/packages/ra-core/src/sideEffect/fetch.ts similarity index 86% rename from packages/ra-core/src/sideEffect/fetch.js rename to packages/ra-core/src/sideEffect/fetch.ts index 36dac04f187..ee8b373ea82 100644 --- a/packages/ra-core/src/sideEffect/fetch.js +++ b/packages/ra-core/src/sideEffect/fetch.ts @@ -6,6 +6,7 @@ import { select, takeEvery, } from 'redux-saga/effects'; +import { DataProvider, ReduxState } from '../types'; import { FETCH_CANCEL, FETCH_END, @@ -70,7 +71,21 @@ function validateResponseFormat( } } -export function* handleFetch(dataProvider, action) { +interface ActionWithSideEffect { + type: string; + payload: any; + meta: { + fetch: string; + resource: string; + onSuccess?: any; + onFailure?: any; + }; +} + +export function* handleFetch( + dataProvider: DataProvider, + action: ActionWithSideEffect +) { const { type, payload, @@ -79,7 +94,9 @@ export function* handleFetch(dataProvider, action) { const restType = fetchMeta; try { - const isOptimistic = yield select(state => state.admin.ui.optimistic); + const isOptimistic = yield select( + (state: ReduxState) => state.admin.ui.optimistic + ); if (isOptimistic) { // in optimistic mode, all fetch actions are canceled, // so the admin uses the store without synchronization @@ -90,14 +107,15 @@ export function* handleFetch(dataProvider, action) { put({ type: `${type}_LOADING`, payload, meta }), put({ type: FETCH_START }), ]); - let response = yield call( + const response = yield call( dataProvider, restType, meta.resource, payload ); - process.env.NODE_ENV !== 'production' && + if (process.env.NODE_ENV !== 'production') { validateResponseFormat(response, restType); + } yield put({ type: `${type}_SUCCESS`, payload: response, @@ -127,12 +145,14 @@ export function* handleFetch(dataProvider, action) { } finally { if (yield cancelled()) { yield put({ type: FETCH_CANCEL }); - return; /* eslint no-unsafe-finally:0 */ + return; /* tslint:disable-line no-unsafe-finally */ } } } + export const takeFetchAction = action => action.meta && action.meta.fetch; -const fetch = dataProvider => { + +const fetch = (dataProvider: DataProvider) => { return function* watchFetch() { yield takeEvery(takeFetchAction, handleFetch, dataProvider); }; diff --git a/packages/ra-core/src/sideEffect/index.js b/packages/ra-core/src/sideEffect/index.ts similarity index 53% rename from packages/ra-core/src/sideEffect/index.js rename to packages/ra-core/src/sideEffect/index.ts index 876c36e6956..9aa86af1230 100644 --- a/packages/ra-core/src/sideEffect/index.js +++ b/packages/ra-core/src/sideEffect/index.ts @@ -1,12 +1,12 @@ import adminSaga from './admin'; import authSaga from './auth'; -import callbackSaga from './callback'; +import callbackSaga, { CallbackSideEffect } from './callback'; import fetchSaga from './fetch'; import errorSaga from './error'; -import notificationSaga from './notification'; -import redirectionSaga from './redirection'; +import notificationSaga, { NotificationSideEffect } from './notification'; +import redirectionSaga, { RedirectionSideEffect } from './redirection'; import accumulateSaga from './accumulate'; -import refreshSaga from './refresh'; +import refreshSaga, { RefreshSideEffect } from './refresh'; import i18nSaga from './i18n'; import undoSaga from './undo'; @@ -14,12 +14,16 @@ export { adminSaga, authSaga, callbackSaga, + CallbackSideEffect, fetchSaga, errorSaga, notificationSaga, + NotificationSideEffect, redirectionSaga, + RedirectionSideEffect, accumulateSaga, refreshSaga, + RefreshSideEffect, i18nSaga, undoSaga, }; diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index 5c8149da77e..f566fdf1f68 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -1,4 +1,4 @@ -export type Identifier = string | boolean; +export type Identifier = string | number; export interface Record { id: Identifier; [key: string]: any; @@ -23,7 +23,7 @@ export type AuthActionType = | 'AUTH_CHECK' | 'AUTH_GET_PERMISSIONS'; -export type AuthProvider = (type: AuthActionType, params: any) => Promise; +export type AuthProvider = (type: AuthActionType, params?: any) => Promise; export type DataProvider = ( type: string, @@ -32,6 +32,11 @@ export type DataProvider = ( ) => Promise; export interface ReduxState { + admin: { + ui: { + optimistic: boolean; + }; + }; i18n: { locale: string; messages: object; diff --git a/tsconfig.json b/tsconfig.json index 27110caade0..7b6a1529e0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,8 +6,7 @@ "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "lib": [ - "es7", - "es6", + "es2017", "dom" ] /* Specify library files to be included in the compilation. */, "allowJs": true /* Allow javascript files to be compiled. */, From de09710fb11968d373df328918bc732a21655e81 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 11:51:38 +0100 Subject: [PATCH 10/13] Fix webpack warnings in simple example --- examples/simple/package.json | 1 + examples/simple/webpack.config.js | 8 ++++++++ packages/ra-core/src/sideEffect/accumulate.spec.ts | 1 + yarn.lock | 5 +++++ 4 files changed, 15 insertions(+) diff --git a/examples/simple/package.json b/examples/simple/package.json index 5b21ef601fa..80e03e8b245 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -29,6 +29,7 @@ "hard-source-webpack-plugin": "^0.11.2", "html-loader": "~0.5.5", "html-webpack-plugin": "~3.2.0", + "ignore-not-found-export-plugin": "^1.0.1", "jest": "^23.6.0", "ra-data-fakerest": "^2.0.0", "ra-input-rich-text": "^2.0.0", diff --git a/examples/simple/webpack.config.js b/examples/simple/webpack.config.js index 1251c72fb96..d02f4241c9e 100644 --- a/examples/simple/webpack.config.js +++ b/examples/simple/webpack.config.js @@ -1,6 +1,7 @@ const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); +const IgnoreNotFoundExportPlugin = require('ignore-not-found-export-plugin'); module.exports = { devtool: 'cheap-module-source-map', @@ -23,6 +24,13 @@ module.exports = { template: './src/index.html', }), new HardSourceWebpackPlugin(), + // required because of https://github.com/babel/babel/issues/7640 + new IgnoreNotFoundExportPlugin([ + 'CallbackSideEffect', + 'NotificationSideEffect', + 'RedirectionSideEffect', + 'RefreshSideEffect', + ]), ], resolve: { extensions: ['.ts', '.js', '.tsx', '.json'], diff --git a/packages/ra-core/src/sideEffect/accumulate.spec.ts b/packages/ra-core/src/sideEffect/accumulate.spec.ts index 23673855e4b..3bc3ca02520 100644 --- a/packages/ra-core/src/sideEffect/accumulate.spec.ts +++ b/packages/ra-core/src/sideEffect/accumulate.spec.ts @@ -1,3 +1,4 @@ +import expect from 'expect'; import { delay } from 'redux-saga'; import { call, cancel, fork, put } from 'redux-saga/effects'; import { createMockTask } from 'redux-saga/utils'; diff --git a/yarn.lock b/yarn.lock index 8d2a11684e8..46a0404631a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7617,6 +7617,11 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +ignore-not-found-export-plugin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-not-found-export-plugin/-/ignore-not-found-export-plugin-1.0.1.tgz#0cc1af5f709df808e079ef4000641a6aa1c606ad" + integrity sha512-QPMrUVdhTXUII2xcq1pGqXJvIz7qb77TlY9eejQdZJaE2bKMBMBtjkVbDTgovieV591tfZ9fSr6ejCWxzX/gzw== + ignore-styles@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ignore-styles/-/ignore-styles-5.0.1.tgz#b49ef2274bdafcd8a4880a966bfe38d1a0bf4671" From a51e985d0eeb13abb11f09a561abdcffbc9bb1d1 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 11:56:55 +0100 Subject: [PATCH 11/13] Fix regression in error saga --- packages/ra-core/src/sideEffect/error.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ra-core/src/sideEffect/error.ts b/packages/ra-core/src/sideEffect/error.ts index 06b7c278a80..64dabaaf870 100644 --- a/packages/ra-core/src/sideEffect/error.ts +++ b/packages/ra-core/src/sideEffect/error.ts @@ -20,7 +20,7 @@ function* handleResponse(action: ActionTypes) { case CRUD_GET_ONE_SUCCESS: if ( !('id' in payload.data) || - payload.data.id !== requestPayload.id + payload.data.id != requestPayload.id // tslint:disable-line triple-equals ) { return yield put( showNotification('ra.notification.bad_item', 'warning') From fed68b5f7ecd4efc88c1134cecbbeefd7c993dc5 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 17:05:21 +0100 Subject: [PATCH 12/13] Export action creators first to improve readability to non TS devs --- .../src/actions/dataActions/crudCreate.ts | 44 ++++++++--------- .../src/actions/dataActions/crudDelete.ts | 48 +++++++++---------- .../src/actions/dataActions/crudDeleteMany.ts | 45 ++++++++--------- .../src/actions/dataActions/crudGetAll.ts | 44 ++++++++--------- .../src/actions/dataActions/crudGetList.ts | 38 +++++++-------- .../src/actions/dataActions/crudGetMany.ts | 34 ++++++------- .../dataActions/crudGetManyReference.ts | 46 +++++++++--------- .../actions/dataActions/crudGetMatching.ts | 40 ++++++++-------- .../src/actions/dataActions/crudGetOne.ts | 40 ++++++++-------- .../src/actions/dataActions/crudUpdate.ts | 48 +++++++++---------- .../src/actions/dataActions/crudUpdateMany.ts | 48 +++++++++---------- 11 files changed, 238 insertions(+), 237 deletions(-) diff --git a/packages/ra-core/src/actions/dataActions/crudCreate.ts b/packages/ra-core/src/actions/dataActions/crudCreate.ts index 6738f711973..93b853d2177 100644 --- a/packages/ra-core/src/actions/dataActions/crudCreate.ts +++ b/packages/ra-core/src/actions/dataActions/crudCreate.ts @@ -6,28 +6,6 @@ import { RedirectionSideEffect, } from '../../sideEffect'; -interface RequestPayload { - data: any; -} - -export const CRUD_CREATE = 'RA/CRUD_CREATE'; -export interface CrudCreateAction { - readonly type: typeof CRUD_CREATE; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof CREATE; - onSuccess: { - notification: NotificationSideEffect; - redirectTo: RedirectionSideEffect; - basePath: string; - }; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudCreate = ( resource: string, data: any, @@ -59,6 +37,28 @@ export const crudCreate = ( }, }); +interface RequestPayload { + data: any; +} + +export const CRUD_CREATE = 'RA/CRUD_CREATE'; +export interface CrudCreateAction { + readonly type: typeof CRUD_CREATE; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof CREATE; + onSuccess: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + basePath: string; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_CREATE_LOADING = 'RA/CRUD_CREATE_LOADING'; export interface CrudCreateLoadingAction { readonly type: typeof CRUD_CREATE_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudDelete.ts b/packages/ra-core/src/actions/dataActions/crudDelete.ts index fc884eb8d63..71a46815cc9 100644 --- a/packages/ra-core/src/actions/dataActions/crudDelete.ts +++ b/packages/ra-core/src/actions/dataActions/crudDelete.ts @@ -7,30 +7,6 @@ import { RefreshSideEffect, } from '../../sideEffect'; -interface RequestPayload { - id: Identifier; - previousData: Record; -} - -export const CRUD_DELETE = 'RA/CRUD_DELETE'; -export interface CrudDeleteAction { - readonly type: typeof CRUD_DELETE; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof DELETE; - onSuccess: { - notification: NotificationSideEffect; - redirectTo: RedirectionSideEffect; - refresh: RefreshSideEffect; - basePath: string; - }; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudDelete = ( resource: string, id: Identifier, @@ -65,6 +41,30 @@ export const crudDelete = ( }, }); +interface RequestPayload { + id: Identifier; + previousData: Record; +} + +export const CRUD_DELETE = 'RA/CRUD_DELETE'; +export interface CrudDeleteAction { + readonly type: typeof CRUD_DELETE; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof DELETE; + onSuccess: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + refresh: RefreshSideEffect; + basePath: string; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_DELETE_LOADING = 'RA/CRUD_DELETE_LOADING'; export interface CrudDeleteLoadingAction { readonly type: typeof CRUD_DELETE_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts index b247afd67f0..1f5ffefabf9 100644 --- a/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudDeleteMany.ts @@ -3,28 +3,6 @@ import { DELETE_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect, RefreshSideEffect } from '../../sideEffect'; -interface RequestPayload { - ids: Identifier[]; -} - -export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; -export interface CrudDeleteManyAction { - readonly type: typeof CRUD_DELETE_MANY; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof DELETE_MANY; - onSuccess: { - notification: NotificationSideEffect; - refresh: RefreshSideEffect; - basePath: string; - unselectAll: boolean; - }; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} export const crudDeleteMany = ( resource: string, ids: Identifier[], @@ -57,6 +35,29 @@ export const crudDeleteMany = ( }, }); +interface RequestPayload { + ids: Identifier[]; +} + +export const CRUD_DELETE_MANY = 'RA/CRUD_DELETE_MANY'; +export interface CrudDeleteManyAction { + readonly type: typeof CRUD_DELETE_MANY; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof DELETE_MANY; + onSuccess: { + notification: NotificationSideEffect; + refresh: RefreshSideEffect; + basePath: string; + unselectAll: boolean; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_DELETE_MANY_LOADING = 'RA/CRUD_DELETE_MANY_LOADING'; export interface CrudDeleteManyLoadingAction { readonly type: typeof CRUD_DELETE_MANY_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudGetAll.ts b/packages/ra-core/src/actions/dataActions/crudGetAll.ts index 786a99a4b84..607f5713b24 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetAll.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetAll.ts @@ -3,28 +3,6 @@ import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect, CallbackSideEffect } from '../../sideEffect'; -interface RequestPayload { - pagination: Pagination; - sort: Sort; - filter: object; -} - -export const CRUD_GET_ALL = 'RA/CRUD_GET_ALL'; -interface CrudGetAllAction { - readonly type: typeof CRUD_GET_ALL; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof GET_LIST; - onFailure: { - notification: NotificationSideEffect; - }; - onSuccess: { - callback: CallbackSideEffect; - }; - }; -} - export const crudGetAll = ( resource: string, sort: Sort, @@ -49,6 +27,28 @@ export const crudGetAll = ( }, }); +interface RequestPayload { + pagination: Pagination; + sort: Sort; + filter: object; +} + +export const CRUD_GET_ALL = 'RA/CRUD_GET_ALL'; +interface CrudGetAllAction { + readonly type: typeof CRUD_GET_ALL; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof GET_LIST; + onFailure: { + notification: NotificationSideEffect; + }; + onSuccess: { + callback: CallbackSideEffect; + }; + }; +} + export const CRUD_GET_ALL_LOADING = 'RA/CRUD_GET_ALL_LOADING'; export interface CrudGetAllLoadingAction { readonly type: typeof CRUD_GET_ALL_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudGetList.ts b/packages/ra-core/src/actions/dataActions/crudGetList.ts index ccf3d0cc52c..b6a256f48de 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetList.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetList.ts @@ -3,25 +3,6 @@ import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect'; -interface RequestPayload { - pagination: Pagination; - sort: Sort; - filter: object; -} - -export const CRUD_GET_LIST = 'RA/CRUD_GET_LIST'; -export interface CrudGetListAction { - readonly type: typeof CRUD_GET_LIST; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof GET_LIST; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudGetList = ( resource: string, pagination: Pagination, @@ -42,6 +23,25 @@ export const crudGetList = ( }, }); +interface RequestPayload { + pagination: Pagination; + sort: Sort; + filter: object; +} + +export const CRUD_GET_LIST = 'RA/CRUD_GET_LIST'; +export interface CrudGetListAction { + readonly type: typeof CRUD_GET_LIST; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof GET_LIST; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_GET_LIST_LOADING = 'RA/CRUD_GET_LIST_LOADING'; export interface CrudGetListLoadingAction { readonly type: typeof CRUD_GET_LIST_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudGetMany.ts b/packages/ra-core/src/actions/dataActions/crudGetMany.ts index 0e0e6e02940..edf3fe78f35 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMany.ts @@ -3,23 +3,6 @@ import { GET_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect'; -interface RequestPayload { - ids: Identifier[]; -} - -export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; -export interface CrudGetManyAction { - readonly type: typeof CRUD_GET_MANY; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof GET_MANY; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudGetMany = ( resource: string, ids: Identifier[] @@ -38,6 +21,23 @@ export const crudGetMany = ( }, }); +interface RequestPayload { + ids: Identifier[]; +} + +export const CRUD_GET_MANY = 'RA/CRUD_GET_MANY'; +export interface CrudGetManyAction { + readonly type: typeof CRUD_GET_MANY; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof GET_MANY; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_GET_MANY_LOADING = 'RA/CRUD_GET_MANY_LOADING'; export interface CrudGetManyLoadingAction { readonly type: typeof CRUD_GET_MANY_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts index b1592b44b52..a0dc625af53 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetManyReference.ts @@ -3,29 +3,6 @@ import { GET_MANY_REFERENCE } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect'; -interface RequestPayload { - source: string; - target: string; - id: Identifier; - pagination: Pagination; - sort: Sort; - filter: object; -} - -export const CRUD_GET_MANY_REFERENCE = 'RA/CRUD_GET_MANY_REFERENCE'; -export interface CrudGetManyReferenceAction { - readonly type: typeof CRUD_GET_MANY_REFERENCE; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof GET_MANY_REFERENCE; - relatedTo: string; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudGetManyReference = ( reference: string, target: string, @@ -51,6 +28,29 @@ export const crudGetManyReference = ( }, }); +interface RequestPayload { + source: string; + target: string; + id: Identifier; + pagination: Pagination; + sort: Sort; + filter: object; +} + +export const CRUD_GET_MANY_REFERENCE = 'RA/CRUD_GET_MANY_REFERENCE'; +export interface CrudGetManyReferenceAction { + readonly type: typeof CRUD_GET_MANY_REFERENCE; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof GET_MANY_REFERENCE; + relatedTo: string; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_GET_MANY_REFERENCE_LOADING = 'RA/CRUD_GET_MANY_REFERENCE_LOADING'; export interface CrudGetManyReferenceLoadingAction { diff --git a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts index aaa37b2cbe0..ad3bfce9f78 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetMatching.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetMatching.ts @@ -3,26 +3,6 @@ import { GET_LIST } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect } from '../../sideEffect'; -interface RequestPayload { - pagination: Pagination; - sort: Sort; - filter: object; -} - -export const CRUD_GET_MATCHING = 'RA/CRUD_GET_MATCHING'; -interface CrudGetMatchingAction { - readonly type: typeof CRUD_GET_MATCHING; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof GET_LIST; - relatedTo: string; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudGetMatching = ( reference: string, relatedTo: string, @@ -45,6 +25,26 @@ export const crudGetMatching = ( }, }); +interface RequestPayload { + pagination: Pagination; + sort: Sort; + filter: object; +} + +export const CRUD_GET_MATCHING = 'RA/CRUD_GET_MATCHING'; +interface CrudGetMatchingAction { + readonly type: typeof CRUD_GET_MATCHING; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof GET_LIST; + relatedTo: string; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_GET_MATCHING_LOADING = 'RA/CRUD_GET_MATCHING_LOADING'; export interface CrudGetMatchingLoadingAction { readonly type: typeof CRUD_GET_MATCHING_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudGetOne.ts b/packages/ra-core/src/actions/dataActions/crudGetOne.ts index e3483dc57e3..295ab3334a3 100644 --- a/packages/ra-core/src/actions/dataActions/crudGetOne.ts +++ b/packages/ra-core/src/actions/dataActions/crudGetOne.ts @@ -7,26 +7,6 @@ import { RefreshSideEffect, } from '../../sideEffect'; -interface RequestPayload { - id: Identifier; -} - -export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; -export interface CrudGetOneAction { - readonly type: typeof CRUD_GET_ONE; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof GET_ONE; - basePath: string; - onFailure: { - notification: NotificationSideEffect; - redirectTo: RedirectionSideEffect; - refresh: RefreshSideEffect; - }; - }; -} - export const crudGetOne = ( resource: string, id: Identifier, @@ -50,6 +30,26 @@ export const crudGetOne = ( }, }); +interface RequestPayload { + id: Identifier; +} + +export const CRUD_GET_ONE = 'RA/CRUD_GET_ONE'; +export interface CrudGetOneAction { + readonly type: typeof CRUD_GET_ONE; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof GET_ONE; + basePath: string; + onFailure: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + refresh: RefreshSideEffect; + }; + }; +} + export const CRUD_GET_ONE_LOADING = 'RA/CRUD_GET_ONE_LOADING'; export interface CrudGetOneLoadingAction { readonly type: typeof CRUD_GET_ONE_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudUpdate.ts b/packages/ra-core/src/actions/dataActions/crudUpdate.ts index 75645f2844c..5f470039cd5 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdate.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdate.ts @@ -6,30 +6,6 @@ import { RedirectionSideEffect, } from '../../sideEffect'; -interface RequestPayload { - id: Identifier; - data: any; - previousData?: any; -} - -export const CRUD_UPDATE = 'RA/CRUD_UPDATE'; -export interface CrudUpdateAction { - readonly type: typeof CRUD_UPDATE; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof UPDATE; - onSuccess: { - notification: NotificationSideEffect; - redirectTo: RedirectionSideEffect; - basePath: string; - }; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudUpdate = ( resource: string, id: Identifier, @@ -63,6 +39,30 @@ export const crudUpdate = ( }, }); +interface RequestPayload { + id: Identifier; + data: any; + previousData?: any; +} + +export const CRUD_UPDATE = 'RA/CRUD_UPDATE'; +export interface CrudUpdateAction { + readonly type: typeof CRUD_UPDATE; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof UPDATE; + onSuccess: { + notification: NotificationSideEffect; + redirectTo: RedirectionSideEffect; + basePath: string; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_UPDATE_LOADING = 'RA/CRUD_UPDATE_LOADING'; export interface CrudUpdateLoadingAction { readonly type: typeof CRUD_UPDATE_LOADING; diff --git a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts index 3003125c058..fd474990895 100644 --- a/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts +++ b/packages/ra-core/src/actions/dataActions/crudUpdateMany.ts @@ -3,30 +3,6 @@ import { UPDATE_MANY } from '../../dataFetchActions'; import { FETCH_END, FETCH_ERROR } from '../fetchActions'; import { NotificationSideEffect, RefreshSideEffect } from '../../sideEffect'; -interface RequestPayload { - ids: Identifier[]; - data: any; -} - -export const CRUD_UPDATE_MANY = 'RA/CRUD_UPDATE_MANY'; -export interface CrudUpdateManyAction { - readonly type: typeof CRUD_UPDATE_MANY; - readonly payload: RequestPayload; - readonly meta: { - resource: string; - fetch: typeof UPDATE_MANY; - onSuccess: { - notification: NotificationSideEffect; - refresh: RefreshSideEffect; - basePath: string; - unselectAll: boolean; - }; - onFailure: { - notification: NotificationSideEffect; - }; - }; -} - export const crudUpdateMany = ( resource: string, ids: Identifier[], @@ -60,6 +36,30 @@ export const crudUpdateMany = ( }, }); +interface RequestPayload { + ids: Identifier[]; + data: any; +} + +export const CRUD_UPDATE_MANY = 'RA/CRUD_UPDATE_MANY'; +export interface CrudUpdateManyAction { + readonly type: typeof CRUD_UPDATE_MANY; + readonly payload: RequestPayload; + readonly meta: { + resource: string; + fetch: typeof UPDATE_MANY; + onSuccess: { + notification: NotificationSideEffect; + refresh: RefreshSideEffect; + basePath: string; + unselectAll: boolean; + }; + onFailure: { + notification: NotificationSideEffect; + }; + }; +} + export const CRUD_UPDATE_MANY_LOADING = 'RA/CRUD_UPDATE_MANY_LOADING'; export interface CrudUpdateManyLoadingAction { readonly type: typeof CRUD_UPDATE_MANY_LOADING; From f685dbc4096ab0ac8053962c68be22bd09a6b977 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 29 Jan 2019 18:13:25 +0100 Subject: [PATCH 13/13] Fix RedirectionSideEffect type --- packages/ra-core/src/sideEffect/redirection.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/ra-core/src/sideEffect/redirection.ts b/packages/ra-core/src/sideEffect/redirection.ts index 46b278929af..802b715306a 100644 --- a/packages/ra-core/src/sideEffect/redirection.ts +++ b/packages/ra-core/src/sideEffect/redirection.ts @@ -2,9 +2,16 @@ import { put, takeEvery } from 'redux-saga/effects'; import { push } from 'react-router-redux'; import { reset } from 'redux-form'; +import { Identifier } from '../types'; import resolveRedirectTo from '../util/resolveRedirectTo'; -export type RedirectionSideEffect = string; +type RedirectToFunction = ( + basePath: string, + id: Identifier, + data: any +) => string; + +export type RedirectionSideEffect = string | false | RedirectToFunction; interface ActionWithSideEffect { type: string; @@ -21,7 +28,7 @@ interface ActionWithSideEffect { }; }; meta: { - redirectTo: RedirectionSideEffect | boolean; + redirectTo: RedirectionSideEffect; basePath?: string; }; }