feat(content-releases): Release delete action (#19049)

* implement the delete action

* fix missing prop

* fix type errors

* add translation
This commit is contained in:
Simone 2023-12-14 16:00:45 +01:00 committed by GitHub
parent 75149a8fce
commit ac2c8acb7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 13 deletions

View File

@ -26,10 +26,11 @@ import {
useAPIErrorHandler, useAPIErrorHandler,
useNotification, useNotification,
useQueryParams, useQueryParams,
ConfirmDialog,
} from '@strapi/helper-plugin'; } from '@strapi/helper-plugin';
import { ArrowLeft, EmptyDocuments, More, Pencil, Trash } from '@strapi/icons'; import { ArrowLeft, EmptyDocuments, More, Pencil, Trash } from '@strapi/icons';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { useParams } from 'react-router-dom'; import { useParams, useHistory } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import { ReleaseActionOptions } from '../components/ReleaseActionOptions'; import { ReleaseActionOptions } from '../components/ReleaseActionOptions';
@ -43,6 +44,7 @@ import {
useUpdateReleaseMutation, useUpdateReleaseMutation,
useUpdateReleaseActionMutation, useUpdateReleaseActionMutation,
usePublishReleaseMutation, usePublishReleaseMutation,
useDeleteReleaseMutation,
} from '../services/release'; } from '../services/release';
import type { ReleaseAction } from '../../../shared/contracts/release-actions'; import type { ReleaseAction } from '../../../shared/contracts/release-actions';
@ -102,11 +104,13 @@ const PopoverButton = ({ onClick, children }: PopoverButtonProps) => {
interface ReleaseDetailsLayoutProps { interface ReleaseDetailsLayoutProps {
toggleEditReleaseModal: () => void; toggleEditReleaseModal: () => void;
toggleWarningSubmit: () => void;
children: React.ReactNode; children: React.ReactNode;
} }
export const ReleaseDetailsLayout = ({ export const ReleaseDetailsLayout = ({
toggleEditReleaseModal, toggleEditReleaseModal,
toggleWarningSubmit,
children, children,
}: ReleaseDetailsLayoutProps) => { }: ReleaseDetailsLayoutProps) => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
@ -156,6 +160,11 @@ export const ReleaseDetailsLayout = ({
} }
}; };
const openWarningConfirmDialog = () => {
toggleWarningSubmit();
handleTogglePopover();
};
if (isLoadingDetails) { if (isLoadingDetails) {
return ( return (
<Main aria-busy={isLoadingDetails}> <Main aria-busy={isLoadingDetails}>
@ -237,15 +246,17 @@ export const ReleaseDetailsLayout = ({
</Typography> </Typography>
</PopoverButton> </PopoverButton>
</CheckPermissions> </CheckPermissions>
<PopoverButton> <CheckPermissions permissions={PERMISSIONS.delete}>
<TrashIcon /> <PopoverButton onClick={openWarningConfirmDialog}>
<Typography ellipsis textColor="danger600"> <TrashIcon />
{formatMessage({ <Typography ellipsis textColor="danger600">
id: 'content-releases.header.actions.delete', {formatMessage({
defaultMessage: 'Delete', id: 'content-releases.header.actions.delete',
})} defaultMessage: 'Delete',
</Typography> })}
</PopoverButton> </Typography>
</PopoverButton>
</CheckPermissions>
</Flex> </Flex>
<ReleaseInfoWrapper <ReleaseInfoWrapper
direction="column" direction="column"
@ -501,7 +512,9 @@ const ReleaseDetailsPage = () => {
const { releaseId } = useParams<{ releaseId: string }>(); const { releaseId } = useParams<{ releaseId: string }>();
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const { formatAPIError } = useAPIErrorHandler(); const { formatAPIError } = useAPIErrorHandler();
const { push } = useHistory();
const [releaseModalShown, setReleaseModalShown] = React.useState(false); const [releaseModalShown, setReleaseModalShown] = React.useState(false);
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
const { const {
isLoading: isLoadingDetails, isLoading: isLoadingDetails,
@ -509,14 +522,20 @@ const ReleaseDetailsPage = () => {
isSuccess: isSuccessDetails, isSuccess: isSuccessDetails,
} = useGetReleaseQuery({ id: releaseId }); } = useGetReleaseQuery({ id: releaseId });
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation(); const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
const toggleEditReleaseModal = () => { const toggleEditReleaseModal = () => {
setReleaseModalShown((prev) => !prev); setReleaseModalShown((prev) => !prev);
}; };
const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
if (isLoadingDetails) { if (isLoadingDetails) {
return ( return (
<ReleaseDetailsLayout toggleEditReleaseModal={toggleEditReleaseModal}> <ReleaseDetailsLayout
toggleEditReleaseModal={toggleEditReleaseModal}
toggleWarningSubmit={toggleWarningSubmit}
>
<ContentLayout> <ContentLayout>
<LoadingIndicatorPage /> <LoadingIndicatorPage />
</ContentLayout> </ContentLayout>
@ -558,8 +577,33 @@ const ReleaseDetailsPage = () => {
toggleEditReleaseModal(); 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 ( return (
<ReleaseDetailsLayout toggleEditReleaseModal={toggleEditReleaseModal}> <ReleaseDetailsLayout
toggleEditReleaseModal={toggleEditReleaseModal}
toggleWarningSubmit={toggleWarningSubmit}
>
<ReleaseDetailsBody /> <ReleaseDetailsBody />
{releaseModalShown && ( {releaseModalShown && (
<ReleaseModal <ReleaseModal
@ -569,6 +613,16 @@ const ReleaseDetailsPage = () => {
initialValues={{ name: title || '' }} initialValues={{ name: title || '' }}
/> />
)} )}
<ConfirmDialog
bodyText={{
id: 'content-releases.dialog.confirmation-message',
defaultMessage: 'Are you sure you want to delete this release?',
}}
isOpen={showWarningSubmit}
isConfirmButtonLoading={isDeletingRelease}
onToggleDialog={toggleWarningSubmit}
onConfirm={handleDeleteRelease}
/>
</ReleaseDetailsLayout> </ReleaseDetailsLayout>
); );
}; };

View File

@ -14,6 +14,7 @@ import type {
} from '../../../shared/contracts/release-actions'; } from '../../../shared/contracts/release-actions';
import type { import type {
CreateRelease, CreateRelease,
DeleteRelease,
GetContentTypeEntryReleases, GetContentTypeEntryReleases,
GetReleases, GetReleases,
UpdateRelease, UpdateRelease,
@ -230,6 +231,15 @@ const releaseApi = createApi({
}, },
invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }], invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],
}), }),
deleteRelease: build.mutation<DeleteRelease.Response, DeleteRelease.Request['params']>({
query({ id }) {
return {
url: `/content-releases/${id}`,
method: 'DELETE',
};
},
invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],
}),
}; };
}, },
}); });
@ -245,6 +255,7 @@ const {
useUpdateReleaseActionMutation, useUpdateReleaseActionMutation,
usePublishReleaseMutation, usePublishReleaseMutation,
useDeleteReleaseActionMutation, useDeleteReleaseActionMutation,
useDeleteReleaseMutation,
} = releaseApi; } = releaseApi;
export { export {
@ -258,5 +269,6 @@ export {
useUpdateReleaseActionMutation, useUpdateReleaseActionMutation,
usePublishReleaseMutation, usePublishReleaseMutation,
useDeleteReleaseActionMutation, useDeleteReleaseActionMutation,
useDeleteReleaseMutation,
releaseApi, releaseApi,
}; };

View File

@ -38,5 +38,6 @@
"page.ReleaseDetails.table.header.label.content-type": "content-type", "page.ReleaseDetails.table.header.label.content-type": "content-type",
"page.ReleaseDetails.table.header.label.action": "action", "page.ReleaseDetails.table.header.label.action": "action",
"page.ReleaseDetails.table.action-published": "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.", "page.ReleaseDetails.table.action-published": "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.",
"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?"
} }