Files
pole-book/server/node_modules/@strapi/content-releases/dist/admin/components/ReleaseActionModal.mjs

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