@strapi/content-releases 4.16.2 → 4.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/_chunks/{App-b83f4a97.mjs → App-g2P5kbSm.mjs} +341 -171
  2. package/dist/_chunks/App-g2P5kbSm.mjs.map +1 -0
  3. package/dist/_chunks/{App-b6df6b60.js → App-o5_WfqR-.js} +337 -167
  4. package/dist/_chunks/App-o5_WfqR-.js.map +1 -0
  5. package/dist/_chunks/{en-b5dfabe6.js → en-haKSQIo8.js} +19 -4
  6. package/dist/_chunks/en-haKSQIo8.js.map +1 -0
  7. package/dist/_chunks/{en-d837b82d.mjs → en-ngTk74JV.mjs} +19 -4
  8. package/dist/_chunks/en-ngTk74JV.mjs.map +1 -0
  9. package/dist/_chunks/{index-28e99164.js → index-EdBmRHRU.js} +96 -31
  10. package/dist/_chunks/index-EdBmRHRU.js.map +1 -0
  11. package/dist/_chunks/{index-c39292e3.mjs → index-XAQOX_IB.mjs} +101 -36
  12. package/dist/_chunks/index-XAQOX_IB.mjs.map +1 -0
  13. package/dist/admin/index.js +2 -2
  14. package/dist/admin/index.mjs +3 -3
  15. package/dist/server/index.js +60 -35
  16. package/dist/server/index.js.map +1 -1
  17. package/dist/server/index.mjs +58 -35
  18. package/dist/server/index.mjs.map +1 -1
  19. package/package.json +11 -10
  20. package/dist/_chunks/App-b6df6b60.js.map +0 -1
  21. package/dist/_chunks/App-b83f4a97.mjs.map +0 -1
  22. package/dist/_chunks/en-b5dfabe6.js.map +0 -1
  23. package/dist/_chunks/en-d837b82d.mjs.map +0 -1
  24. package/dist/_chunks/index-28e99164.js.map +0 -1
  25. package/dist/_chunks/index-c39292e3.mjs.map +0 -1
  26. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  27. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -7
  28. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -8
  29. package/dist/admin/src/components/ReleaseModal.d.ts +0 -11
  30. package/dist/admin/src/constants.d.ts +0 -13
  31. package/dist/admin/src/index.d.ts +0 -3
  32. package/dist/admin/src/pages/App.d.ts +0 -1
  33. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -10
  34. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -11
  35. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -104
  36. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -38
  37. package/dist/admin/src/pluginId.d.ts +0 -1
  38. package/dist/admin/src/services/axios.d.ts +0 -29
  39. package/dist/admin/src/services/release.d.ts +0 -348
  40. package/dist/server/src/constants.d.ts +0 -9
  41. package/dist/server/src/constants.d.ts.map +0 -1
  42. package/dist/server/src/content-types/index.d.ts +0 -82
  43. package/dist/server/src/content-types/index.d.ts.map +0 -1
  44. package/dist/server/src/content-types/release/index.d.ts +0 -37
  45. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  46. package/dist/server/src/content-types/release/schema.d.ts +0 -36
  47. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  48. package/dist/server/src/content-types/release-action/index.d.ts +0 -44
  49. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  50. package/dist/server/src/content-types/release-action/schema.d.ts +0 -43
  51. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  52. package/dist/server/src/controllers/index.d.ts +0 -18
  53. package/dist/server/src/controllers/index.d.ts.map +0 -1
  54. package/dist/server/src/controllers/release-action.d.ts +0 -9
  55. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  56. package/dist/server/src/controllers/release.d.ts +0 -11
  57. package/dist/server/src/controllers/release.d.ts.map +0 -1
  58. package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
  59. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  60. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  61. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  62. package/dist/server/src/index.d.ts +0 -301
  63. package/dist/server/src/index.d.ts.map +0 -1
  64. package/dist/server/src/register.d.ts +0 -5
  65. package/dist/server/src/register.d.ts.map +0 -1
  66. package/dist/server/src/routes/index.d.ts +0 -35
  67. package/dist/server/src/routes/index.d.ts.map +0 -1
  68. package/dist/server/src/routes/release-action.d.ts +0 -18
  69. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  70. package/dist/server/src/routes/release.d.ts +0 -18
  71. package/dist/server/src/routes/release.d.ts.map +0 -1
  72. package/dist/server/src/services/index.d.ts +0 -77
  73. package/dist/server/src/services/index.d.ts.map +0 -1
  74. package/dist/server/src/services/release.d.ts +0 -55
  75. package/dist/server/src/services/release.d.ts.map +0 -1
  76. package/dist/server/src/services/validation.d.ts +0 -10
  77. package/dist/server/src/services/validation.d.ts.map +0 -1
  78. package/dist/server/src/utils/index.d.ts +0 -4
  79. package/dist/server/src/utils/index.d.ts.map +0 -1
  80. package/dist/shared/contracts/release-actions.d.ts +0 -95
  81. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  82. package/dist/shared/contracts/releases.d.ts +0 -153
  83. package/dist/shared/contracts/releases.d.ts.map +0 -1
  84. package/dist/shared/types.d.ts +0 -24
  85. package/dist/shared/types.d.ts.map +0 -1
  86. package/dist/shared/validation-schemas.d.ts +0 -2
  87. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App-o5_WfqR-.js","sources":["../../shared/validation-schemas.ts","../../admin/src/components/ReleaseModal.tsx","../../admin/src/pages/ReleaseDetailsPage.tsx","../../admin/src/pages/ReleasesPage.tsx","../../admin/src/pages/App.tsx"],"sourcesContent":["import * as yup from 'yup';\n\nexport const RELEASE_SCHEMA = yup\n .object()\n .shape({\n name: yup.string().trim().required(),\n })\n .required()\n .noUnknown();\n","import {\n Button,\n ModalBody,\n ModalFooter,\n ModalLayout,\n ModalHeader,\n TextInput,\n Typography,\n} from '@strapi/design-system';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { RELEASE_SCHEMA } from '../../../shared/validation-schemas';\nimport { pluginId } from '../pluginId';\n\nexport interface FormValues {\n name: string;\n}\n\ninterface ReleaseModalProps {\n handleClose: () => void;\n handleSubmit: (values: FormValues) => void;\n isLoading?: boolean;\n initialValues: FormValues;\n}\n\nexport const ReleaseModal = ({\n handleClose,\n handleSubmit,\n initialValues,\n isLoading = false,\n}: ReleaseModalProps) => {\n const { formatMessage } = useIntl();\n const { pathname } = useLocation();\n const isCreatingRelease = pathname === `/plugins/${pluginId}`;\n\n return (\n <ModalLayout onClose={handleClose} labelledBy=\"title\">\n <ModalHeader>\n <Typography id=\"title\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage(\n {\n id: 'content-releases.modal.title',\n defaultMessage:\n '{isCreatingRelease, select, true {New release} other {Edit release}}',\n },\n { isCreatingRelease: isCreatingRelease }\n )}\n </Typography>\n </ModalHeader>\n <Formik\n validateOnChange={false}\n onSubmit={handleSubmit}\n initialValues={initialValues}\n validationSchema={RELEASE_SCHEMA}\n >\n {({ values, errors, handleChange }) => (\n <Form>\n <ModalBody>\n <TextInput\n label={formatMessage({\n id: 'content-releases.modal.form.input.label.release-name',\n defaultMessage: 'Name',\n })}\n name=\"name\"\n value={values.name}\n error={errors.name}\n onChange={handleChange}\n required\n />\n </ModalBody>\n <ModalFooter\n startActions={\n <Button onClick={handleClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n }\n endActions={\n <Button\n name=\"submit\"\n loading={isLoading}\n disabled={!values.name || values.name === initialValues.name}\n type=\"submit\"\n >\n {formatMessage(\n {\n id: 'content-releases.modal.form.button.submit',\n defaultMessage: '{isCreatingRelease, select, true {Continue} other {Save}}',\n },\n { isCreatingRelease: isCreatingRelease }\n )}\n </Button>\n }\n />\n </Form>\n )}\n </Formik>\n </ModalLayout>\n );\n};\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n HeaderLayout,\n IconButton,\n Link,\n Main,\n Popover,\n Tr,\n Td,\n Typography,\n Badge,\n SingleSelect,\n SingleSelectOption,\n Icon,\n} from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n CheckPermissions,\n LoadingIndicatorPage,\n NoContent,\n PageSizeURLQuery,\n PaginationURLQuery,\n RelativeTime,\n Table,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n ConfirmDialog,\n useRBAC,\n} from '@strapi/helper-plugin';\nimport { ArrowLeft, CheckCircle, More, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useParams, useHistory, Link as ReactRouterLink, Redirect } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { ReleaseActionMenu } from '../components/ReleaseActionMenu';\nimport { ReleaseActionOptions } from '../components/ReleaseActionOptions';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport { isAxiosError } from '../services/axios';\nimport {\n GetReleaseActionsQueryParams,\n useGetReleaseActionsQuery,\n useGetReleaseQuery,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseMutation,\n} from '../services/release';\n\nimport type {\n ReleaseAction,\n ReleaseActionGroupBy,\n} from '../../../shared/contracts/release-actions';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseDetailsLayout\n * -----------------------------------------------------------------------------------------------*/\n// @ts-expect-error – issue with styled-components types.\nconst ReleaseInfoWrapper = styled(Flex)`\n align-self: stretch;\n border-bottom-right-radius: ${({ theme }) => theme.borderRadius};\n border-bottom-left-radius: ${({ theme }) => theme.borderRadius};\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst StyledFlex = styled(Flex)<{ disabled?: boolean }>`\n align-self: stretch;\n cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')};\n\n svg path {\n fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};\n }\n span {\n color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};\n }\n`;\n\nconst PencilIcon = styled(Pencil)`\n width: ${({ theme }) => theme.spaces[4]};\n height: ${({ theme }) => theme.spaces[4]};\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n`;\n\nconst TrashIcon = styled(Trash)`\n width: ${({ theme }) => theme.spaces[4]};\n height: ${({ theme }) => theme.spaces[4]};\n path {\n fill: ${({ theme }) => theme.colors.danger600};\n }\n`;\n\ninterface PopoverButtonProps {\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nconst PopoverButton = ({ onClick, disabled, children }: PopoverButtonProps) => {\n return (\n <StyledFlex\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={4}\n paddingRight={4}\n alignItems=\"center\"\n gap={2}\n as=\"button\"\n hasRadius\n onClick={onClick}\n disabled={disabled}\n >\n {children}\n </StyledFlex>\n );\n};\n\ninterface EntryValidationTextProps {\n status: ReleaseAction['entry']['status'];\n action: ReleaseAction['type'];\n}\n\nconst EntryValidationText = ({ status, action }: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n if (action == 'publish') {\n return (\n <Flex gap={2}>\n <Icon color=\"success600\" as={CheckCircle} />\n {status === 'published' ? (\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',\n defaultMessage: 'Already published',\n })}\n </Typography>\n ) : (\n <Typography>\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </Typography>\n )}\n </Flex>\n );\n }\n\n return (\n <Flex gap={2}>\n <Icon color=\"success600\" as={CheckCircle} />\n {status === 'draft' ? (\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',\n defaultMessage: 'Already unpublished',\n })}\n </Typography>\n ) : (\n <Typography>\n {formatMessage({\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',\n defaultMessage: 'Ready to unpublish',\n })}\n </Typography>\n )}\n </Flex>\n );\n};\ninterface ReleaseDetailsLayoutProps {\n toggleEditReleaseModal: () => void;\n toggleWarningSubmit: () => void;\n children: React.ReactNode;\n}\n\nexport const ReleaseDetailsLayout = ({\n toggleEditReleaseModal,\n toggleWarningSubmit,\n children,\n}: ReleaseDetailsLayoutProps) => {\n const { formatMessage } = useIntl();\n const { releaseId } = useParams<{ releaseId: string }>();\n const [isPopoverVisible, setIsPopoverVisible] = React.useState(false);\n const moreButtonRef = React.useRef<HTMLButtonElement>(null!);\n const {\n data,\n isLoading: isLoadingDetails,\n isError,\n error,\n } = useGetReleaseQuery({ id: releaseId });\n const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const {\n allowedActions: { canUpdate, canDelete },\n } = useRBAC(PERMISSIONS);\n\n const release = data?.data;\n\n const handleTogglePopover = () => {\n setIsPopoverVisible((prev) => !prev);\n };\n\n const openReleaseModal = () => {\n toggleEditReleaseModal();\n handleTogglePopover();\n };\n\n const handlePublishRelease = async () => {\n const response = await publishRelease({ id: releaseId });\n\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.pages.ReleaseDetails.publish-notification-success',\n defaultMessage: 'Release was published successfully.',\n }),\n });\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const openWarningConfirmDialog = () => {\n toggleWarningSubmit();\n handleTogglePopover();\n };\n\n if (isLoadingDetails) {\n return (\n <Main aria-busy={isLoadingDetails}>\n <LoadingIndicatorPage />\n </Main>\n );\n }\n\n if (isError || !release) {\n return (\n <Redirect\n to={{\n pathname: '/plugins/content-releases',\n state: {\n errors: [\n {\n code: error?.code,\n },\n ],\n },\n }}\n />\n );\n }\n\n const totalEntries = release.actions.meta.count || 0;\n const createdBy = release.createdBy.lastname\n ? `${release.createdBy.firstname} ${release.createdBy.lastname}`\n : `${release.createdBy.firstname}`;\n\n return (\n <Main aria-busy={isLoadingDetails}>\n <HeaderLayout\n title={release.name}\n subtitle={formatMessage(\n {\n id: 'content-releases.pages.Details.header-subtitle',\n defaultMessage: '{number, plural, =0 {No entries} one {# entry} other {# entries}}',\n },\n { number: totalEntries }\n )}\n navigationAction={\n <Link startIcon={<ArrowLeft />} to=\"/plugins/content-releases\">\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n primaryAction={\n !release.releasedAt && (\n <Flex gap={2}>\n <IconButton\n label={formatMessage({\n id: 'content-releases.header.actions.open-release-actions',\n defaultMessage: 'Release actions',\n })}\n ref={moreButtonRef}\n onClick={handleTogglePopover}\n >\n <More />\n </IconButton>\n {isPopoverVisible && (\n <Popover\n source={moreButtonRef}\n placement=\"bottom-end\"\n onDismiss={handleTogglePopover}\n spacing={4}\n minWidth=\"242px\"\n >\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\" padding={1}>\n <PopoverButton disabled={!canUpdate} onClick={openReleaseModal}>\n <PencilIcon />\n <Typography ellipsis>\n {formatMessage({\n id: 'content-releases.header.actions.edit',\n defaultMessage: 'Edit',\n })}\n </Typography>\n </PopoverButton>\n <PopoverButton disabled={!canDelete} onClick={openWarningConfirmDialog}>\n <TrashIcon />\n <Typography ellipsis textColor=\"danger600\">\n {formatMessage({\n id: 'content-releases.header.actions.delete',\n defaultMessage: 'Delete',\n })}\n </Typography>\n </PopoverButton>\n </Flex>\n <ReleaseInfoWrapper\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n gap={1}\n padding={5}\n >\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.header.actions.created',\n defaultMessage: 'Created',\n })}\n </Typography>\n <Typography variant=\"pi\" color=\"neutral300\">\n <RelativeTime timestamp={new Date(release.createdAt)} />\n {formatMessage(\n {\n id: 'content-releases.header.actions.created.description',\n defaultMessage: ' by {createdBy}',\n },\n { createdBy }\n )}\n </Typography>\n </ReleaseInfoWrapper>\n </Popover>\n )}\n <CheckPermissions permissions={PERMISSIONS.publish}>\n <Button\n size=\"S\"\n variant=\"default\"\n onClick={handlePublishRelease}\n loading={isPublishing}\n disabled={release.actions.meta.count === 0}\n >\n {formatMessage({\n id: 'content-releases.header.actions.publish',\n defaultMessage: 'Publish',\n })}\n </Button>\n </CheckPermissions>\n </Flex>\n )\n }\n />\n {children}\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseDetailsBody\n * -----------------------------------------------------------------------------------------------*/\nconst GROUP_BY_OPTIONS = ['contentType', 'locale', 'action'] as const;\nconst getGroupByOptionLabel = (value: (typeof GROUP_BY_OPTIONS)[number]) => {\n if (value === 'locale') {\n return {\n id: 'content-releases.pages.ReleaseDetails.groupBy.option.locales',\n defaultMessage: 'Locales',\n };\n }\n\n if (value === 'action') {\n return {\n id: 'content-releases.pages.ReleaseDetails.groupBy.option.actions',\n defaultMessage: 'Actions',\n };\n }\n\n return {\n id: 'content-releases.pages.ReleaseDetails.groupBy.option.content-type',\n defaultMessage: 'Content-Types',\n };\n};\n\nconst ReleaseDetailsBody = () => {\n const { formatMessage } = useIntl();\n const { releaseId } = useParams<{ releaseId: string }>();\n const [{ query }, setQuery] = useQueryParams<GetReleaseActionsQueryParams>();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const {\n data: releaseData,\n isLoading: isReleaseLoading,\n isError: isReleaseError,\n error: releaseError,\n } = useGetReleaseQuery({ id: releaseId });\n\n const release = releaseData?.data;\n const selectedGroupBy = query?.groupBy || 'contentType';\n\n const {\n isLoading,\n isFetching,\n isError,\n data,\n error: releaseActionsError,\n } = useGetReleaseActionsQuery({\n ...query,\n releaseId,\n });\n\n const [updateReleaseAction] = useUpdateReleaseActionMutation();\n\n const handleChangeType = async (\n e: React.ChangeEvent<HTMLInputElement>,\n actionId: ReleaseAction['id']\n ) => {\n const response = await updateReleaseAction({\n params: {\n releaseId,\n actionId,\n },\n body: {\n type: e.target.value as ReleaseAction['type'],\n },\n });\n\n if ('error' in response) {\n if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n if (isLoading || isReleaseLoading) {\n return (\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n );\n }\n\n const releaseActions = data?.data;\n const releaseMeta = data?.meta;\n\n if (isError || isReleaseError || !release || !releaseActions) {\n const errorsArray = [];\n if (releaseError) {\n errorsArray.push({\n code: releaseError.code,\n });\n }\n if (releaseActionsError) {\n errorsArray.push({\n code: releaseActionsError.code,\n });\n }\n return (\n <Redirect\n to={{\n pathname: '/plugins/content-releases',\n state: {\n errors: errorsArray,\n },\n }}\n />\n );\n }\n\n if (Object.keys(releaseActions).length === 0) {\n return (\n <ContentLayout>\n <NoContent\n content={{\n id: 'content-releases.pages.Details.tab.emptyEntries',\n defaultMessage:\n 'This release is empty. Open the Content Manager, select an entry and add it to the release.',\n }}\n action={\n <LinkButton\n as={ReactRouterLink}\n // @ts-expect-error - types are not inferred correctly through the as prop.\n to={{\n pathname: '/content-manager',\n }}\n style={{ textDecoration: 'none' }}\n variant=\"secondary\"\n >\n {formatMessage({\n id: 'content-releases.page.Details.button.openContentManager',\n defaultMessage: 'Open the Content Manager',\n })}\n </LinkButton>\n }\n />\n </ContentLayout>\n );\n }\n\n return (\n <ContentLayout>\n <Flex gap={8} direction=\"column\" alignItems=\"stretch\">\n <Flex>\n <SingleSelect\n aria-label={formatMessage({\n id: 'content-releases.pages.ReleaseDetails.groupBy.label',\n defaultMessage: 'Group by',\n })}\n customizeContent={(value) =>\n formatMessage(\n {\n id: `content-releases.pages.ReleaseDetails.groupBy.label`,\n defaultMessage: `Group by {groupBy}`,\n },\n {\n groupBy: value,\n }\n )\n }\n value={formatMessage(getGroupByOptionLabel(selectedGroupBy))}\n onChange={(value) => setQuery({ groupBy: value as ReleaseActionGroupBy })}\n >\n {GROUP_BY_OPTIONS.map((option) => (\n <SingleSelectOption key={option} value={option}>\n {formatMessage(getGroupByOptionLabel(option))}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Flex>\n {Object.keys(releaseActions).map((key) => (\n <Flex key={`releases-group-${key}`} gap={4} direction=\"column\" alignItems=\"stretch\">\n <Flex>\n <Badge>{key}</Badge>\n </Flex>\n <Table.Root\n rows={releaseActions[key].map((item) => ({\n ...item,\n id: Number(item.entry.id),\n }))}\n colCount={releaseActions[key].length}\n isLoading={isLoading}\n isFetching={isFetching}\n >\n <Table.Content>\n <Table.Head>\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.name',\n defaultMessage: 'name',\n })}\n name=\"name\"\n />\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.locale',\n defaultMessage: 'locale',\n })}\n name=\"locale\"\n />\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.content-type',\n defaultMessage: 'content-type',\n })}\n name=\"content-type\"\n />\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.action',\n defaultMessage: 'action',\n })}\n name=\"action\"\n />\n {!release.releasedAt && (\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.status',\n defaultMessage: 'status',\n })}\n name=\"status\"\n />\n )}\n </Table.Head>\n <Table.LoadingBody />\n <Table.Body>\n {releaseActions[key].map(({ id, type, entry }) => (\n <Tr key={id}>\n <Td width={'25%'}>\n <Typography ellipsis>{`${\n entry.contentType.mainFieldValue || entry.id\n }`}</Typography>\n </Td>\n <Td>\n <Typography>{`${\n entry?.locale?.name ? entry.locale.name : '-'\n }`}</Typography>\n </Td>\n <Td>\n <Typography>{entry.contentType.displayName || ''}</Typography>\n </Td>\n <Td>\n {release.releasedAt ? (\n <Typography>\n {formatMessage(\n {\n id: 'content-releases.page.ReleaseDetails.table.action-published',\n defaultMessage:\n 'This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.',\n },\n {\n isPublish: type === 'publish',\n b: (children: React.ReactNode) => (\n <Typography fontWeight=\"bold\">{children}</Typography>\n ),\n }\n )}\n </Typography>\n ) : (\n <ReleaseActionOptions\n selected={type}\n handleChange={(e) => handleChangeType(e, id)}\n name={`release-action-${id}-type`}\n />\n )}\n </Td>\n {!release.releasedAt && (\n <Td>\n <EntryValidationText status={entry.status} action={type} />\n </Td>\n )}\n <Td>\n <Flex justifyContent=\"flex-end\">\n <ReleaseActionMenu releaseId={releaseId} actionId={id} />\n </Flex>\n </Td>\n </Tr>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n </Flex>\n ))}\n <Flex paddingTop={4} alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery defaultValue={releaseMeta?.pagination?.pageSize.toString()} />\n <PaginationURLQuery\n pagination={{\n pageCount: releaseMeta?.pagination?.pageCount || 0,\n }}\n />\n </Flex>\n </Flex>\n </ContentLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseDetailsPage\n * -----------------------------------------------------------------------------------------------*/\nconst ReleaseDetailsPage = () => {\n const { formatMessage } = useIntl();\n const { releaseId } = useParams<{ releaseId: string }>();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { push } = useHistory();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const [showWarningSubmit, setWarningSubmit] = React.useState(false);\n\n const {\n isLoading: isLoadingDetails,\n data,\n isSuccess: isSuccessDetails,\n } = useGetReleaseQuery({ id: releaseId });\n const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();\n const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();\n\n const toggleEditReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);\n\n if (isLoadingDetails) {\n return (\n <ReleaseDetailsLayout\n toggleEditReleaseModal={toggleEditReleaseModal}\n toggleWarningSubmit={toggleWarningSubmit}\n >\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n </ReleaseDetailsLayout>\n );\n }\n\n const title = (isSuccessDetails && data?.data?.name) || '';\n\n const handleEditRelease = async (values: FormValues) => {\n const response = await updateRelease({\n id: releaseId,\n name: values.name,\n });\n\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-updated-notification-success',\n defaultMessage: 'Release updated.',\n }),\n });\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n\n toggleEditReleaseModal();\n };\n\n const handleDeleteRelease = async () => {\n const response = await deleteRelease({\n id: releaseId,\n });\n\n if ('data' in response) {\n push('/plugins/content-releases');\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <ReleaseDetailsLayout\n toggleEditReleaseModal={toggleEditReleaseModal}\n toggleWarningSubmit={toggleWarningSubmit}\n >\n <ReleaseDetailsBody />\n {releaseModalShown && (\n <ReleaseModal\n handleClose={toggleEditReleaseModal}\n handleSubmit={handleEditRelease}\n isLoading={isLoadingDetails || isSubmittingForm}\n initialValues={{ name: title || '' }}\n />\n )}\n <ConfirmDialog\n bodyText={{\n id: 'content-releases.dialog.confirmation-message',\n defaultMessage: 'Are you sure you want to delete this release?',\n }}\n isOpen={showWarningSubmit}\n isConfirmButtonLoading={isDeletingRelease}\n onToggleDialog={toggleWarningSubmit}\n onConfirm={handleDeleteRelease}\n />\n </ReleaseDetailsLayout>\n );\n};\n\nexport { ReleaseDetailsPage };\n","import * as React from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Main,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n Typography,\n} from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport {\n AnErrorOccurred,\n CheckPermissions,\n LoadingIndicatorPage,\n PageSizeURLQuery,\n PaginationURLQuery,\n useQueryParams,\n useAPIErrorHandler,\n useNotification,\n} from '@strapi/helper-plugin';\nimport { EmptyDocuments, Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { GetReleases } from '../../../shared/contracts/releases';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport { isAxiosError } from '../services/axios';\nimport {\n useGetReleasesQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesLayout\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesLayoutProps {\n isLoading?: boolean;\n totalReleases?: number;\n onClickAddRelease: () => void;\n children: React.ReactNode;\n}\n\nexport const ReleasesLayout = ({\n isLoading,\n totalReleases,\n onClickAddRelease,\n children,\n}: ReleasesLayoutProps) => {\n const { formatMessage } = useIntl();\n return (\n <Main aria-busy={isLoading}>\n <HeaderLayout\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n subtitle={\n !isLoading &&\n formatMessage(\n {\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage:\n '{number, plural, =0 {No releases} one {# release} other {# releases}}',\n },\n { number: totalReleases }\n )\n }\n primaryAction={\n <CheckPermissions permissions={PERMISSIONS.create}>\n <Button startIcon={<Plus />} onClick={onClickAddRelease}>\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n </CheckPermissions>\n }\n />\n {children}\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst ReleasesGrid = ({ sectionTitle, releases = [], isError = false }: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <AnErrorOccurred />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"10rem\" />}\n />\n );\n }\n\n return (\n <Grid gap={4}>\n {releases.map(({ id, name, actions }) => (\n <GridItem col={3} s={6} xs={12} key={id}>\n <LinkCard href={`content-releases/${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={2}\n >\n <Typography as=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-releases.page.Releases.release-item.entries',\n defaultMessage:\n '{number, plural, =0 {No entries} one {# entry} other {# entries}}',\n },\n { number: actions.meta.count }\n )}\n </Typography>\n </Flex>\n </LinkCard>\n </GridItem>\n ))}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\ninterface CustomLocationState {\n errors?: Record<'code', string>[];\n}\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation<CustomLocationState>();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const toggleNotification = useNotification();\n const { formatMessage } = useIntl();\n const { push, replace } = useHistory();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n\n const { isLoading, isSuccess, isError } = response;\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'warning',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n replace({ state: null });\n }\n }, [formatMessage, location?.state?.errors, replace, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoading) {\n return (\n <ReleasesLayout onClickAddRelease={toggleAddReleaseModal} isLoading>\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n </ReleasesLayout>\n );\n }\n\n const totalReleases = (isSuccess && response.currentData?.meta?.pagination?.total) || 0;\n\n const handleTabChange = (index: number) => {\n setQuery({\n ...query,\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: index === 0 ? false : true,\n },\n },\n });\n };\n\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n const handleAddRelease = async (values: FormValues) => {\n const response = await createRelease({\n name: values.name,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n push(`/plugins/content-releases/${response.data.data.id}`);\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <ReleasesLayout onClickAddRelease={toggleAddReleaseModal} totalReleases={totalReleases}>\n <ContentLayout>\n <>\n <TabGroup\n label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n variant=\"simple\"\n initialSelectedTabIndex={['pending', 'done'].indexOf(activeTab)}\n onTabChange={handleTabChange}\n >\n <Box paddingBottom={8}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending',\n })}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tab>\n </Tabs>\n <Divider />\n </Box>\n <TabPanels>\n {/* Pending releases */}\n <TabPanel>\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </TabPanel>\n {/* Done releases */}\n <TabPanel>\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n {totalReleases > 0 && (\n <Flex paddingTop={4} alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery\n options={['8', '16', '32', '64']}\n defaultValue={response?.currentData?.meta?.pagination?.pageSize.toString()}\n />\n <PaginationURLQuery\n pagination={{\n pageCount: response?.currentData?.meta?.pagination?.pageCount || 0,\n }}\n />\n </Flex>\n )}\n </>\n </ContentLayout>\n {releaseModalShown && (\n <ReleaseModal\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={INITIAL_FORM_VALUES}\n />\n )}\n </ReleasesLayout>\n );\n};\n\nexport { ReleasesPage };\n","import { CheckPagePermissions } from '@strapi/helper-plugin';\nimport { Route, Switch } from 'react-router-dom';\n\nimport { PERMISSIONS } from '../constants';\nimport { pluginId } from '../pluginId';\n\nimport { ReleaseDetailsPage } from './ReleaseDetailsPage';\nimport { ReleasesPage } from './ReleasesPage';\n\nexport const App = () => {\n return (\n <CheckPagePermissions permissions={PERMISSIONS.main}>\n <Switch>\n <Route exact path={`/plugins/${pluginId}`} component={ReleasesPage} />\n <Route exact path={`/plugins/${pluginId}/:releaseId`} component={ReleaseDetailsPage} />\n </Switch>\n </CheckPagePermissions>\n );\n};\n"],"names":["yup","useIntl","useLocation","pluginId","jsxs","ModalLayout","jsx","ModalHeader","Typography","Formik","Form","ModalBody","TextInput","ModalFooter","Button","styled","Flex","Pencil","Trash","Icon","CheckCircle","useParams","React","useGetReleaseQuery","usePublishReleaseMutation","useNotification","useAPIErrorHandler","useRBAC","PERMISSIONS","isAxiosError","Main","LoadingIndicatorPage","Redirect","HeaderLayout","Link","ArrowLeft","IconButton","More","Popover","RelativeTime","CheckPermissions","useQueryParams","useGetReleaseActionsQuery","useUpdateReleaseActionMutation","ContentLayout","NoContent","LinkButton","ReactRouterLink","SingleSelect","SingleSelectOption","Badge","Table","Tr","Td","ReleaseActionOptions","ReleaseActionMenu","PageSizeURLQuery","PaginationURLQuery","useHistory","useUpdateReleaseMutation","useDeleteReleaseMutation","ConfirmDialog","Plus","AnErrorOccurred","EmptyStateLayout","EmptyDocuments","Grid","GridItem","useGetReleasesQuery","useCreateReleaseMutation","index","response","Fragment","TabGroup","Box","Tabs","Tab","Divider","TabPanels","TabPanel","CheckPagePermissions","Switch","Route"],"mappings":"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"}
