{"version":3,"file":"ReleaseActionModal.mjs","sources":["../../../admin/src/components/ReleaseActionModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n  useAPIErrorHandler,\n  useNotification,\n  useQueryParams,\n  useRBAC,\n  isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport { unstable_useDocumentLayout as useDocumentLayout } from '@strapi/content-manager/strapi-admin';\nimport {\n  Box,\n  Button,\n  Flex,\n  SingleSelect,\n  SingleSelectOption,\n  EmptyStateLayout,\n  LinkButton,\n  Field,\n  Modal,\n} from '@strapi/design-system';\nimport { PaperPlane } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useFormik } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { CreateReleaseAction } from '../../../shared/contracts/release-actions';\nimport { PERMISSIONS } from '../constants';\nimport { useCreateReleaseActionMutation, useGetReleasesForEntryQuery } from '../services/release';\n\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\nimport type {\n  DocumentActionComponent,\n  DocumentActionProps,\n} from '@strapi/content-manager/strapi-admin';\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * AddActionToReleaseModal\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  contentType: string;\n  documentId?: string;\n  onInputChange: (field: keyof FormValues, value: string | number) => void;\n  values: FormValues;\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      shadow=\"none\"\n    />\n  );\n};\n\nconst AddActionToReleaseModal = ({\n  contentType,\n  documentId,\n  onInputChange,\n  values,\n}: AddActionToReleaseModalProps) => {\n  const { formatMessage } = useIntl();\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    contentType,\n    entryDocumentId: documentId,\n    hasEntryAttached: false,\n    locale,\n  });\n\n  const releases = response.data?.data;\n\n  if (releases?.length === 0) {\n    return <NoReleases />;\n  }\n\n  return (\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            required\n            placeholder={formatMessage({\n              id: 'content-releases.content-manager-edit-view.add-to-release.select-placeholder',\n              defaultMessage: 'Select',\n            })}\n            name=\"releaseId\"\n            onChange={(value) => onInputChange('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) => onInputChange('type', e.target.value)}\n        name=\"type\"\n      />\n    </Flex>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseActionModalForm\n * -----------------------------------------------------------------------------------------------*/\n\nconst ReleaseActionModalForm: DocumentActionComponent = ({\n  documentId,\n  document,\n  model,\n  collectionType,\n}: DocumentActionProps) => {\n  const { formatMessage } = useIntl();\n  const { allowedActions } = useRBAC(PERMISSIONS);\n  const { canCreateAction } = allowedActions;\n  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();\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  const handleSubmit = async (e: React.FormEvent<HTMLFormElement>, onClose: () => void) => {\n    try {\n      await formik.handleSubmit(e);\n      onClose();\n    } catch (error) {\n      if (isFetchError(error)) {\n        // Handle axios error\n        toggleNotification({\n          type: 'danger',\n          message: formatAPIError(error),\n        });\n      } else {\n        // Handle generic error\n        toggleNotification({\n          type: 'danger',\n          message: formatMessage({\n            id: 'notification.error',\n            defaultMessage: 'An error occurred',\n          }),\n        });\n      }\n    }\n  };\n\n  const formik = useFormik({\n    initialValues: INITIAL_VALUES,\n    validationSchema: RELEASE_ACTION_FORM_SCHEMA,\n    onSubmit: async (values: FormValues) => {\n      if (collectionType === 'collection-types' && !documentId) {\n        throw new Error('Document id is required');\n      }\n\n      const response = await createReleaseAction({\n        body: {\n          type: values.type,\n          contentType: model as UID.ContentType,\n          entryDocumentId: documentId,\n          locale,\n        },\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        return;\n      }\n\n      if ('error' in response) {\n        throw response.error;\n      }\n    },\n  });\n\n  const {\n    edit: { options },\n  } = useDocumentLayout(model);\n\n  // Project is not EE or contentType does not have draftAndPublish enabled\n  if (!window.strapi.isEE || !options?.draftAndPublish || !canCreateAction) {\n    return null;\n  }\n\n  if (collectionType === 'collection-types' && (!documentId || documentId === 'create')) {\n    return null;\n  }\n\n  return {\n    label: formatMessage({\n      id: 'content-releases.content-manager-edit-view.add-to-release',\n      defaultMessage: 'Add to release',\n    }),\n    icon: <PaperPlane />,\n    // Entry is creating so we don't want to allow adding it to a release\n    disabled: !document,\n    position: ['panel', 'table-row'],\n    dialog: {\n      type: 'modal',\n      title: formatMessage({\n        id: 'content-releases.content-manager-edit-view.add-to-release',\n        defaultMessage: 'Add to release',\n      }),\n      content: (\n        <AddActionToReleaseModal\n          contentType={model}\n          documentId={documentId}\n          onInputChange={formik.setFieldValue}\n          values={formik.values}\n        />\n      ),\n      footer: ({ onClose }) => (\n        <Modal.Footer>\n          <Button onClick={onClose} 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          <Button\n            type=\"submit\"\n            // @ts-expect-error - formik ReactEvent types don't match button onClick types as they expect a MouseEvent\n            onClick={(e) => handleSubmit(e, onClose)}\n            disabled={!formik.values.releaseId}\n            loading={isLoading}\n          >\n            {formatMessage({\n              id: 'content-releases.content-manager-edit-view.add-to-release.continue-button',\n              defaultMessage: 'Continue',\n            })}\n          </Button>\n        </Modal.Footer>\n      ),\n    },\n  };\n};\n\nexport { ReleaseActionModalForm };\n"],"names":["RELEASE_ACTION_FORM_SCHEMA","yup","object","shape","type","string","oneOf","required","releaseId","INITIAL_VALUES","NoReleases","formatMessage","useIntl","_jsx","EmptyStateLayout","icon","EmptyDocuments","width","content","id","defaultMessage","action","LinkButton","to","pathname","tag","ReactRouterLink","variant","shadow","AddActionToReleaseModal","contentType","documentId","onInputChange","values","query","useQueryParams","locale","plugins","i18n","response","useGetReleasesForEntryQuery","entryDocumentId","hasEntryAttached","releases","data","length","_jsxs","Flex","direction","alignItems","gap","Box","paddingBottom","Field","Root","Label","SingleSelect","placeholder","name","onChange","value","map","release","SingleSelectOption","ReleaseActionOptions","selected","handleChange","e","target","ReleaseActionModalForm","document","model","collectionType","allowedActions","useRBAC","PERMISSIONS","canCreateAction","createReleaseAction","isLoading","useCreateReleaseActionMutation","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","handleSubmit","onClose","formik","error","isFetchError","message","useFormik","initialValues","validationSchema","onSubmit","Error","body","params","edit","options","useDocumentLayout","window","strapi","isEE","draftAndPublish","label","PaperPlane","disabled","position","dialog","title","setFieldValue","footer","Modal","Footer","Button","onClick","loading"],"mappings":"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"}