245 lines
10 KiB
JavaScript
245 lines
10 KiB
JavaScript
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
import 'react';
|
|
import { useRBAC, useNotification, useAPIErrorHandler, useQueryParams, isFetchError } from '@strapi/admin/strapi-admin';
|
|
import { unstable_useDocumentLayout } from '@strapi/content-manager/strapi-admin';
|
|
import { Modal, Button, EmptyStateLayout, LinkButton, Flex, Box, Field, SingleSelect, SingleSelectOption } from '@strapi/design-system';
|
|
import { PaperPlane } from '@strapi/icons';
|
|
import { EmptyDocuments } from '@strapi/icons/symbols';
|
|
import { useFormik } from 'formik';
|
|
import { useIntl } from 'react-intl';
|
|
import { Link } from 'react-router-dom';
|
|
import * as yup from 'yup';
|
|
import { PERMISSIONS } from '../constants.mjs';
|
|
import { useCreateReleaseActionMutation, useGetReleasesForEntryQuery } from '../services/release.mjs';
|
|
import { ReleaseActionOptions } from './ReleaseActionOptions.mjs';
|
|
|
|
/* -------------------------------------------------------------------------------------------------
|
|
* AddActionToReleaseModal
|
|
* -----------------------------------------------------------------------------------------------*/ const RELEASE_ACTION_FORM_SCHEMA = yup.object().shape({
|
|
type: yup.string().oneOf([
|
|
'publish',
|
|
'unpublish'
|
|
]).required(),
|
|
releaseId: yup.string().required()
|
|
});
|
|
const INITIAL_VALUES = {
|
|
type: 'publish',
|
|
releaseId: ''
|
|
};
|
|
const NoReleases = ()=>{
|
|
const { formatMessage } = useIntl();
|
|
return /*#__PURE__*/ jsx(EmptyStateLayout, {
|
|
icon: /*#__PURE__*/ jsx(EmptyDocuments, {
|
|
width: "16rem"
|
|
}),
|
|
content: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.no-releases-message',
|
|
defaultMessage: 'No available releases. Open the list of releases and create a new one from there.'
|
|
}),
|
|
action: /*#__PURE__*/ jsx(LinkButton, {
|
|
to: {
|
|
pathname: '/plugins/content-releases'
|
|
},
|
|
tag: Link,
|
|
variant: "secondary",
|
|
children: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.redirect-button',
|
|
defaultMessage: 'Open the list of releases'
|
|
})
|
|
}),
|
|
shadow: "none"
|
|
});
|
|
};
|
|
const AddActionToReleaseModal = ({ contentType, documentId, onInputChange, values })=>{
|
|
const { formatMessage } = useIntl();
|
|
const [{ query }] = useQueryParams();
|
|
const locale = query.plugins?.i18n?.locale;
|
|
// Get all 'pending' releases that do not have the entry attached
|
|
const response = useGetReleasesForEntryQuery({
|
|
contentType,
|
|
entryDocumentId: documentId,
|
|
hasEntryAttached: false,
|
|
locale
|
|
});
|
|
const releases = response.data?.data;
|
|
if (releases?.length === 0) {
|
|
return /*#__PURE__*/ jsx(NoReleases, {});
|
|
}
|
|
return /*#__PURE__*/ jsxs(Flex, {
|
|
direction: "column",
|
|
alignItems: "stretch",
|
|
gap: 2,
|
|
children: [
|
|
/*#__PURE__*/ jsx(Box, {
|
|
paddingBottom: 6,
|
|
children: /*#__PURE__*/ jsxs(Field.Root, {
|
|
required: true,
|
|
children: [
|
|
/*#__PURE__*/ jsx(Field.Label, {
|
|
children: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.select-label',
|
|
defaultMessage: 'Select a release'
|
|
})
|
|
}),
|
|
/*#__PURE__*/ jsx(SingleSelect, {
|
|
required: true,
|
|
placeholder: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.select-placeholder',
|
|
defaultMessage: 'Select'
|
|
}),
|
|
name: "releaseId",
|
|
onChange: (value)=>onInputChange('releaseId', value),
|
|
value: values.releaseId,
|
|
children: releases?.map((release)=>/*#__PURE__*/ jsx(SingleSelectOption, {
|
|
value: release.id,
|
|
children: release.name
|
|
}, release.id))
|
|
})
|
|
]
|
|
})
|
|
}),
|
|
/*#__PURE__*/ jsx(Field.Label, {
|
|
children: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.action-type-label',
|
|
defaultMessage: 'What do you want to do with this entry?'
|
|
})
|
|
}),
|
|
/*#__PURE__*/ jsx(ReleaseActionOptions, {
|
|
selected: values.type,
|
|
handleChange: (e)=>onInputChange('type', e.target.value),
|
|
name: "type"
|
|
})
|
|
]
|
|
});
|
|
};
|
|
/* -------------------------------------------------------------------------------------------------
|
|
* ReleaseActionModalForm
|
|
* -----------------------------------------------------------------------------------------------*/ const ReleaseActionModalForm = ({ documentId, document, model, collectionType })=>{
|
|
const { formatMessage } = useIntl();
|
|
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
const { canCreateAction } = allowedActions;
|
|
const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
|
|
const { toggleNotification } = useNotification();
|
|
const { formatAPIError } = useAPIErrorHandler();
|
|
const [{ query }] = useQueryParams();
|
|
const locale = query.plugins?.i18n?.locale;
|
|
const handleSubmit = async (e, onClose)=>{
|
|
try {
|
|
await formik.handleSubmit(e);
|
|
onClose();
|
|
} catch (error) {
|
|
if (isFetchError(error)) {
|
|
// Handle axios error
|
|
toggleNotification({
|
|
type: 'danger',
|
|
message: formatAPIError(error)
|
|
});
|
|
} else {
|
|
// Handle generic error
|
|
toggleNotification({
|
|
type: 'danger',
|
|
message: formatMessage({
|
|
id: 'notification.error',
|
|
defaultMessage: 'An error occurred'
|
|
})
|
|
});
|
|
}
|
|
}
|
|
};
|
|
const formik = useFormik({
|
|
initialValues: INITIAL_VALUES,
|
|
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
|
|
onSubmit: async (values)=>{
|
|
if (collectionType === 'collection-types' && !documentId) {
|
|
throw new Error('Document id is required');
|
|
}
|
|
const response = await createReleaseAction({
|
|
body: {
|
|
type: values.type,
|
|
contentType: model,
|
|
entryDocumentId: documentId,
|
|
locale
|
|
},
|
|
params: {
|
|
releaseId: values.releaseId
|
|
}
|
|
});
|
|
if ('data' in response) {
|
|
// Handle success
|
|
toggleNotification({
|
|
type: 'success',
|
|
message: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.notification.success',
|
|
defaultMessage: 'Entry added to release'
|
|
})
|
|
});
|
|
return;
|
|
}
|
|
if ('error' in response) {
|
|
throw response.error;
|
|
}
|
|
}
|
|
});
|
|
const { edit: { options } } = unstable_useDocumentLayout(model);
|
|
// Project is not EE or contentType does not have draftAndPublish enabled
|
|
if (!window.strapi.isEE || !options?.draftAndPublish || !canCreateAction) {
|
|
return null;
|
|
}
|
|
if (collectionType === 'collection-types' && (!documentId || documentId === 'create')) {
|
|
return null;
|
|
}
|
|
return {
|
|
label: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release',
|
|
defaultMessage: 'Add to release'
|
|
}),
|
|
icon: /*#__PURE__*/ jsx(PaperPlane, {}),
|
|
// Entry is creating so we don't want to allow adding it to a release
|
|
disabled: !document,
|
|
position: [
|
|
'panel',
|
|
'table-row'
|
|
],
|
|
dialog: {
|
|
type: 'modal',
|
|
title: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release',
|
|
defaultMessage: 'Add to release'
|
|
}),
|
|
content: /*#__PURE__*/ jsx(AddActionToReleaseModal, {
|
|
contentType: model,
|
|
documentId: documentId,
|
|
onInputChange: formik.setFieldValue,
|
|
values: formik.values
|
|
}),
|
|
footer: ({ onClose })=>/*#__PURE__*/ jsxs(Modal.Footer, {
|
|
children: [
|
|
/*#__PURE__*/ jsx(Button, {
|
|
onClick: onClose,
|
|
variant: "tertiary",
|
|
name: "cancel",
|
|
children: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.cancel-button',
|
|
defaultMessage: 'Cancel'
|
|
})
|
|
}),
|
|
/*#__PURE__*/ jsx(Button, {
|
|
type: "submit",
|
|
// @ts-expect-error - formik ReactEvent types don't match button onClick types as they expect a MouseEvent
|
|
onClick: (e)=>handleSubmit(e, onClose),
|
|
disabled: !formik.values.releaseId,
|
|
loading: isLoading,
|
|
children: formatMessage({
|
|
id: 'content-releases.content-manager-edit-view.add-to-release.continue-button',
|
|
defaultMessage: 'Continue'
|
|
})
|
|
})
|
|
]
|
|
})
|
|
}
|
|
};
|
|
};
|
|
|
|
export { INITIAL_VALUES, NoReleases, RELEASE_ACTION_FORM_SCHEMA, ReleaseActionModalForm };
|
|
//# sourceMappingURL=ReleaseActionModal.mjs.map
|