From fdf9ba5c74db0a34286e62099bc53cb72f9b30a5 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Tue, 31 May 2022 22:09:07 +0200 Subject: [PATCH] BulkMoveDialog: add initial error handling --- .../BulkMoveDialog/BulkMoveDialog.js | 16 +++++++++--- .../admin/src/pages/App/MediaLibrary.js | 1 - .../pages/App/components/BulkMoveButton.js | 25 +++++++++++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js b/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js index f32146e0a0..9f8a258287 100644 --- a/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js +++ b/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js @@ -20,7 +20,7 @@ import { getTrad } from '../../utils'; import SelectTree from '../SelectTree'; import { useFolderStructure } from '../../hooks/useFolderStructure'; -export const BulkMoveDialog = ({ onClose }) => { +export const BulkMoveDialog = ({ onClose, errors }) => { const submitButtonRef = useRef(null); const { formatMessage } = useIntl(); const { data: folderStructure, isLoading } = useFolderStructure(); @@ -48,7 +48,12 @@ export const BulkMoveDialog = ({ onClose }) => { - + {({ values, errors, setFieldValue }) => (
@@ -118,8 +123,13 @@ export const BulkMoveDialog = ({ onClose }) => { ); }; -BulkMoveDialog.defaultProps = {}; +BulkMoveDialog.defaultProps = { + errors: null, +}; BulkMoveDialog.propTypes = { + errors: PropTypes.shape({ + parent: PropTypes.string.isRequired, + }), onClose: PropTypes.func.isRequired, }; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary.js b/packages/core/upload/admin/src/pages/App/MediaLibrary.js index 6a40c61ab3..1b32c02e96 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary.js @@ -29,7 +29,6 @@ import { getTrad } from '../../utils'; import { PaginationFooter } from '../../components/PaginationFooter'; import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions'; import { EmptyAssets } from '../../components/EmptyAssets'; -import { useFolderStructure } from '../../hooks/useFolderStructure'; import { BulkActions } from './components/BulkActions'; import { Filters } from './components/Filters'; import { Header } from './components/Header'; diff --git a/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js b/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js index 7e1e465e6a..5d3a4f7b2d 100644 --- a/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js +++ b/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js @@ -1,16 +1,20 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; +import isEmpty from 'lodash/isEmpty'; import { useIntl } from 'react-intl'; import { Button } from '@strapi/design-system/Button'; import Folder from '@strapi/icons/Folder'; +import { getAPIInnerErrors } from '@strapi/helper-plugin'; import { BulkMoveDialog } from '../../../components/BulkMoveDialog'; import { AssetDefinition, FolderDefinition } from '../../../constants'; import { useBulkMove } from '../../../hooks/useBulkMove'; +import { getTrad } from '../../../utils'; export const BulkMoveButton = ({ selected, onSuccess }) => { const { formatMessage } = useIntl(); const [showConfirmDialog, setShowConfirmDialog] = useState(false); + const [dialogErrors, setDialogErrors] = useState(null); const { move } = useBulkMove(); const handleConfirmMove = async ({ moved, destinationFolderId } = {}) => { @@ -23,12 +27,23 @@ export const BulkMoveButton = ({ selected, onSuccess }) => { setShowConfirmDialog(false); // eslint-ignore-next-line no-empty } catch (error) { - // TODO: - // - keep dialog open - // - show error message ? + const errors = getAPIInnerErrors(error, { getTrad }); + const formikErrors = Object.entries(errors).reduce((acc, [key, error]) => { + acc[key] = error.defaultMessage; + + return acc; + }, {}); + + if (!isEmpty(formikErrors)) { + setDialogErrors(formikErrors); + } } }; + useEffect(() => { + setShowConfirmDialog(!!dialogErrors); + }, [dialogErrors, setShowConfirmDialog]); + return ( <> - {showConfirmDialog && } + {showConfirmDialog && } ); };