@@ -182,7 +182,7 @@ function normalizeHydraKey(json: JsonLdObj, key: string): JsonLdObj {
182182 * GET_LIST => GET http://my.api.url/posts
183183 * GET_MANY => GET http://my.api.url/posts/123, GET http://my.api.url/posts/456, GET http://my.api.url/posts/789
184184 * GET_ONE => GET http://my.api.url/posts/123
185- * UPDATE => PUT http://my.api.url/posts/123
185+ * UPDATE => PATCH http://my.api.url/posts/123
186186 */
187187function dataProvider (
188188 factoryParams : HydraDataProviderFactoryParams ,
@@ -253,13 +253,10 @@ function dataProvider(
253253 } ;
254254
255255 const transformReactAdminDataToRequestBody = (
256- resource : string ,
256+ apiResource : undefined | Resource ,
257257 data : Record < string , unknown > | XMLHttpRequestBodyInit ,
258258 extraInformation : { hasFileField ?: boolean } ,
259259 ) : Promise < XMLHttpRequestBodyInit > => {
260- const apiResource = apiSchema . resources . find (
261- ( { name } ) => resource === name ,
262- ) ;
263260 if ( undefined === apiResource ) {
264261 return Promise . resolve ( data as XMLHttpRequestBodyInit ) ;
265262 }
@@ -366,12 +363,23 @@ function dataProvider(
366363 if ( typeof params . meta === 'object' ) {
367364 extraInformation = params . meta ;
368365 }
369- const updateHttpMethod = extraInformation . hasFileField ? 'POST' : 'PUT' ;
366+
367+ const apiResource = ( apiSchema ?. resources ?? [ ] ) . find (
368+ ( { name } ) => resource === name ,
369+ ) ;
370+
371+ let updateHttpMethod = 'POST' ;
372+
373+ if ( ! extraInformation . hasFileField ) {
374+ updateHttpMethod =
375+ apiResource ?. operations ?. find ( ( operation ) => operation . type === 'edit' )
376+ ?. method ?? 'PUT' ;
377+ }
370378
371379 switch ( type ) {
372380 case CREATE :
373381 return transformReactAdminDataToRequestBody (
374- resource ,
382+ apiResource ,
375383 ( params as CreateParams ) . data ,
376384 extraInformation ,
377385 ) . then ( ( body ) => ( {
@@ -481,13 +489,17 @@ function dataProvider(
481489
482490 case UPDATE :
483491 return transformReactAdminDataToRequestBody (
484- resource ,
492+ apiResource ,
485493 ( params as UpdateParams ) . data ,
486494 extraInformation ,
487495 ) . then ( ( body ) => ( {
488496 options : {
489497 body,
490498 method : updateHttpMethod ,
499+ headers :
500+ updateHttpMethod === 'PATCH'
501+ ? { 'content-type' : 'application/merge-patch+json' }
502+ : { } ,
491503 } ,
492504 url,
493505 } ) ) ;
0 commit comments