@strapi/content-releases 5.0.0-beta.5 → 5.0.0-beta.7
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-FVorrIzF.js → App-BdcItFff.js} +119 -126
- package/dist/_chunks/App-BdcItFff.js.map +1 -0
- package/dist/_chunks/{App-Cmn2Mkn7.mjs → App-CJdkbHnd.mjs} +110 -116
- package/dist/_chunks/App-CJdkbHnd.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-sD6ADHk2.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-C8djn9fP.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/{index-BfJLth9Z.js → index-B6Y2hJ10.js} +100 -108
- package/dist/_chunks/index-B6Y2hJ10.js.map +1 -0
- package/dist/_chunks/{index-DDohgTaQ.mjs → index-BvhZTh4j.mjs} +100 -106
- package/dist/_chunks/index-BvhZTh4j.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/components/ReleaseAction.d.ts +1 -1
- package/dist/admin/src/services/baseQuery.d.ts +26 -0
- package/dist/admin/src/services/release.d.ts +216 -81
- package/package.json +12 -13
- package/dist/_chunks/App-Cmn2Mkn7.mjs.map +0 -1
- package/dist/_chunks/App-FVorrIzF.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-C8djn9fP.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-sD6ADHk2.js.map +0 -1
- package/dist/_chunks/index-BfJLth9Z.js.map +0 -1
- package/dist/_chunks/index-DDohgTaQ.mjs.map +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B6Y2hJ10.js","sources":["../../admin/src/constants.ts","../../admin/src/pluginId.ts","../../admin/src/services/baseQuery.ts","../../admin/src/services/release.ts","../../admin/src/utils/time.ts","../../admin/src/components/ReleaseActionMenu.tsx","../../admin/src/components/ReleaseActionOptions.tsx","../../admin/src/components/CMReleasesContainer.tsx","../../admin/src/components/ReleaseAction.tsx","../../admin/src/utils/prefixPluginTranslations.ts","../../admin/src/index.ts"],"sourcesContent":["import type { Permission as StrapiPermission } from '@strapi/admin/strapi-admin';\n\nexport const PERMISSIONS = {\n main: [\n {\n action: 'plugin::content-releases.read',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n create: [\n {\n action: 'plugin::content-releases.create',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.update',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n delete: [\n {\n action: 'plugin::content-releases.delete',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n createAction: [\n {\n action: 'plugin::content-releases.create-action',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n deleteAction: [\n {\n action: 'plugin::content-releases.delete-action',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n publish: [\n {\n action: 'plugin::content-releases.publish',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n} satisfies Record<string, StrapiPermission[]>;\n","export const pluginId = 'content-releases';\n","import { getFetchClient, type FetchOptions, type FetchError } from '@strapi/admin/strapi-admin';\n\nexport interface QueryArguments<TSend> {\n url: string;\n method: 'PUT' | 'GET' | 'POST' | 'DELETE';\n data?: TSend;\n config?: FetchOptions;\n}\n\nconst fetchBaseQuery = async <TData = unknown, TSend = unknown>({\n url,\n method,\n data,\n config,\n}: QueryArguments<TSend>) => {\n try {\n const { get, post, del, put } = getFetchClient();\n\n if (method === 'POST') {\n const result = await post<TData, TSend>(url, data, config);\n return { data: result.data };\n }\n\n if (method === 'DELETE') {\n const result = await del<TData>(url, config);\n return { data: result.data };\n }\n\n if (method === 'PUT') {\n const result = await put<TData>(url, data, config);\n return { data: result.data };\n }\n\n /**\n * Default is GET.\n */\n const result = await get<TData>(url, config);\n\n return { data: result.data };\n } catch (error) {\n const err = error as FetchError;\n /**\n * Handle error of type FetchError\n *\n * This format mimics what we want from an FetchError which is what the\n * rest of the app works with, except this format is \"serializable\" since\n * it goes into the redux store.\n *\n * NOTE – passing the whole response will highlight this \"serializability\" issue.\n */\n return {\n error: {\n status: err.status,\n code: err.code,\n response: {\n data: err.response?.data,\n },\n },\n };\n }\n};\n\nexport { fetchBaseQuery };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport {\n CreateReleaseAction,\n CreateManyReleaseActions,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport { pluginId } from '../pluginId';\n\nimport { fetchBaseQuery } from './baseQuery';\n\nimport type {\n GetReleaseActions,\n UpdateReleaseAction,\n ReleaseActionGroupBy,\n} from '../../../shared/contracts/release-actions';\nimport type {\n CreateRelease,\n DeleteRelease,\n GetContentTypeEntryReleases,\n GetReleases,\n UpdateRelease,\n GetRelease,\n PublishRelease,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\n\nexport interface GetReleasesQueryParams {\n page?: number;\n pageSize?: number;\n filters?: {\n releasedAt?: {\n // TODO: this should be a boolean, find a way to avoid strings\n $notNull?: boolean | 'true' | 'false';\n };\n };\n}\n\nexport interface GetReleaseActionsQueryParams {\n page?: number;\n pageSize?: number;\n groupBy?: ReleaseActionGroupBy;\n}\n\ntype GetReleasesTabResponse = GetReleases.Response & {\n meta: {\n activeTab: 'pending' | 'done';\n };\n};\n\nconst releaseApi = createApi({\n reducerPath: pluginId,\n baseQuery: fetchBaseQuery,\n tagTypes: ['Release', 'ReleaseAction', 'EntriesInRelease'],\n endpoints: (build) => {\n return {\n getReleasesForEntry: build.query<\n GetContentTypeEntryReleases.Response,\n Partial<GetContentTypeEntryReleases.Request['query']>\n >({\n query(params) {\n return {\n url: '/content-releases',\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: (result) =>\n result\n ? [\n ...result.data.map(({ id }) => ({ type: 'Release' as const, id })),\n { type: 'Release', id: 'LIST' },\n ]\n : [],\n }),\n getReleases: build.query<GetReleasesTabResponse, GetReleasesQueryParams | void>({\n query(\n { page, pageSize, filters } = {\n page: 1,\n pageSize: 16,\n filters: {\n releasedAt: {\n $notNull: false,\n },\n },\n }\n ) {\n return {\n url: '/content-releases',\n method: 'GET',\n config: {\n params: {\n page: page || 1,\n pageSize: pageSize || 16,\n filters: filters || {\n releasedAt: {\n $notNull: false,\n },\n },\n },\n },\n };\n },\n transformResponse(response: GetReleasesTabResponse, meta, arg) {\n const releasedAtValue = arg?.filters?.releasedAt?.$notNull;\n const isActiveDoneTab = releasedAtValue === 'true';\n const newResponse: GetReleasesTabResponse = {\n ...response,\n meta: {\n ...response.meta,\n activeTab: isActiveDoneTab ? 'done' : 'pending',\n },\n };\n\n return newResponse;\n },\n providesTags: (result) =>\n result\n ? [\n ...result.data.map(({ id }) => ({ type: 'Release' as const, id })),\n { type: 'Release', id: 'LIST' },\n ]\n : [{ type: 'Release', id: 'LIST' }],\n }),\n getRelease: build.query<GetRelease.Response, GetRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}`,\n method: 'GET',\n };\n },\n providesTags: (result, error, arg) => [{ type: 'Release' as const, id: arg.id }],\n }),\n getReleaseActions: build.query<\n GetReleaseActions.Response,\n GetReleaseActions.Request['params'] & GetReleaseActions.Request['query']\n >({\n query({ releaseId, ...params }) {\n return {\n url: `/content-releases/${releaseId}/actions`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: [{ type: 'ReleaseAction', id: 'LIST' }],\n }),\n createRelease: build.mutation<CreateRelease.Response, CreateRelease.Request['body']>({\n query(data) {\n return {\n url: '/content-releases',\n method: 'POST',\n data,\n };\n },\n invalidatesTags: [{ type: 'Release', id: 'LIST' }],\n }),\n updateRelease: build.mutation<\n void,\n UpdateRelease.Request['params'] & UpdateRelease.Request['body']\n >({\n query({ id, ...data }) {\n return {\n url: `/content-releases/${id}`,\n method: 'PUT',\n data,\n };\n },\n invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],\n }),\n createReleaseAction: build.mutation<\n CreateReleaseAction.Response,\n CreateReleaseAction.Request\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions`,\n method: 'POST',\n data: body,\n };\n },\n invalidatesTags: [\n { type: 'Release', id: 'LIST' },\n { type: 'ReleaseAction', id: 'LIST' },\n ],\n }),\n createManyReleaseActions: build.mutation<\n CreateManyReleaseActions.Response,\n CreateManyReleaseActions.Request\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/bulk`,\n method: 'POST',\n data: body,\n };\n },\n invalidatesTags: [\n { type: 'Release', id: 'LIST' },\n { type: 'ReleaseAction', id: 'LIST' },\n { type: 'EntriesInRelease' },\n ],\n }),\n updateReleaseAction: build.mutation<\n UpdateReleaseAction.Response,\n UpdateReleaseAction.Request & { query: GetReleaseActions.Request['query'] } & {\n actionPath: [string, number];\n }\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,\n method: 'PUT',\n data: body,\n };\n },\n invalidatesTags: () => [{ type: 'ReleaseAction', id: 'LIST' }],\n async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {\n // We need to mimic the same params received by the getReleaseActions query\n const paramsWithoutActionId = {\n releaseId: params.releaseId,\n ...query,\n };\n\n const patchResult = dispatch(\n releaseApi.util.updateQueryData('getReleaseActions', paramsWithoutActionId, (draft) => {\n const [key, index] = actionPath;\n const action = draft.data[key][index];\n\n if (action) {\n action.type = body.type;\n }\n })\n );\n\n try {\n await queryFulfilled;\n } catch {\n patchResult.undo();\n }\n },\n }),\n deleteReleaseAction: build.mutation<\n DeleteReleaseAction.Response,\n DeleteReleaseAction.Request\n >({\n query({ params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,\n method: 'DELETE',\n };\n },\n invalidatesTags: (result, error, arg) => [\n { type: 'Release', id: 'LIST' },\n { type: 'Release', id: arg.params.releaseId },\n { type: 'ReleaseAction', id: 'LIST' },\n { type: 'EntriesInRelease' },\n ],\n }),\n publishRelease: build.mutation<PublishRelease.Response, PublishRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}/publish`,\n method: 'POST',\n };\n },\n invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],\n }),\n deleteRelease: build.mutation<DeleteRelease.Response, DeleteRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}`,\n method: 'DELETE',\n };\n },\n invalidatesTags: () => [{ type: 'Release', id: 'LIST' }, { type: 'EntriesInRelease' }],\n }),\n getMappedEntriesInReleases: build.query<\n MapEntriesToReleases.Response['data'],\n MapEntriesToReleases.Request['query']\n >({\n query(params) {\n return {\n url: '/content-releases/mapEntriesToReleases',\n method: 'GET',\n config: {\n params,\n },\n };\n },\n transformResponse(response: MapEntriesToReleases.Response) {\n return response.data;\n },\n providesTags: [{ type: 'EntriesInRelease' }],\n }),\n };\n },\n});\n\nconst {\n useGetReleasesQuery,\n useGetReleasesForEntryQuery,\n useGetReleaseQuery,\n useGetReleaseActionsQuery,\n useCreateReleaseMutation,\n useCreateReleaseActionMutation,\n useCreateManyReleaseActionsMutation,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseActionMutation,\n useDeleteReleaseMutation,\n useGetMappedEntriesInReleasesQuery,\n} = releaseApi;\n\nexport {\n useGetReleasesQuery,\n useGetReleasesForEntryQuery,\n useGetReleaseQuery,\n useGetReleaseActionsQuery,\n useCreateReleaseMutation,\n useCreateReleaseActionMutation,\n useCreateManyReleaseActionsMutation,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseActionMutation,\n useDeleteReleaseMutation,\n useGetMappedEntriesInReleasesQuery,\n releaseApi,\n};\n","export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch (error) {\n // When timezone is invalid we catch the error and return empty to don't break the app\n return '';\n }\n};\n","import * as React from 'react';\n\nimport {\n useAPIErrorHandler,\n useNotification,\n useAuth,\n useRBAC,\n isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton, Typography, Menu } from '@strapi/design-system';\nimport { Cross, More, Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link as NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { DeleteReleaseAction, ReleaseAction } from '../../../shared/contracts/release-actions';\nimport { Release } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useDeleteReleaseActionMutation } from '../services/release';\n\nconst StyledMenuItem = styled(Menu.Item)<{ $variant?: 'neutral' | 'danger' }>`\n &:hover {\n background: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}100`]};\n\n svg {\n fill: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}600`]};\n }\n\n a {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n }\n\n svg {\n fill: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}600`]};\n }\n\n a {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n\n span,\n a {\n width: 100%;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteReleaseActionItemProps\n * -----------------------------------------------------------------------------------------------*/\nconst StyledIconButton = styled(IconButton)`\n /* Setting this style inline with borderColor will not apply the style */\n border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};\n`;\ninterface DeleteReleaseActionItemProps {\n releaseId: DeleteReleaseAction.Request['params']['releaseId'];\n actionId: DeleteReleaseAction.Request['params']['actionId'];\n}\n\nconst DeleteReleaseActionItem = ({ releaseId, actionId }: DeleteReleaseActionItemProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [deleteReleaseAction] = useDeleteReleaseActionMutation();\n const {\n allowedActions: { canDeleteAction },\n } = useRBAC(PERMISSIONS);\n\n const handleDeleteAction = async () => {\n const response = await deleteReleaseAction({\n params: { releaseId, actionId },\n });\n\n if ('data' in response) {\n // Handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.content-manager-edit-view.remove-from-release.notification.success',\n defaultMessage: 'Entry removed from release',\n }),\n });\n\n return;\n }\n\n if ('error' in response) {\n if (isFetchError(response.error)) {\n // Handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n if (!canDeleteAction) {\n return null;\n }\n\n return (\n <StyledMenuItem $variant=\"danger\" onSelect={handleDeleteAction}>\n <Flex gap={2}>\n <Cross width=\"1.6rem\" height=\"1.6rem\" />\n <Typography textColor=\"danger600\" variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.remove-from-release',\n defaultMessage: 'Remove from release',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseActionEntryLinkItem\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleaseActionEntryLinkItemProps {\n contentTypeUid: ReleaseAction['contentType'];\n entryId: ReleaseAction['entry']['id'];\n locale: ReleaseAction['locale'];\n}\n\nconst ReleaseActionEntryLinkItem = ({\n contentTypeUid,\n entryId,\n locale,\n}: ReleaseActionEntryLinkItemProps) => {\n const { formatMessage } = useIntl();\n const userPermissions = useAuth('ReleaseActionEntryLinkItem', (state) => state.permissions);\n\n // Confirm user has permissions to access the entry for the given locale\n const canUpdateEntryForLocale = React.useMemo(() => {\n const updatePermissions = userPermissions.find(\n (permission) =>\n permission.subject === contentTypeUid &&\n permission.action === 'plugin::content-manager.explorer.update'\n );\n\n if (!updatePermissions) {\n return false;\n }\n\n return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));\n }, [contentTypeUid, locale, userPermissions]);\n\n const {\n allowedActions: { canUpdate: canUpdateContentType },\n } = useRBAC({\n updateContentType: [\n {\n action: 'plugin::content-manager.explorer.update',\n subject: contentTypeUid,\n },\n ],\n });\n\n if (!canUpdateContentType || !canUpdateEntryForLocale) {\n return null;\n }\n\n return (\n <StyledMenuItem\n /* @ts-expect-error inference isn't working in DS */\n tag={NavLink}\n isLink\n to={{\n pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,\n search: locale && `?plugins[i18n][locale]=${locale}`,\n }}\n >\n <Flex gap={2}>\n <Pencil width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.edit-entry',\n defaultMessage: 'Edit entry',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EditReleaseItem\n * -----------------------------------------------------------------------------------------------*/\ninterface EditReleaseItemProps {\n releaseId: Release['id'];\n}\n\nconst EditReleaseItem = ({ releaseId }: EditReleaseItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n /* @ts-expect-error inference isn't working in DS */\n <StyledMenuItem tag={NavLink} isLink to={`/plugins/content-releases/${releaseId}`}>\n <Flex gap={2}>\n <Pencil width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.edit-release',\n defaultMessage: 'Edit release',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RootProps {\n children: React.ReactNode;\n hasTriggerBorder?: boolean;\n}\n\nconst Root = ({ children, hasTriggerBorder = false }: RootProps) => {\n const { formatMessage } = useIntl();\n\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n return (\n // A user can access the dropdown if they have permissions to delete a release-action OR update a release\n allowedActions.canDeleteAction || allowedActions.canUpdate ? (\n <Menu.Root>\n {/*\n TODO Fix in the DS\n - tag={IconButton} has TS error: Property 'icon' does not exist on type 'IntrinsicAttributes & TriggerProps & RefAttributes<HTMLButtonElement>'\n - The Icon doesn't actually show unless you hack it with some padding...and it's still a little strange\n */}\n <Menu.Trigger\n // @ts-expect-error See above\n tag={hasTriggerBorder ? StyledIconButton : IconButton}\n paddingLeft={2}\n paddingRight={2}\n aria-label={formatMessage({\n id: 'content-releases.content-manager-edit-view.release-action-menu',\n defaultMessage: 'Release action options',\n })}\n icon={<More />}\n />\n {/*\n TODO: Using Menu instead of SimpleMenu mainly because there is no positioning provided from the DS,\n Refactor this once fixed in the DS\n */}\n <Menu.Content top={1} popoverPlacement=\"bottom-end\">\n {children}\n </Menu.Content>\n </Menu.Root>\n ) : null\n );\n};\n\nexport const ReleaseActionMenu = {\n Root,\n EditReleaseItem,\n DeleteReleaseActionItem,\n ReleaseActionEntryLinkItem,\n};\n","import * as React from 'react';\n\nimport { VisuallyHidden, Field, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface FieldWrapperProps extends Field.Props {\n actionType: 'publish' | 'unpublish';\n}\n\nconst getBorderLeftRadiusValue = (actionType: FieldWrapperProps['actionType']) => {\n return actionType === 'publish' ? 1 : 0;\n};\n\nconst getBorderRightRadiusValue = (actionType: FieldWrapperProps['actionType']) => {\n return actionType === 'publish' ? 0 : 1;\n};\n\nconst FieldWrapper = styled(Field.Root)<{\n $actionType: 'publish' | 'unpublish';\n}>`\n border-top-left-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderLeftRadiusValue($actionType)]};\n border-bottom-left-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderLeftRadiusValue($actionType)]};\n border-top-right-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderRightRadiusValue($actionType)]};\n border-bottom-right-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderRightRadiusValue($actionType)]};\n\n > label {\n color: inherit;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n text-align: center;\n vertical-align: middle;\n text-transform: capitalize;\n }\n\n &[data-checked='true'] {\n color: ${({ theme, $actionType }) =>\n $actionType === 'publish' ? theme.colors.primary700 : theme.colors.danger600};\n background-color: ${({ theme, $actionType }) =>\n $actionType === 'publish' ? theme.colors.primary100 : theme.colors.danger100};\n border-color: ${({ theme, $actionType }) =>\n $actionType === 'publish' ? theme.colors.primary700 : theme.colors.danger600};\n }\n\n &[data-checked='false'] {\n border-left: ${({ $actionType }) => $actionType === 'unpublish' && 'none'};\n border-right: ${({ $actionType }) => $actionType === 'publish' && 'none'};\n }\n\n &[data-checked='false'][data-disabled='false']:hover {\n color: ${({ theme }) => theme.colors.neutral700};\n background-color: ${({ theme }) => theme.colors.neutral100};\n border-color: ${({ theme }) => theme.colors.neutral200};\n\n & > label {\n cursor: pointer;\n }\n }\n\n &[data-disabled='true'] {\n color: ${({ theme }) => theme.colors.neutral600};\n background-color: ${({ theme }) => theme.colors.neutral150};\n border-color: ${({ theme }) => theme.colors.neutral300};\n }\n`;\n\ninterface ActionOptionProps {\n selected: 'publish' | 'unpublish';\n handleChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n name: string;\n disabled?: boolean;\n}\n\ninterface OptionProps extends ActionOptionProps {\n actionType: 'publish' | 'unpublish';\n}\n\nconst ActionOption = ({\n selected,\n actionType,\n handleChange,\n name,\n disabled = false,\n}: OptionProps) => {\n return (\n <FieldWrapper\n $actionType={actionType}\n background=\"primary0\"\n borderColor=\"neutral200\"\n color={selected === actionType ? 'primary600' : 'neutral600'}\n position=\"relative\"\n cursor=\"pointer\"\n data-checked={selected === actionType}\n data-disabled={disabled && selected !== actionType}\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n name={name}\n checked={selected === actionType}\n onChange={handleChange}\n value={actionType}\n disabled={disabled}\n />\n </VisuallyHidden>\n {actionType}\n </Field.Label>\n </FieldWrapper>\n );\n};\n\nexport const ReleaseActionOptions = ({\n selected,\n handleChange,\n name,\n disabled = false,\n}: ActionOptionProps) => {\n return (\n <Flex>\n <ActionOption\n actionType=\"publish\"\n selected={selected}\n handleChange={handleChange}\n name={name}\n disabled={disabled}\n />\n <ActionOption\n actionType=\"unpublish\"\n selected={selected}\n handleChange={handleChange}\n name={name}\n disabled={disabled}\n />\n </Flex>\n );\n};\n","import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n ModalBody,\n ModalHeader,\n ModalLayout,\n SingleSelect,\n SingleSelectOption,\n Typography,\n ModalFooter,\n EmptyStateLayout,\n LinkButton,\n Field,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useParams } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { CreateReleaseAction } from '../../../shared/contracts/release-actions';\nimport { GetContentTypeEntryReleases } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useCreateReleaseActionMutation, useGetReleasesForEntryQuery } from '../services/release';\nimport { getTimezoneOffset } from '../utils/time';\n\nimport { ReleaseActionMenu } from './ReleaseActionMenu';\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * AddActionToReleaseModal\n * -----------------------------------------------------------------------------------------------*/\n\nexport const RELEASE_ACTION_FORM_SCHEMA = yup.object().shape({\n type: yup.string().oneOf(['publish', 'unpublish']).required(),\n releaseId: yup.string().required(),\n});\n\nexport interface FormValues {\n type: CreateReleaseAction.Request['body']['type'];\n releaseId: CreateReleaseAction.Request['params']['releaseId'];\n}\n\nexport const INITIAL_VALUES = {\n type: 'publish',\n releaseId: '',\n} satisfies FormValues;\n\ninterface AddActionToReleaseModalProps {\n handleClose: () => void;\n contentTypeUid: GetContentTypeEntryReleases.Request['query']['contentTypeUid'];\n entryId: GetContentTypeEntryReleases.Request['query']['entryId'];\n}\n\nexport const NoReleases = () => {\n const { formatMessage } = useIntl();\n return (\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n content={formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.no-releases-message',\n defaultMessage:\n 'No available releases. Open the list of releases and create a new one from there.',\n })}\n action={\n <LinkButton\n to={{\n pathname: '/plugins/content-releases',\n }}\n tag={ReactRouterLink}\n variant=\"secondary\"\n >\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.redirect-button',\n defaultMessage: 'Open the list of releases',\n })}\n </LinkButton>\n }\n />\n );\n};\n\nconst AddActionToReleaseModal = ({\n handleClose,\n contentTypeUid,\n entryId,\n}: AddActionToReleaseModalProps) => {\n const releaseHeaderId = React.useId();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const locale = query.plugins?.i18n?.locale;\n\n // Get all 'pending' releases that do not have the entry attached\n const response = useGetReleasesForEntryQuery({\n contentTypeUid,\n entryId,\n hasEntryAttached: false,\n });\n\n const releases = response.data?.data;\n const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();\n\n const handleSubmit = async (values: FormValues) => {\n const releaseActionEntry = {\n contentType: contentTypeUid,\n id: entryId,\n locale,\n };\n const response = await createReleaseAction({\n body: { type: values.type, entry: releaseActionEntry },\n params: { releaseId: values.releaseId },\n });\n\n if ('data' in response) {\n // Handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.notification.success',\n defaultMessage: 'Entry added to release',\n }),\n });\n\n handleClose();\n return;\n }\n\n if ('error' in response) {\n if (isFetchError(response.error)) {\n // Handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n return (\n <ModalLayout onClose={handleClose} labelledBy={releaseHeaderId}>\n <ModalHeader>\n <Typography id={releaseHeaderId} fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release',\n defaultMessage: 'Add to release',\n })}\n </Typography>\n </ModalHeader>\n <Formik\n onSubmit={handleSubmit}\n validationSchema={RELEASE_ACTION_FORM_SCHEMA}\n initialValues={INITIAL_VALUES}\n >\n {({ values, setFieldValue }) => {\n return (\n <Form>\n {releases?.length === 0 ? (\n <NoReleases />\n ) : (\n <ModalBody>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingBottom={6}>\n <Field.Root required>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.select-label',\n defaultMessage: 'Select a release',\n })}\n </Field.Label>\n <SingleSelect\n placeholder={formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.select-placeholder',\n defaultMessage: 'Select',\n })}\n onChange={(value) => setFieldValue('releaseId', value)}\n value={values.releaseId}\n >\n {releases?.map((release) => (\n <SingleSelectOption key={release.id} value={release.id}>\n {release.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Box>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.action-type-label',\n defaultMessage: 'What do you want to do with this entry?',\n })}\n </Field.Label>\n <ReleaseActionOptions\n selected={values.type}\n handleChange={(e) => setFieldValue('type', e.target.value)}\n name=\"type\"\n />\n </Flex>\n </ModalBody>\n )}\n <ModalFooter\n startActions={\n <Button onClick={handleClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.cancel-button',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n /**\n * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true\n * for yup.string().required(), even when the value is falsy (including empty string)\n */\n <Button type=\"submit\" disabled={!values.releaseId} loading={isLoading}>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.continue-button',\n defaultMessage: 'Continue',\n })}\n </Button>\n }\n />\n </Form>\n );\n }}\n </Formik>\n </ModalLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CMReleasesContainer\n * -----------------------------------------------------------------------------------------------*/\n\nexport const CMReleasesContainer = () => {\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const { formatMessage, formatDate, formatTime } = useIntl();\n const { id, slug, collectionType } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const isCreatingEntry = id === 'create';\n const entryId = parseInt(id!, 10);\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;\n\n const { schema } = unstable_useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const hasDraftAndPublish = schema?.options?.draftAndPublish;\n\n const contentTypeUid = slug as UID.ContentType;\n const canFetch = id != null && contentTypeUid != null;\n const fetchParams = canFetch\n ? {\n contentTypeUid: contentTypeUid,\n entryId,\n hasEntryAttached: true,\n }\n : skipToken;\n // Get all 'pending' releases that have the entry attached\n const response = useGetReleasesForEntryQuery(fetchParams);\n const releases = response.data?.data;\n\n /**\n * If we don't have a contentTypeUid or entryId then the data was never fetched\n */\n if (!canFetch) {\n return null;\n }\n\n /**\n * - Impossible to add entry to release before it exists\n * - Content types without draft and publish cannot add entries to release\n */\n if (isCreatingEntry || !hasDraftAndPublish) {\n return null;\n }\n\n const toggleModal = () => setIsModalOpen((prev) => !prev);\n\n const getReleaseColorVariant = (\n actionType: 'publish' | 'unpublish',\n shade: '100' | '200' | '600'\n ) => {\n if (actionType === 'unpublish') {\n return `secondary${shade}`;\n }\n\n return `success${shade}`;\n };\n\n if (!canMain) {\n return null;\n }\n\n return (\n <Box\n tag=\"aside\"\n aria-label={formatMessage({\n id: 'content-releases.plugin.name',\n defaultMessage: 'Releases',\n })}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n hasRadius\n padding={4}\n shadow=\"tableShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={3}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" textTransform=\"uppercase\">\n {formatMessage({\n id: 'content-releases.plugin.name',\n defaultMessage: 'Releases',\n })}\n </Typography>\n {releases?.map((release) => {\n return (\n <Flex\n key={release.id}\n direction=\"column\"\n alignItems=\"start\"\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={getReleaseColorVariant(release.actions[0].type, '200')}\n overflow=\"hidden\"\n hasRadius\n >\n <Box\n paddingTop={3}\n paddingBottom={3}\n paddingLeft={4}\n paddingRight={4}\n background={getReleaseColorVariant(release.actions[0].type, '100')}\n width=\"100%\"\n >\n <Typography\n fontSize={1}\n variant=\"pi\"\n textColor={getReleaseColorVariant(release.actions[0].type, '600')}\n >\n {formatMessage(\n {\n id: 'content-releases.content-manager-edit-view.list-releases.title',\n defaultMessage:\n '{isPublish, select, true {Will be published in} other {Will be unpublished in}}',\n },\n { isPublish: release.actions[0].type === 'publish' }\n )}\n </Typography>\n </Box>\n <Flex padding={4} direction=\"column\" gap={2} width=\"100%\" alignItems=\"flex-start\">\n <Flex padding={4} direction=\"column\" gap={2} width=\"100%\" alignItems=\"flex-start\">\n <Typography fontSize={2} fontWeight=\"bold\" variant=\"omega\" textColor=\"neutral700\">\n {release.name}\n </Typography>\n {release.scheduledAt && release.timezone && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-releases.content-manager-edit-view.scheduled.date',\n defaultMessage: '{date} at {time} ({offset})',\n },\n {\n date: formatDate(new Date(release.scheduledAt), {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n timeZone: release.timezone,\n }),\n time: formatTime(new Date(release.scheduledAt), {\n hourCycle: 'h23',\n timeZone: release.timezone,\n }),\n offset: getTimezoneOffset(\n release.timezone,\n new Date(release.scheduledAt)\n ),\n }\n )}\n </Typography>\n )}\n {canDeleteAction ? (\n <ReleaseActionMenu.Root hasTriggerBorder>\n <ReleaseActionMenu.EditReleaseItem releaseId={release.id} />\n <ReleaseActionMenu.DeleteReleaseActionItem\n releaseId={release.id}\n actionId={release.actions[0].id}\n />\n </ReleaseActionMenu.Root>\n ) : null}\n </Flex>\n </Flex>\n </Flex>\n );\n })}\n {canCreateAction ? (\n <Button\n justifyContent=\"center\"\n paddingLeft={4}\n paddingRight={4}\n color=\"neutral700\"\n variant=\"tertiary\"\n startIcon={<Plus />}\n onClick={toggleModal}\n >\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release',\n defaultMessage: 'Add to release',\n })}\n </Button>\n ) : null}\n </Flex>\n {isModalOpen && (\n <AddActionToReleaseModal\n handleClose={toggleModal}\n contentTypeUid={contentTypeUid}\n entryId={entryId}\n />\n )}\n </Box>\n );\n};\n","import * as React from 'react';\n\nimport {\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n SingleSelect,\n SingleSelectOption,\n ModalBody,\n ModalFooter,\n Field,\n} from '@strapi/design-system';\nimport { UID } from '@strapi/types';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { CreateManyReleaseActions } from '../../../shared/contracts/release-actions';\nimport { PERMISSIONS as releasePermissions } from '../constants';\nimport { useCreateManyReleaseActionsMutation, useGetReleasesQuery } from '../services/release';\n\nimport { type FormValues, INITIAL_VALUES, RELEASE_ACTION_FORM_SCHEMA } from './CMReleasesContainer';\nimport { NoReleases } from './CMReleasesContainer';\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\nimport type { BulkActionComponent } from '@strapi/content-manager/strapi-admin';\n\nconst getContentPermissions = (subject: string) => {\n const permissions = {\n publish: [\n {\n action: 'plugin::content-manager.explorer.publish',\n subject,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n };\n\n return permissions;\n};\n\nconst ReleaseAction: BulkActionComponent = ({ documentIds, model }) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const contentPermissions = getContentPermissions(model);\n const {\n allowedActions: { canPublish },\n } = useRBAC(contentPermissions);\n const {\n allowedActions: { canCreate },\n } = useRBAC(releasePermissions);\n\n // Get all the releases not published\n const response = useGetReleasesQuery();\n const releases = response.data?.data;\n const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();\n\n const handleSubmit = async (values: FormValues) => {\n const locale = query.plugins?.i18n?.locale;\n // @ts-expect-error – this may not work because id needs to be an entity number not a document id (string)\n const releaseActionEntries: CreateManyReleaseActions.Request['body'] = documentIds.map(\n (id) => ({\n type: values.type,\n entry: {\n contentType: model as UID.ContentType,\n id,\n locale,\n },\n })\n );\n\n const response = await createManyReleaseActions({\n body: releaseActionEntries,\n params: { releaseId: values.releaseId },\n });\n\n if ('data' in response) {\n // Handle success\n\n const notificationMessage = formatMessage(\n {\n id: 'content-releases.content-manager-list-view.add-to-release.notification.success.message',\n defaultMessage:\n '{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release.',\n },\n {\n entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,\n totalEntries: response.data.meta.totalEntries,\n }\n );\n\n const notification = {\n type: 'success' as const,\n title: formatMessage(\n {\n id: 'content-releases.content-manager-list-view.add-to-release.notification.success.title',\n defaultMessage: 'Successfully added to release.',\n },\n {\n entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,\n totalEntries: response.data.meta.totalEntries,\n }\n ),\n message: response.data.meta.entriesAlreadyInRelease ? notificationMessage : '',\n };\n\n toggleNotification(notification);\n\n return true;\n }\n\n if ('error' in response) {\n if (isFetchError(response.error)) {\n // Handle fetch error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n if (!canCreate || !canPublish) return null;\n\n return {\n actionType: 'release',\n variant: 'tertiary',\n label: formatMessage({\n id: 'content-manager-list-view.add-to-release',\n defaultMessage: 'Add to Release',\n }),\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager-list-view.add-to-release',\n defaultMessage: 'Add to Release',\n }),\n content: ({ onClose }) => {\n return (\n <Formik\n onSubmit={async (values) => {\n const data = await handleSubmit(values);\n if (data) {\n return onClose();\n }\n }}\n validationSchema={RELEASE_ACTION_FORM_SCHEMA}\n initialValues={INITIAL_VALUES}\n >\n {({ values, setFieldValue }) => (\n <Form>\n {releases?.length === 0 ? (\n <NoReleases />\n ) : (\n <ModalBody>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingBottom={6}>\n <Field.Root required>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.select-label',\n defaultMessage: 'Select a release',\n })}\n </Field.Label>\n <SingleSelect\n placeholder={formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.select-placeholder',\n defaultMessage: 'Select',\n })}\n onChange={(value) => setFieldValue('releaseId', value)}\n value={values.releaseId}\n >\n {releases?.map((release) => (\n <SingleSelectOption key={release.id} value={release.id}>\n {release.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Box>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.action-type-label',\n defaultMessage: 'What do you want to do with these entries?',\n })}\n </Field.Label>\n <ReleaseActionOptions\n selected={values.type}\n handleChange={(e) => setFieldValue('type', e.target.value)}\n name=\"type\"\n />\n </Flex>\n </ModalBody>\n )}\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.cancel-button',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n /**\n * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true\n * for yup.string().required(), even when the value is falsy (including empty string)\n */\n <Button type=\"submit\" disabled={!values.releaseId} loading={isLoading}>\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.continue-button',\n defaultMessage: 'Continue',\n })}\n </Button>\n }\n />\n </Form>\n )}\n </Formik>\n );\n },\n },\n };\n};\n\nexport { ReleaseAction };\n","type TradOptions = Record<string, string>;\n\nconst prefixPluginTranslations = (trad: TradOptions, pluginId: string): TradOptions => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n return Object.keys(trad).reduce((acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n return acc;\n }, {} as TradOptions);\n};\n\nexport { prefixPluginTranslations };\n","import { PaperPlane } from '@strapi/icons';\n\nimport { CMReleasesContainer } from './components/CMReleasesContainer';\nimport { ReleaseAction } from './components/ReleaseAction';\n// import { addColumnToTableHook } from './components/ReleaseListCell';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { releaseApi } from './services/release';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { BulkActionComponent } from '@strapi/content-manager/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\n// eslint-disable-next-line import/no-default-export\nconst admin: Plugin.Config.AdminInput = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(app: StrapiApp) {\n /**\n * Hook that adds the locale column in the Release Details table\n * @constant\n * @type {string}\n */\n app.createHook('ContentReleases/pages/ReleaseDetails/add-locale-in-releases');\n if (window.strapi.features.isEnabled('cms-content-releases')) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: PaperPlane,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Releases',\n },\n Component: () => import('./pages/App').then((mod) => ({ default: mod.App })),\n permissions: PERMISSIONS.main,\n });\n\n /**\n * For some reason every middleware you pass has to a function\n * that returns the actual middleware. It's annoying but no one knows why....\n */\n // @ts-expect-error – this API needs to be typed better.\n app.addMiddlewares([() => releaseApi.middleware]);\n\n app.addReducers({\n [releaseApi.reducerPath]: releaseApi.reducer,\n });\n\n // Insert the Releases container in the 'right-links' zone of the Content Manager's edit view\n app.getPlugin('content-manager').injectComponent('editView', 'right-links', {\n name: `${pluginId}-link`,\n Component: CMReleasesContainer,\n });\n\n // @ts-expect-error – plugins are not typed on the StrapiApp, fix this.\n app.plugins['content-manager'].apis.addBulkAction((actions: BulkActionComponent[]) => {\n // We want to add this action to just before the delete action all the time\n const deleteActionIndex = actions.findIndex((action) => action.name === 'DeleteAction');\n\n actions.splice(deleteActionIndex, 0, ReleaseAction);\n return actions;\n });\n // Hook that adds a column into the CM's LV table\n // app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addColumnToTableHook);\n } else if (\n !window.strapi.features.isEnabled('cms-content-releases') &&\n window.strapi?.flags?.promoteEE\n ) {\n app.addMenuLink({\n to: `/plugins/purchase-content-releases`,\n icon: PaperPlane,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Releases',\n },\n permissions: [],\n async Component() {\n const { PurchaseContentReleases } = await import('./pages/PurchaseContentReleases');\n return { default: PurchaseContentReleases };\n },\n lockIcon: true,\n });\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, 'content-releases'),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["getFetchClient","result","createApi","query","styled","Menu","IconButton","useIntl","useNotification","useAPIErrorHandler","useRBAC","isFetchError","jsx","jsxs","Flex","Cross","Typography","useAuth","React","NavLink","Pencil","More","Field","VisuallyHidden","yup","EmptyStateLayout","EmptyDocuments","LinkButton","ReactRouterLink","useQueryParams","response","ModalLayout","ModalHeader","Formik","Form","ModalBody","Box","SingleSelect","SingleSelectOption","ModalFooter","Button","useParams","unstable_useDocument","skipToken","Plus","releasePermissions","pluginId","PaperPlane"],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import { Cross, Pencil, More, Plus,
|
|
1
|
+
import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { skipToken } from "@reduxjs/toolkit/query";
|
|
5
|
-
import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, useQueryParams } from "@strapi/admin/strapi-admin";
|
|
6
|
-
import {
|
|
7
|
-
import { Menu,
|
|
8
|
-
import {
|
|
9
|
-
import { isAxiosError as isAxiosError$1 } from "axios";
|
|
5
|
+
import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, isFetchError, useQueryParams } from "@strapi/admin/strapi-admin";
|
|
6
|
+
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
+
import { Menu, IconButton, Flex, Typography, Field, VisuallyHidden, Box, Button, EmptyStateLayout, LinkButton, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
|
|
8
|
+
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
10
9
|
import { Formik, Form } from "formik";
|
|
11
10
|
import { useIntl } from "react-intl";
|
|
12
|
-
import {
|
|
11
|
+
import { Link, useParams } from "react-router-dom";
|
|
13
12
|
import * as yup from "yup";
|
|
14
13
|
import { createApi } from "@reduxjs/toolkit/query/react";
|
|
15
|
-
import styled from "styled-components";
|
|
14
|
+
import { styled } from "styled-components";
|
|
16
15
|
const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
|
17
16
|
const v = glob[path];
|
|
18
17
|
if (v) {
|
|
@@ -95,7 +94,7 @@ const PERMISSIONS = {
|
|
|
95
94
|
]
|
|
96
95
|
};
|
|
97
96
|
const pluginId = "content-releases";
|
|
98
|
-
const
|
|
97
|
+
const fetchBaseQuery = async ({
|
|
99
98
|
url,
|
|
100
99
|
method,
|
|
101
100
|
data,
|
|
@@ -121,7 +120,7 @@ const axiosBaseQuery = async ({
|
|
|
121
120
|
const err = error;
|
|
122
121
|
return {
|
|
123
122
|
error: {
|
|
124
|
-
status: err.
|
|
123
|
+
status: err.status,
|
|
125
124
|
code: err.code,
|
|
126
125
|
response: {
|
|
127
126
|
data: err.response?.data
|
|
@@ -130,12 +129,9 @@ const axiosBaseQuery = async ({
|
|
|
130
129
|
};
|
|
131
130
|
}
|
|
132
131
|
};
|
|
133
|
-
const isAxiosError = (err) => {
|
|
134
|
-
return typeof err === "object" && err !== null && "response" in err && typeof err.response === "object" && err.response !== null && "data" in err.response;
|
|
135
|
-
};
|
|
136
132
|
const releaseApi = createApi({
|
|
137
133
|
reducerPath: pluginId,
|
|
138
|
-
baseQuery:
|
|
134
|
+
baseQuery: fetchBaseQuery,
|
|
139
135
|
tagTypes: ["Release", "ReleaseAction", "EntriesInRelease"],
|
|
140
136
|
endpoints: (build) => {
|
|
141
137
|
return {
|
|
@@ -378,12 +374,10 @@ const getTimezoneOffset = (timezone, date) => {
|
|
|
378
374
|
};
|
|
379
375
|
const StyledMenuItem = styled(Menu.Item)`
|
|
380
376
|
&:hover {
|
|
381
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
377
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
382
378
|
|
|
383
379
|
svg {
|
|
384
|
-
|
|
385
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
386
|
-
}
|
|
380
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
387
381
|
}
|
|
388
382
|
|
|
389
383
|
a {
|
|
@@ -392,9 +386,7 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
392
386
|
}
|
|
393
387
|
|
|
394
388
|
svg {
|
|
395
|
-
|
|
396
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
397
|
-
}
|
|
389
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
398
390
|
}
|
|
399
391
|
|
|
400
392
|
a {
|
|
@@ -433,7 +425,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
433
425
|
return;
|
|
434
426
|
}
|
|
435
427
|
if ("error" in response) {
|
|
436
|
-
if (
|
|
428
|
+
if (isFetchError(response.error)) {
|
|
437
429
|
toggleNotification({
|
|
438
430
|
type: "danger",
|
|
439
431
|
message: formatAPIError(response.error)
|
|
@@ -449,8 +441,8 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
449
441
|
if (!canDeleteAction) {
|
|
450
442
|
return null;
|
|
451
443
|
}
|
|
452
|
-
return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
453
|
-
/* @__PURE__ */ jsx(
|
|
444
|
+
return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
445
|
+
/* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
|
|
454
446
|
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
455
447
|
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
456
448
|
defaultMessage: "Remove from release"
|
|
@@ -486,36 +478,37 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
486
478
|
if (!canUpdateContentType || !canUpdateEntryForLocale) {
|
|
487
479
|
return null;
|
|
488
480
|
}
|
|
489
|
-
return /* @__PURE__ */ jsx(
|
|
490
|
-
|
|
481
|
+
return /* @__PURE__ */ jsx(
|
|
482
|
+
StyledMenuItem,
|
|
491
483
|
{
|
|
492
|
-
|
|
484
|
+
tag: Link,
|
|
485
|
+
isLink: true,
|
|
493
486
|
to: {
|
|
494
487
|
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
495
488
|
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
496
489
|
},
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
490
|
+
children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
491
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
492
|
+
/* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
493
|
+
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
494
|
+
defaultMessage: "Edit entry"
|
|
495
|
+
}) })
|
|
496
|
+
] })
|
|
502
497
|
}
|
|
503
|
-
)
|
|
498
|
+
);
|
|
504
499
|
};
|
|
505
500
|
const EditReleaseItem = ({ releaseId }) => {
|
|
506
501
|
const { formatMessage } = useIntl();
|
|
507
|
-
return
|
|
508
|
-
|
|
509
|
-
{
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
isExternal: false,
|
|
513
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
502
|
+
return (
|
|
503
|
+
/* @ts-expect-error inference isn't working in DS */
|
|
504
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { tag: Link, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
505
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
506
|
+
/* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
514
507
|
id: "content-releases.content-manager-edit-view.edit-release",
|
|
515
508
|
defaultMessage: "Edit release"
|
|
516
509
|
}) })
|
|
517
|
-
}
|
|
518
|
-
)
|
|
510
|
+
] }) })
|
|
511
|
+
);
|
|
519
512
|
};
|
|
520
513
|
const Root = ({ children, hasTriggerBorder = false }) => {
|
|
521
514
|
const { formatMessage } = useIntl();
|
|
@@ -526,7 +519,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
|
|
|
526
519
|
/* @__PURE__ */ jsx(
|
|
527
520
|
Menu.Trigger,
|
|
528
521
|
{
|
|
529
|
-
|
|
522
|
+
tag: hasTriggerBorder ? StyledIconButton : IconButton,
|
|
530
523
|
paddingLeft: 2,
|
|
531
524
|
paddingRight: 2,
|
|
532
525
|
"aria-label": formatMessage({
|
|
@@ -552,11 +545,11 @@ const getBorderLeftRadiusValue = (actionType) => {
|
|
|
552
545
|
const getBorderRightRadiusValue = (actionType) => {
|
|
553
546
|
return actionType === "publish" ? 0 : 1;
|
|
554
547
|
};
|
|
555
|
-
const FieldWrapper = styled(Field)`
|
|
556
|
-
border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
557
|
-
border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
558
|
-
border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
559
|
-
border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
548
|
+
const FieldWrapper = styled(Field.Root)`
|
|
549
|
+
border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
550
|
+
border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
551
|
+
border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
552
|
+
border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
560
553
|
|
|
561
554
|
> label {
|
|
562
555
|
color: inherit;
|
|
@@ -567,14 +560,14 @@ const FieldWrapper = styled(Field)`
|
|
|
567
560
|
}
|
|
568
561
|
|
|
569
562
|
&[data-checked='true'] {
|
|
570
|
-
color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
571
|
-
background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
572
|
-
border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
563
|
+
color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
564
|
+
background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
565
|
+
border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
573
566
|
}
|
|
574
567
|
|
|
575
568
|
&[data-checked='false'] {
|
|
576
|
-
border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
|
|
577
|
-
border-right: ${({ actionType }) => actionType === "publish" && "none"};
|
|
569
|
+
border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
|
|
570
|
+
border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
|
|
578
571
|
}
|
|
579
572
|
|
|
580
573
|
&[data-checked='false'][data-disabled='false']:hover {
|
|
@@ -603,7 +596,7 @@ const ActionOption = ({
|
|
|
603
596
|
return /* @__PURE__ */ jsx(
|
|
604
597
|
FieldWrapper,
|
|
605
598
|
{
|
|
606
|
-
actionType,
|
|
599
|
+
$actionType: actionType,
|
|
607
600
|
background: "primary0",
|
|
608
601
|
borderColor: "neutral200",
|
|
609
602
|
color: selected === actionType ? "primary600" : "neutral600",
|
|
@@ -611,12 +604,11 @@ const ActionOption = ({
|
|
|
611
604
|
cursor: "pointer",
|
|
612
605
|
"data-checked": selected === actionType,
|
|
613
606
|
"data-disabled": disabled && selected !== actionType,
|
|
614
|
-
children: /* @__PURE__ */ jsxs(
|
|
607
|
+
children: /* @__PURE__ */ jsxs(Field.Label, { children: [
|
|
615
608
|
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
|
|
616
|
-
|
|
609
|
+
Field.Input,
|
|
617
610
|
{
|
|
618
611
|
type: "radio",
|
|
619
|
-
id: `${name}-${actionType}`,
|
|
620
612
|
name,
|
|
621
613
|
checked: selected === actionType,
|
|
622
614
|
onChange: handleChange,
|
|
@@ -671,7 +663,7 @@ const NoReleases = () => {
|
|
|
671
663
|
return /* @__PURE__ */ jsx(
|
|
672
664
|
EmptyStateLayout,
|
|
673
665
|
{
|
|
674
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
666
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
675
667
|
content: formatMessage({
|
|
676
668
|
id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
|
|
677
669
|
defaultMessage: "No available releases. Open the list of releases and create a new one from there."
|
|
@@ -682,7 +674,7 @@ const NoReleases = () => {
|
|
|
682
674
|
to: {
|
|
683
675
|
pathname: "/plugins/content-releases"
|
|
684
676
|
},
|
|
685
|
-
|
|
677
|
+
tag: Link,
|
|
686
678
|
variant: "secondary",
|
|
687
679
|
children: formatMessage({
|
|
688
680
|
id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
|
|
@@ -733,7 +725,7 @@ const AddActionToReleaseModal = ({
|
|
|
733
725
|
return;
|
|
734
726
|
}
|
|
735
727
|
if ("error" in response2) {
|
|
736
|
-
if (
|
|
728
|
+
if (isFetchError(response2.error)) {
|
|
737
729
|
toggleNotification({
|
|
738
730
|
type: "danger",
|
|
739
731
|
message: formatAPIError(response2.error)
|
|
@@ -760,24 +752,25 @@ const AddActionToReleaseModal = ({
|
|
|
760
752
|
children: ({ values, setFieldValue }) => {
|
|
761
753
|
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
762
754
|
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
763
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
755
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
756
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
757
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-label",
|
|
758
|
+
defaultMessage: "Select a release"
|
|
759
|
+
}) }),
|
|
760
|
+
/* @__PURE__ */ jsx(
|
|
761
|
+
SingleSelect,
|
|
762
|
+
{
|
|
763
|
+
placeholder: formatMessage({
|
|
764
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
|
|
765
|
+
defaultMessage: "Select"
|
|
766
|
+
}),
|
|
767
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
768
|
+
value: values.releaseId,
|
|
769
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
770
|
+
}
|
|
771
|
+
)
|
|
772
|
+
] }) }),
|
|
773
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
781
774
|
id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
|
|
782
775
|
defaultMessage: "What do you want to do with this entry?"
|
|
783
776
|
}) }),
|
|
@@ -820,6 +813,7 @@ const CMReleasesContainer = () => {
|
|
|
820
813
|
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
821
814
|
const { id, slug, collectionType } = useParams();
|
|
822
815
|
const isCreatingEntry = id === "create";
|
|
816
|
+
const entryId = parseInt(id, 10);
|
|
823
817
|
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
824
818
|
const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
|
|
825
819
|
const { schema } = unstable_useDocument({
|
|
@@ -831,7 +825,7 @@ const CMReleasesContainer = () => {
|
|
|
831
825
|
const canFetch = id != null && contentTypeUid != null;
|
|
832
826
|
const fetchParams = canFetch ? {
|
|
833
827
|
contentTypeUid,
|
|
834
|
-
entryId
|
|
828
|
+
entryId,
|
|
835
829
|
hasEntryAttached: true
|
|
836
830
|
} : skipToken;
|
|
837
831
|
const response = useGetReleasesForEntryQuery(fetchParams);
|
|
@@ -855,7 +849,7 @@ const CMReleasesContainer = () => {
|
|
|
855
849
|
return /* @__PURE__ */ jsxs(
|
|
856
850
|
Box,
|
|
857
851
|
{
|
|
858
|
-
|
|
852
|
+
tag: "aside",
|
|
859
853
|
"aria-label": formatMessage({
|
|
860
854
|
id: "content-releases.plugin.name",
|
|
861
855
|
defaultMessage: "Releases"
|
|
@@ -971,7 +965,7 @@ const CMReleasesContainer = () => {
|
|
|
971
965
|
{
|
|
972
966
|
handleClose: toggleModal,
|
|
973
967
|
contentTypeUid,
|
|
974
|
-
entryId
|
|
968
|
+
entryId
|
|
975
969
|
}
|
|
976
970
|
)
|
|
977
971
|
]
|
|
@@ -1053,7 +1047,7 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1053
1047
|
return true;
|
|
1054
1048
|
}
|
|
1055
1049
|
if ("error" in response2) {
|
|
1056
|
-
if (
|
|
1050
|
+
if (isFetchError(response2.error)) {
|
|
1057
1051
|
toggleNotification({
|
|
1058
1052
|
type: "warning",
|
|
1059
1053
|
message: formatAPIError(response2.error)
|
|
@@ -1095,24 +1089,25 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1095
1089
|
initialValues: INITIAL_VALUES,
|
|
1096
1090
|
children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
|
|
1097
1091
|
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
1098
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1092
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
1093
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
1094
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-label",
|
|
1095
|
+
defaultMessage: "Select a release"
|
|
1096
|
+
}) }),
|
|
1097
|
+
/* @__PURE__ */ jsx(
|
|
1098
|
+
SingleSelect,
|
|
1099
|
+
{
|
|
1100
|
+
placeholder: formatMessage({
|
|
1101
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
|
|
1102
|
+
defaultMessage: "Select"
|
|
1103
|
+
}),
|
|
1104
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
1105
|
+
value: values.releaseId,
|
|
1106
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
1107
|
+
}
|
|
1108
|
+
)
|
|
1109
|
+
] }) }),
|
|
1110
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
1116
1111
|
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
|
|
1117
1112
|
defaultMessage: "What do you want to do with these entries?"
|
|
1118
1113
|
}) }),
|
|
@@ -1172,7 +1167,7 @@ const admin = {
|
|
|
1172
1167
|
id: `${pluginId}.plugin.name`,
|
|
1173
1168
|
defaultMessage: "Releases"
|
|
1174
1169
|
},
|
|
1175
|
-
Component: () => import("./App-
|
|
1170
|
+
Component: () => import("./App-CJdkbHnd.mjs").then((mod) => ({ default: mod.App })),
|
|
1176
1171
|
permissions: PERMISSIONS.main
|
|
1177
1172
|
});
|
|
1178
1173
|
app.addMiddlewares([() => releaseApi.middleware]);
|
|
@@ -1198,7 +1193,7 @@ const admin = {
|
|
|
1198
1193
|
},
|
|
1199
1194
|
permissions: [],
|
|
1200
1195
|
async Component() {
|
|
1201
|
-
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-
|
|
1196
|
+
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-_MxP6-Dt.mjs");
|
|
1202
1197
|
return { default: PurchaseContentReleases };
|
|
1203
1198
|
},
|
|
1204
1199
|
lockIcon: true
|
|
@@ -1235,11 +1230,10 @@ export {
|
|
|
1235
1230
|
useGetReleaseActionsQuery as f,
|
|
1236
1231
|
getTimezoneOffset as g,
|
|
1237
1232
|
useUpdateReleaseActionMutation as h,
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
admin as k,
|
|
1233
|
+
ReleaseActionMenu as i,
|
|
1234
|
+
admin as j,
|
|
1241
1235
|
pluginId as p,
|
|
1242
1236
|
releaseApi as r,
|
|
1243
1237
|
useGetReleasesQuery as u
|
|
1244
1238
|
};
|
|
1245
|
-
//# sourceMappingURL=index-
|
|
1239
|
+
//# sourceMappingURL=index-BvhZTh4j.mjs.map
|