mirror of
https://github.com/strapi/strapi.git
synced 2025-10-28 00:22:51 +00:00
feat(content-releases): Release delete action (#19049)
* implement the delete action * fix missing prop * fix type errors * add translation
This commit is contained in:
parent
75149a8fce
commit
ac2c8acb7e
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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?"
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user