200 lines
10 KiB
JavaScript
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
|