@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.
- package/dist/_chunks/{App-b83f4a97.mjs → App-g2P5kbSm.mjs} +341 -171
- package/dist/_chunks/App-g2P5kbSm.mjs.map +1 -0
- package/dist/_chunks/{App-b6df6b60.js → App-o5_WfqR-.js} +337 -167
- package/dist/_chunks/App-o5_WfqR-.js.map +1 -0
- package/dist/_chunks/{en-b5dfabe6.js → en-haKSQIo8.js} +19 -4
- package/dist/_chunks/en-haKSQIo8.js.map +1 -0
- package/dist/_chunks/{en-d837b82d.mjs → en-ngTk74JV.mjs} +19 -4
- package/dist/_chunks/en-ngTk74JV.mjs.map +1 -0
- package/dist/_chunks/{index-28e99164.js → index-EdBmRHRU.js} +96 -31
- package/dist/_chunks/index-EdBmRHRU.js.map +1 -0
- package/dist/_chunks/{index-c39292e3.mjs → index-XAQOX_IB.mjs} +101 -36
- package/dist/_chunks/index-XAQOX_IB.mjs.map +1 -0
- package/dist/admin/index.js +2 -2
- package/dist/admin/index.mjs +3 -3
- package/dist/server/index.js +60 -35
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +58 -35
- package/dist/server/index.mjs.map +1 -1
- package/package.json +11 -10
- package/dist/_chunks/App-b6df6b60.js.map +0 -1
- package/dist/_chunks/App-b83f4a97.mjs.map +0 -1
- package/dist/_chunks/en-b5dfabe6.js.map +0 -1
- package/dist/_chunks/en-d837b82d.mjs.map +0 -1
- package/dist/_chunks/index-28e99164.js.map +0 -1
- package/dist/_chunks/index-c39292e3.mjs.map +0 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -7
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -8
- package/dist/admin/src/components/ReleaseModal.d.ts +0 -11
- package/dist/admin/src/constants.d.ts +0 -13
- package/dist/admin/src/index.d.ts +0 -3
- package/dist/admin/src/pages/App.d.ts +0 -1
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -10
- package/dist/admin/src/pages/ReleasesPage.d.ts +0 -11
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -104
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -38
- package/dist/admin/src/pluginId.d.ts +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
- package/dist/admin/src/services/release.d.ts +0 -348
- package/dist/server/src/constants.d.ts +0 -9
- package/dist/server/src/constants.d.ts.map +0 -1
- package/dist/server/src/content-types/index.d.ts +0 -82
- package/dist/server/src/content-types/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/index.d.ts +0 -37
- package/dist/server/src/content-types/release/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/schema.d.ts +0 -36
- package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/index.d.ts +0 -44
- package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +0 -43
- package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
- package/dist/server/src/controllers/index.d.ts +0 -18
- package/dist/server/src/controllers/index.d.ts.map +0 -1
- package/dist/server/src/controllers/release-action.d.ts +0 -9
- package/dist/server/src/controllers/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/release.d.ts +0 -11
- package/dist/server/src/controllers/release.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
- package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release.d.ts +0 -2
- package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
- package/dist/server/src/index.d.ts +0 -301
- package/dist/server/src/index.d.ts.map +0 -1
- package/dist/server/src/register.d.ts +0 -5
- package/dist/server/src/register.d.ts.map +0 -1
- package/dist/server/src/routes/index.d.ts +0 -35
- package/dist/server/src/routes/index.d.ts.map +0 -1
- package/dist/server/src/routes/release-action.d.ts +0 -18
- package/dist/server/src/routes/release-action.d.ts.map +0 -1
- package/dist/server/src/routes/release.d.ts +0 -18
- package/dist/server/src/routes/release.d.ts.map +0 -1
- package/dist/server/src/services/index.d.ts +0 -77
- package/dist/server/src/services/index.d.ts.map +0 -1
- package/dist/server/src/services/release.d.ts +0 -55
- package/dist/server/src/services/release.d.ts.map +0 -1
- package/dist/server/src/services/validation.d.ts +0 -10
- package/dist/server/src/services/validation.d.ts.map +0 -1
- package/dist/server/src/utils/index.d.ts +0 -4
- package/dist/server/src/utils/index.d.ts.map +0 -1
- package/dist/shared/contracts/release-actions.d.ts +0 -95
- package/dist/shared/contracts/release-actions.d.ts.map +0 -1
- package/dist/shared/contracts/releases.d.ts +0 -153
- package/dist/shared/contracts/releases.d.ts.map +0 -1
- package/dist/shared/types.d.ts +0 -24
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/validation-schemas.d.ts +0 -2
- 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.
|
|
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-
|
|
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.
|
|
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-
|
|
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,
|
|
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:
|
|
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: (
|
|
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:
|
|
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
|
|
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, {
|
|
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(
|
|
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-
|
|
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-
|
|
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-
|
|
849
|
+
//# sourceMappingURL=index-EdBmRHRU.js.map
|