From ac2c8acb7edc91c178bf9bce27eb36329e16621a Mon Sep 17 00:00:00 2001 From: Simone Date: Thu, 14 Dec 2023 16:00:45 +0100 Subject: [PATCH] feat(content-releases): Release delete action (#19049) * implement the delete action * fix missing prop * fix type errors * add translation --- .../admin/src/pages/ReleaseDetailsPage.tsx | 78 ++++++++++++++++--- .../admin/src/services/release.ts | 12 +++ .../admin/src/translations/en.json | 3 +- 3 files changed, 80 insertions(+), 13 deletions(-) diff --git a/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx b/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx index ea1b77c077..030eb48db5 100644 --- a/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx +++ b/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx @@ -26,10 +26,11 @@ import { useAPIErrorHandler, useNotification, useQueryParams, + ConfirmDialog, } from '@strapi/helper-plugin'; import { ArrowLeft, EmptyDocuments, More, Pencil, Trash } from '@strapi/icons'; import { useIntl } from 'react-intl'; -import { useParams } from 'react-router-dom'; +import { useParams, useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { ReleaseActionOptions } from '../components/ReleaseActionOptions'; @@ -43,6 +44,7 @@ import { useUpdateReleaseMutation, useUpdateReleaseActionMutation, usePublishReleaseMutation, + useDeleteReleaseMutation, } from '../services/release'; import type { ReleaseAction } from '../../../shared/contracts/release-actions'; @@ -102,11 +104,13 @@ const PopoverButton = ({ onClick, children }: PopoverButtonProps) => { interface ReleaseDetailsLayoutProps { toggleEditReleaseModal: () => void; + toggleWarningSubmit: () => void; children: React.ReactNode; } export const ReleaseDetailsLayout = ({ toggleEditReleaseModal, + toggleWarningSubmit, children, }: ReleaseDetailsLayoutProps) => { const { formatMessage } = useIntl(); @@ -156,6 +160,11 @@ export const ReleaseDetailsLayout = ({ } }; + const openWarningConfirmDialog = () => { + toggleWarningSubmit(); + handleTogglePopover(); + }; + if (isLoadingDetails) { return (
@@ -237,15 +246,17 @@ export const ReleaseDetailsLayout = ({ - - - - {formatMessage({ - id: 'content-releases.header.actions.delete', - defaultMessage: 'Delete', - })} - - + + + + + {formatMessage({ + id: 'content-releases.header.actions.delete', + defaultMessage: 'Delete', + })} + + + { const { releaseId } = useParams<{ releaseId: string }>(); const toggleNotification = useNotification(); const { formatAPIError } = useAPIErrorHandler(); + const { push } = useHistory(); const [releaseModalShown, setReleaseModalShown] = React.useState(false); + const [showWarningSubmit, setWarningSubmit] = React.useState(false); const { isLoading: isLoadingDetails, @@ -509,14 +522,20 @@ const ReleaseDetailsPage = () => { isSuccess: isSuccessDetails, } = useGetReleaseQuery({ id: releaseId }); const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation(); + const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation(); const toggleEditReleaseModal = () => { setReleaseModalShown((prev) => !prev); }; + const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState); + if (isLoadingDetails) { return ( - + @@ -558,8 +577,33 @@ const ReleaseDetailsPage = () => { toggleEditReleaseModal(); }; + const handleDeleteRelease = async () => { + const response = await deleteRelease({ + id: releaseId, + }); + + if ('data' in response) { + push('/plugins/content-releases'); + } else if (isAxiosError(response.error)) { + // When the response returns an object with 'error', handle axios error + toggleNotification({ + type: 'warning', + message: formatAPIError(response.error), + }); + } else { + // Otherwise, the response returns an object with 'error', handle a generic error + toggleNotification({ + type: 'warning', + message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }), + }); + } + }; + return ( - + {releaseModalShown && ( { initialValues={{ name: title || '' }} /> )} + ); }; diff --git a/packages/core/content-releases/admin/src/services/release.ts b/packages/core/content-releases/admin/src/services/release.ts index eecf877fcf..5a1bce7813 100644 --- a/packages/core/content-releases/admin/src/services/release.ts +++ b/packages/core/content-releases/admin/src/services/release.ts @@ -14,6 +14,7 @@ import type { } from '../../../shared/contracts/release-actions'; import type { CreateRelease, + DeleteRelease, GetContentTypeEntryReleases, GetReleases, UpdateRelease, @@ -230,6 +231,15 @@ const releaseApi = createApi({ }, invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }], }), + deleteRelease: build.mutation({ + query({ id }) { + return { + url: `/content-releases/${id}`, + method: 'DELETE', + }; + }, + invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }], + }), }; }, }); @@ -245,6 +255,7 @@ const { useUpdateReleaseActionMutation, usePublishReleaseMutation, useDeleteReleaseActionMutation, + useDeleteReleaseMutation, } = releaseApi; export { @@ -258,5 +269,6 @@ export { useUpdateReleaseActionMutation, usePublishReleaseMutation, useDeleteReleaseActionMutation, + useDeleteReleaseMutation, releaseApi, }; diff --git a/packages/core/content-releases/admin/src/translations/en.json b/packages/core/content-releases/admin/src/translations/en.json index 448c57ea7b..7d4996a751 100644 --- a/packages/core/content-releases/admin/src/translations/en.json +++ b/packages/core/content-releases/admin/src/translations/en.json @@ -38,5 +38,6 @@ "page.ReleaseDetails.table.header.label.content-type": "content-type", "page.ReleaseDetails.table.header.label.action": "action", "page.ReleaseDetails.table.action-published": "This entry was {isPublish, select, true {published} other {unpublished}}.", - "pages.ReleaseDetails.publish-notification-success": "Release was published successfully." + "pages.ReleaseDetails.publish-notification-success": "Release was published successfully.", + "dialog.confirmation-message": "Are you sure you want to delete this release?" }