@@ -8,6 +8,8 @@ const en = {
8
8
  "content-manager-edit-view.add-to-release.continue-button": "Continue",
9
9
  "content-manager-edit-view.add-to-release": "Add to release",
10
10
  "content-manager-edit-view.add-to-release.notification.success": "Entry added to release",
11
+ "content-manager-edit-view.add-to-release.no-releases-message": "No available releases. Open the list of releases and create a new one from there.",
12
+ "content-manager-edit-view.add-to-release.redirect-button": "Open the list of releases",
11
13
  "content-manager-edit-view.list-releases.title": "{isPublish, select, true {Will be published in} other {Will be unpublished in}}",
12
14
  "content-manager-edit-view.remove-from-release": "Remove from release",
13
15
  "content-manager-edit-view.remove-from-release.notification.success": "Entry removed from release",
@@ -26,22 +28,35 @@ const en = {
26
28
  "header.actions.created.description": " by {createdBy}",
27
29
  "modal.release-created-notification-success": "Release created",
28
30
  "modal.release-updated-notification-success": "Release updated",
29
- "modal.add-release-title": "New Release",
31
+ "modal.title": "{isCreatingRelease, select, true {New release} other {Edit release}}",
30
32
  "modal.form.input.label.release-name": "Name",
31
- "modal.form.button.submit": "Continue",
33
+ "modal.form.button.submit": "{isCreatingRelease, select, true {Continue} other {Save}}",
32
34
  "pages.Details.header-subtitle": "{number, plural, =0 {No entries} one {# entry} other {# entries}}",
33
35
  "pages.Releases.tab-group.label": "Releases list",
34
36
  "pages.Releases.tab.pending": "Pending",
35
37
  "pages.Releases.tab.done": "Done",
36
38
  "page.Releases.tab.emptyEntries": "No releases",
39
+ "pages.Details.tab.emptyEntries": "This release is empty. Open the Content Manager, select an entry and add it to the release.",
37
40
  "page.Releases.release-item.entries": "{number, plural, =0 {No entries} one {# entry} other {# entries}}",
38
41
  "page.ReleaseDetails.table.header.label.name": "name",
39
42
  "page.ReleaseDetails.table.header.label.locale": "locale",
40
43
  "page.ReleaseDetails.table.header.label.content-type": "content-type",
41
44
  "page.ReleaseDetails.table.header.label.action": "action",
45
+ "content-releases.page.ReleaseDetails.table.header.label.status": "status",
42
46
  "page.ReleaseDetails.table.action-published": "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.",
43
47
  "pages.ReleaseDetails.publish-notification-success": "Release was published successfully.",
44
- "dialog.confirmation-message": "Are you sure you want to delete this release?"
48
+ "dialog.confirmation-message": "Are you sure you want to delete this release?",
49
+ "page.Details.button.openContentManager": "Open the Content Manager",
50
+ "pages.Releases.notification.error.title": "Your request could not be processed.",
51
+ "pages.Releases.notification.error.message": "Please try again or open another release.",
52
+ "pages.ReleaseDetails.groupBy.label": "Group by {groupBy}",
53
+ "pages.ReleaseDetails.entry-validation.already-published": "Already published",
54
+ "pages.ReleaseDetails.entry-validation.ready-to-publish": "Ready to publish",
55
+ "pages.ReleaseDetails.entry-validation.already-unpublished": "Already unpublished",
56
+ "pages.ReleaseDetails.entry-validation.ready-to-unpublish": "Ready to unpublish",
57
+ "pages.ReleaseDetails.groupBy.option.content-type": "Content-Types",
58
+ "pages.ReleaseDetails.groupBy.option.locales": "Locales",
59
+ "pages.ReleaseDetails.groupBy.option.actions": "Actions"
45
60
  };
46
61
  exports.default = en;
47
- //# sourceMappingURL=en-b5dfabe6.js.map
62
+ //# sourceMappingURL=en-haKSQIo8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-haKSQIo8.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,6 +6,8 @@ const en = {
6
6
  "content-manager-edit-view.add-to-release.continue-button": "Continue",
7
7
  "content-manager-edit-view.add-to-release": "Add to release",
8
8
  "content-manager-edit-view.add-to-release.notification.success": "Entry added to release",
9
+ "content-manager-edit-view.add-to-release.no-releases-message": "No available releases. Open the list of releases and create a new one from there.",
10
+ "content-manager-edit-view.add-to-release.redirect-button": "Open the list of releases",
9
11
  "content-manager-edit-view.list-releases.title": "{isPublish, select, true {Will be published in} other {Will be unpublished in}}",
10
12
  "content-manager-edit-view.remove-from-release": "Remove from release",
11
13
  "content-manager-edit-view.remove-from-release.notification.success": "Entry removed from release",
@@ -24,24 +26,37 @@ const en = {
24
26
  "header.actions.created.description": " by {createdBy}",
25
27
  "modal.release-created-notification-success": "Release created",
26
28
  "modal.release-updated-notification-success": "Release updated",
27
- "modal.add-release-title": "New Release",
29
+ "modal.title": "{isCreatingRelease, select, true {New release} other {Edit release}}",
28
30
  "modal.form.input.label.release-name": "Name",
29
- "modal.form.button.submit": "Continue",
31
+ "modal.form.button.submit": "{isCreatingRelease, select, true {Continue} other {Save}}",
30
32
  "pages.Details.header-subtitle": "{number, plural, =0 {No entries} one {# entry} other {# entries}}",
31
33
  "pages.Releases.tab-group.label": "Releases list",
32
34
  "pages.Releases.tab.pending": "Pending",
33
35
  "pages.Releases.tab.done": "Done",
34
36
  "page.Releases.tab.emptyEntries": "No releases",
37
+ "pages.Details.tab.emptyEntries": "This release is empty. Open the Content Manager, select an entry and add it to the release.",
35
38
  "page.Releases.release-item.entries": "{number, plural, =0 {No entries} one {# entry} other {# entries}}",
36
39
  "page.ReleaseDetails.table.header.label.name": "name",
37
40
  "page.ReleaseDetails.table.header.label.locale": "locale",
38
41
  "page.ReleaseDetails.table.header.label.content-type": "content-type",
39
42
  "page.ReleaseDetails.table.header.label.action": "action",
43
+ "content-releases.page.ReleaseDetails.table.header.label.status": "status",
40
44
  "page.ReleaseDetails.table.action-published": "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.",
41
45
  "pages.ReleaseDetails.publish-notification-success": "Release was published successfully.",
42
- "dialog.confirmation-message": "Are you sure you want to delete this release?"
46
+ "dialog.confirmation-message": "Are you sure you want to delete this release?",
47
+ "page.Details.button.openContentManager": "Open the Content Manager",
48
+ "pages.Releases.notification.error.title": "Your request could not be processed.",
49
+ "pages.Releases.notification.error.message": "Please try again or open another release.",
50
+ "pages.ReleaseDetails.groupBy.label": "Group by {groupBy}",
51
+ "pages.ReleaseDetails.entry-validation.already-published": "Already published",
52
+ "pages.ReleaseDetails.entry-validation.ready-to-publish": "Ready to publish",
53
+ "pages.ReleaseDetails.entry-validation.already-unpublished": "Already unpublished",
54
+ "pages.ReleaseDetails.entry-validation.ready-to-unpublish": "Ready to unpublish",
55
+ "pages.ReleaseDetails.groupBy.option.content-type": "Content-Types",
56
+ "pages.ReleaseDetails.groupBy.option.locales": "Locales",
57
+ "pages.ReleaseDetails.groupBy.option.actions": "Actions"
43
58
  };
44
59
  export {
45
60
  en as default
46
61
  };
47
- //# sourceMappingURL=en-d837b82d.mjs.map
62
+ //# sourceMappingURL=en-ngTk74JV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-ngTk74JV.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -5,13 +5,13 @@ const jsxRuntime = require("react/jsx-runtime");
5
5
  const React = require("react");
6
6
  const query = require("@reduxjs/toolkit/query");
7
7
  const designSystem = require("@strapi/design-system");
8
+ const v2 = require("@strapi/design-system/v2");
8
9
  const axios = require("axios");
9
10
  const formik = require("formik");
10
11
  const reactIntl = require("react-intl");
11
12
  const reactRouterDom = require("react-router-dom");
12
13
  const yup = require("yup");
13
14
  const react = require("@reduxjs/toolkit/query/react");
14
- const v2 = require("@strapi/design-system/v2");
15
15
  const styled = require("styled-components");
16
16
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
17
17
  function _interopNamespace(e) {
@@ -48,43 +48,71 @@ const PERMISSIONS = {
48
48
  main: [
49
49
  {
50
50
  action: "plugin::content-releases.read",
51
- subject: null
51
+ subject: null,
52
+ id: "",
53
+ actionParameters: {},
54
+ properties: {},
55
+ conditions: []
52
56
  }
53
57
  ],
54
58
  create: [
55
59
  {
56
60
  action: "plugin::content-releases.create",
57
- subject: null
61
+ subject: null,
62
+ id: "",
63
+ actionParameters: {},
64
+ properties: {},
65
+ conditions: []
58
66
  }
59
67
  ],
60
68
  update: [
61
69
  {
62
70
  action: "plugin::content-releases.update",
63
- subject: null
71
+ subject: null,
72
+ id: "",
73
+ actionParameters: {},
74
+ properties: {},
75
+ conditions: []
64
76
  }
65
77
  ],
66
78
  delete: [
67
79
  {
68
80
  action: "plugin::content-releases.delete",
69
- subject: null
81
+ subject: null,
82
+ id: "",
83
+ actionParameters: {},
84
+ properties: {},
85
+ conditions: []
70
86
  }
71
87
  ],
72
88
  createAction: [
73
89
  {
74
90
  action: "plugin::content-releases.create-action",
75
- subject: null
91
+ subject: null,
92
+ id: "",
93
+ actionParameters: {},
94
+ properties: {},
95
+ conditions: []
76
96
  }
77
97
  ],
78
98
  deleteAction: [
79
99
  {
80
100
  action: "plugin::content-releases.delete-action",
81
- subject: null
101
+ subject: null,
102
+ id: "",
103
+ actionParameters: {},
104
+ properties: {},
105
+ conditions: []
82
106
  }
83
107
  ],
84
108
  publish: [
85
109
  {
86
110
  action: "plugin::content-releases.publish",
87
- subject: null
111
+ subject: null,
112
+ id: "",
113
+ actionParameters: {},
114
+ properties: {},
115
+ conditions: []
88
116
  }
89
117
  ]
90
118
  };
@@ -201,22 +229,16 @@ const releaseApi = react.createApi({
201
229
  providesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
202
230
  }),
203
231
  getReleaseActions: build.query({
204
- query({ releaseId, page, pageSize }) {
232
+ query({ releaseId, ...params }) {
205
233
  return {
206
234
  url: `/content-releases/${releaseId}/actions`,
207
235
  method: "GET",
208
236
  config: {
209
- params: {
210
- page,
211
- pageSize
212
- }
237
+ params
213
238
  }
214
239
  };
215
240
  },
216
- providesTags: (result, error, arg) => result ? [
217
- ...result.data.map(({ id }) => ({ type: "ReleaseAction", id })),
218
- { type: "ReleaseAction", id: "LIST" }
219
- ] : [{ type: "ReleaseAction", id: "LIST" }]
241
+ providesTags: [{ type: "ReleaseAction", id: "LIST" }]
220
242
  }),
221
243
  createRelease: build.mutation({
222
244
  query(data) {
@@ -259,9 +281,7 @@ const releaseApi = react.createApi({
259
281
  data: body
260
282
  };
261
283
  },
262
- invalidatesTags: (result, error, arg) => [
263
- { type: "ReleaseAction", id: arg.params.actionId }
264
- ]
284
+ invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }]
265
285
  }),
266
286
  deleteReleaseAction: build.mutation({
267
287
  query({ params }) {
@@ -311,7 +331,7 @@ const {
311
331
  } = releaseApi;
312
332
  const StyledMenuItem = styled__default.default(v2.Menu.Item)`
313
333
  &:hover {
314
- background: transparent;
334
+ background: ${({ theme }) => theme.colors.danger100};
315
335
  }
316
336
 
317
337
  svg {
@@ -331,7 +351,15 @@ const StyledMenuItem = styled__default.default(v2.Menu.Item)`
331
351
  const StyledCross = styled__default.default(icons.Cross)`
332
352
  padding: ${({ theme }) => theme.spaces[1]};
333
353
  `;
334
- const ReleaseActionMenu = ({ releaseId, actionId }) => {
354
+ const StyledIconButton = styled__default.default(designSystem.IconButton)`
355
+ /* Setting this style inline with borderColor will not apply the style */
356
+ border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
357
+ `;
358
+ const ReleaseActionMenu = ({
359
+ releaseId,
360
+ actionId,
361
+ hasTriggerBorder = false
362
+ }) => {
335
363
  const { formatMessage } = reactIntl.useIntl();
336
364
  const toggleNotification = helperPlugin.useNotification();
337
365
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
@@ -370,7 +398,7 @@ const ReleaseActionMenu = ({ releaseId, actionId }) => {
370
398
  /* @__PURE__ */ jsxRuntime.jsx(
371
399
  v2.Menu.Trigger,
372
400
  {
373
- as: designSystem.IconButton,
401
+ as: hasTriggerBorder ? StyledIconButton : designSystem.IconButton,
374
402
  paddingLeft: 2,
375
403
  paddingRight: 2,
376
404
  "aria-label": formatMessage({
@@ -380,9 +408,9 @@ const ReleaseActionMenu = ({ releaseId, actionId }) => {
380
408
  icon: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {})
381
409
  }
382
410
  ),
383
- /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { color: "danger600", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
411
+ /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
384
412
  /* @__PURE__ */ jsxRuntime.jsx(StyledCross, {}),
385
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
413
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
386
414
  id: "content-releases.content-manager-edit-view.remove-from-release",
387
415
  defaultMessage: "Remove from release"
388
416
  }) })
@@ -480,6 +508,32 @@ const INITIAL_VALUES = {
480
508
  type: "publish",
481
509
  releaseId: ""
482
510
  };
511
+ const NoReleases = () => {
512
+ const { formatMessage } = reactIntl.useIntl();
513
+ return /* @__PURE__ */ jsxRuntime.jsx(
514
+ helperPlugin.NoContent,
515
+ {
516
+ content: {
517
+ id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
518
+ defaultMessage: "No available releases. Open the list of releases and create a new one from there."
519
+ },
520
+ action: /* @__PURE__ */ jsxRuntime.jsx(
521
+ v2.LinkButton,
522
+ {
523
+ to: {
524
+ pathname: "/plugins/content-releases"
525
+ },
526
+ as: reactRouterDom.Link,
527
+ variant: "secondary",
528
+ children: formatMessage({
529
+ id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
530
+ defaultMessage: "Open the list of releases"
531
+ })
532
+ }
533
+ )
534
+ }
535
+ );
536
+ };
483
537
  const AddActionToReleaseModal = ({
484
538
  handleClose,
485
539
  contentTypeUid,
@@ -488,6 +542,7 @@ const AddActionToReleaseModal = ({
488
542
  const { formatMessage } = reactIntl.useIntl();
489
543
  const toggleNotification = helperPlugin.useNotification();
490
544
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
545
+ const { modifiedData } = helperPlugin.useCMEditViewDataManager();
491
546
  const response = useGetReleasesForEntryQuery({
492
547
  contentTypeUid,
493
548
  entryId,
@@ -496,9 +551,11 @@ const AddActionToReleaseModal = ({
496
551
  const releases = response.data?.data;
497
552
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
498
553
  const handleSubmit = async (values) => {
554
+ const locale = modifiedData.locale;
499
555
  const releaseActionEntry = {
500
556
  contentType: contentTypeUid,
501
- id: entryId
557
+ id: entryId,
558
+ locale
502
559
  };
503
560
  const response2 = await createReleaseAction({
504
561
  body: { type: values.type, entry: releaseActionEntry },
@@ -542,7 +599,7 @@ const AddActionToReleaseModal = ({
542
599
  initialValues: INITIAL_VALUES,
543
600
  children: ({ values, setFieldValue }) => {
544
601
  return /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { children: [
545
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalBody, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
602
+ releases?.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(NoReleases, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalBody, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
546
603
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsx(
547
604
  designSystem.SingleSelect,
548
605
  {
@@ -686,7 +743,14 @@ const CMReleasesContainer = () => {
686
743
  ),
687
744
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
688
745
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
689
- /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu, { releaseId: release.id, actionId: release.action.id })
746
+ /* @__PURE__ */ jsxRuntime.jsx(
747
+ ReleaseActionMenu,
748
+ {
749
+ releaseId: release.id,
750
+ actionId: release.action.id,
751
+ hasTriggerBorder: true
752
+ }
753
+ )
690
754
  ] })
691
755
  ]
692
756
  },
@@ -734,7 +798,7 @@ const admin = {
734
798
  defaultMessage: "Releases"
735
799
  },
736
800
  async Component() {
737
- const { App } = await Promise.resolve().then(() => require("./App-b6df6b60.js"));
801
+ const { App } = await Promise.resolve().then(() => require("./App-o5_WfqR-.js"));
738
802
  return App;
739
803
  },
740
804
  permissions: PERMISSIONS.main
@@ -752,7 +816,7 @@ const admin = {
752
816
  async registerTrads({ locales }) {
753
817
  const importedTrads = await Promise.all(
754
818
  locales.map((locale) => {
755
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-b5dfabe6.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
819
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-haKSQIo8.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
756
820
  return {
757
821
  data: helperPlugin.prefixPluginTranslations(data, "content-releases"),
758
822
  locale
@@ -769,6 +833,7 @@ const admin = {
769
833
  }
770
834
  };
771
835
  exports.PERMISSIONS = PERMISSIONS;
836
+ exports.ReleaseActionMenu = ReleaseActionMenu;
772
837
  exports.ReleaseActionOptions = ReleaseActionOptions;
773
838
  exports.admin = admin;
774
839
  exports.isAxiosError = isAxiosError;
@@ -781,4 +846,4 @@ exports.useGetReleasesQuery = useGetReleasesQuery;
781
846
  exports.usePublishReleaseMutation = usePublishReleaseMutation;
782
847
  exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
783
848
  exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
784
- //# sourceMappingURL=index-28e99164.js.map
849
+ //# sourceMappingURL=index-EdBmRHRU.js.map