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

200 lines
10 KiB
JavaScript

import { jsx, jsxs } from 'react/jsx-runtime';
import 'react';
import { useNotification, useAPIErrorHandler, useQueryParams, useRBAC, isFetchError } from '@strapi/admin/strapi-admin';
import { Modal, Flex, Box, Field, SingleSelect, SingleSelectOption, Button } from '@strapi/design-system';
import { Formik, Form } from 'formik';
import { useIntl } from 'react-intl';
import { PERMISSIONS } from '../constants.mjs';
import { useGetReleasesQuery, useCreateManyReleaseActionsMutation } from '../services/release.mjs';
import { RELEASE_ACTION_FORM_SCHEMA, INITIAL_VALUES, NoReleases } from './ReleaseActionModal.mjs';
import { ReleaseActionOptions } from './ReleaseActionOptions.mjs';
const getContentPermissions = (subject)=>{
const permissions = {
publish: [
{
action: 'plugin::content-manager.explorer.publish',
subject,
id: '',
actionParameters: {},
properties: {},
conditions: []
}
]
};
return permissions;
};
const ReleaseAction = ({ documents, model })=>{
const { formatMessage } = useIntl();
const { toggleNotification } = useNotification();
const { formatAPIError } = useAPIErrorHandler();
const [{ query }] = useQueryParams();
const contentPermissions = getContentPermissions(model);
const { allowedActions: { canPublish } } = useRBAC(contentPermissions);
const { allowedActions: { canCreate } } = useRBAC(PERMISSIONS);
// Get all the releases not published
const response = useGetReleasesQuery();
const releases = response.data?.data;
const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
const documentIds = documents.map((doc)=>doc.documentId);
const handleSubmit = async (values)=>{
const locale = query.plugins?.i18n?.locale;
const releaseActionEntries = documentIds.map((entryDocumentId)=>({
type: values.type,
contentType: model,
entryDocumentId,
locale
}));
const response = await createManyReleaseActions({
body: releaseActionEntries,
params: {
releaseId: values.releaseId
}
});
if ('data' in response) {
// Handle success
const notificationMessage = formatMessage({
id: 'content-releases.content-manager-list-view.add-to-release.notification.success.message',
defaultMessage: '{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release.'
}, {
entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,
totalEntries: response.data.meta.totalEntries
});
const notification = {
type: 'success',
title: formatMessage({
id: 'content-releases.content-manager-list-view.add-to-release.notification.success.title',
defaultMessage: 'Successfully added to release.'
}, {
entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,
totalEntries: response.data.meta.totalEntries
}),
message: response.data.meta.entriesAlreadyInRelease ? notificationMessage : ''
};
toggleNotification(notification);
return true;
}
if ('error' in response) {
if (isFetchError(response.error)) {
// Handle fetch error
toggleNotification({
type: 'warning',
message: formatAPIError(response.error)
});
} else {
// Handle generic error
toggleNotification({
type: 'warning',
message: formatMessage({
id: 'notification.error',
defaultMessage: 'An error occurred'
})
});
}
}
};
if (!canCreate || !canPublish) return null;
return {
actionType: 'release',
variant: 'tertiary',
label: formatMessage({
id: 'content-manager-list-view.add-to-release',
defaultMessage: 'Add to Release'
}),
dialog: {
type: 'modal',
title: formatMessage({
id: 'content-manager-list-view.add-to-release',
defaultMessage: 'Add to Release'
}),
content: ({ onClose })=>{
return /*#__PURE__*/ jsx(Formik, {
onSubmit: async (values)=>{
const data = await handleSubmit(values);
if (data) {
return onClose();
}
},
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
initialValues: INITIAL_VALUES,
children: ({ values, setFieldValue })=>/*#__PURE__*/ jsxs(Form, {
children: [
releases?.length === 0 ? /*#__PURE__*/ jsx(NoReleases, {}) : /*#__PURE__*/ jsx(Modal.Body, {
children: /*#__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-list-view.add-to-release.select-label',
defaultMessage: 'Select a release'
})
}),
/*#__PURE__*/ jsx(SingleSelect, {
placeholder: formatMessage({
id: 'content-releases.content-manager-list-view.add-to-release.select-placeholder',
defaultMessage: 'Select'
}),
onChange: (value)=>setFieldValue('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-list-view.add-to-release.action-type-label',
defaultMessage: 'What do you want to do with these entries?'
})
}),
/*#__PURE__*/ jsx(ReleaseActionOptions, {
selected: values.type,
handleChange: (e)=>setFieldValue('type', e.target.value),
name: "type"
})
]
})
}),
/*#__PURE__*/ jsxs(Modal.Footer, {
children: [
/*#__PURE__*/ jsx(Button, {
onClick: onClose,
variant: "tertiary",
name: "cancel",
children: formatMessage({
id: 'content-releases.content-manager-list-view.add-to-release.cancel-button',
defaultMessage: 'Cancel'
})
}),
/*#__PURE__*/ jsx(Button, {
type: "submit",
disabled: !values.releaseId,
loading: isLoading,
children: formatMessage({
id: 'content-releases.content-manager-list-view.add-to-release.continue-button',
defaultMessage: 'Continue'
})
})
]
})
]
})
});
}
}
};
};
export { ReleaseAction };
//# sourceMappingURL=ReleaseAction.mjs.map