{"version":3,"file":"ReleaseAction.mjs","sources":["../../../admin/src/components/ReleaseAction.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_useContentManagerContext as useContentManagerContext } from '@strapi/content-manager/strapi-admin';\nimport {\n  Box,\n  Button,\n  Flex,\n  SingleSelect,\n  SingleSelectOption,\n  Modal,\n  Field,\n} from '@strapi/design-system';\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 {\n  type FormValues,\n  INITIAL_VALUES,\n  RELEASE_ACTION_FORM_SCHEMA,\n  NoReleases,\n} from './ReleaseActionModal';\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\nimport type { BulkActionComponent } from '@strapi/content-manager/strapi-admin';\nimport type { UID } from '@strapi/types';\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 = ({ documents, 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  const { hasDraftAndPublish } = useContentManagerContext();\n\n  // Get all the releases not published\n  const response = useGetReleasesQuery();\n  const releases = response.data?.data;\n  const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();\n  const documentIds = documents.map((doc) => doc.documentId);\n\n  const handleSubmit = async (values: FormValues) => {\n    const locale = query.plugins?.i18n?.locale;\n\n    const releaseActionEntries: CreateManyReleaseActions.Request['body'] = documentIds.map(\n      (entryDocumentId) => ({\n        type: values.type,\n        contentType: model as UID.ContentType,\n        entryDocumentId,\n        locale,\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 (!hasDraftAndPublish || !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                  <Modal.Body>\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                  </Modal.Body>\n                )}\n                <Modal.Footer>\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                  {/** * TODO: Ideally we would use isValid from Formik to disable the button,\n                  however currently it always returns true * for yup.string().required(), even when\n                  the value is falsy (including empty string) */}\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                </Modal.Footer>\n              </Form>\n            )}\n          </Formik>\n        );\n      },\n    },\n  };\n};\n\nexport { ReleaseAction };\n"],"names":["getContentPermissions","subject","permissions","publish","action","id","actionParameters","properties","conditions","ReleaseAction","documents","model","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","query","useQueryParams","contentPermissions","allowedActions","canPublish","useRBAC","canCreate","releasePermissions","hasDraftAndPublish","useContentManagerContext","response","useGetReleasesQuery","releases","data","createManyReleaseActions","isLoading","useCreateManyReleaseActionsMutation","documentIds","map","doc","documentId","handleSubmit","values","locale","plugins","i18n","releaseActionEntries","entryDocumentId","type","contentType","body","params","releaseId","notificationMessage","defaultMessage","entriesAlreadyInRelease","meta","totalEntries","notification","title","message","isFetchError","error","actionType","variant","label","dialog","content","onClose","_jsx","Formik","onSubmit","validationSchema","RELEASE_ACTION_FORM_SCHEMA","initialValues","INITIAL_VALUES","setFieldValue","_jsxs","Form","length","NoReleases","Modal","Body","Flex","direction","alignItems","gap","Box","paddingBottom","Field","Root","required","Label","SingleSelect","placeholder","onChange","value","release","SingleSelectOption","name","ReleaseActionOptions","selected","handleChange","e","target","Footer","Button","onClick","disabled","loading"],"mappings":";;;;;;;;;;;;AAqCA,MAAMA,wBAAwB,CAACC,OAAAA,GAAAA;AAC7B,IAAA,MAAMC,WAAAA,GAAc;QAClBC,OAAAA,EAAS;AACP,YAAA;gBACEC,MAAAA,EAAQ,0CAAA;AACRH,gBAAAA,OAAAA;gBACAI,EAAAA,EAAI,EAAA;AACJC,gBAAAA,gBAAAA,EAAkB,EAAC;AACnBC,gBAAAA,UAAAA,EAAY,EAAC;AACbC,gBAAAA,UAAAA,EAAY;AACd;AACD;AACH,KAAA;IAEA,OAAON,WAAAA;AACT,CAAA;AAEA,MAAMO,gBAAqC,CAAC,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAA;IAC9D,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,cAAc,EAAE,GAAGC,kBAAAA,EAAAA;AAC3B,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;AACpB,IAAA,MAAMC,qBAAqBpB,qBAAAA,CAAsBW,KAAAA,CAAAA;AACjD,IAAA,MAAM,EACJU,cAAAA,EAAgB,EAAEC,UAAU,EAAE,EAC/B,GAAGC,OAAAA,CAAQH,kBAAAA,CAAAA;AACZ,IAAA,MAAM,EACJC,cAAAA,EAAgB,EAAEG,SAAS,EAAE,EAC9B,GAAGD,OAAAA,CAAQE,WAAAA,CAAAA;IACZ,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,iCAAAA,EAAAA;;AAG/B,IAAA,MAAMC,QAAAA,GAAWC,mBAAAA,EAAAA;IACjB,MAAMC,QAAAA,GAAWF,QAAAA,CAASG,IAAI,EAAEA,IAAAA;AAChC,IAAA,MAAM,CAACC,wBAAAA,EAA0B,EAAEC,SAAS,EAAE,CAAC,GAAGC,mCAAAA,EAAAA;AAClD,IAAA,MAAMC,cAAczB,SAAAA,CAAU0B,GAAG,CAAC,CAACC,GAAAA,GAAQA,IAAIC,UAAU,CAAA;AAEzD,IAAA,MAAMC,eAAe,OAAOC,MAAAA,GAAAA;AAC1B,QAAA,MAAMC,MAAAA,GAASvB,KAAAA,CAAMwB,OAAO,EAAEC,IAAAA,EAAMF,MAAAA;AAEpC,QAAA,MAAMG,uBAAiET,WAAAA,CAAYC,GAAG,CACpF,CAACS,mBAAqB;AACpBC,gBAAAA,IAAAA,EAAMN,OAAOM,IAAI;gBACjBC,WAAAA,EAAapC,KAAAA;AACbkC,gBAAAA,eAAAA;AACAJ,gBAAAA;aACF,CAAA,CAAA;QAGF,MAAMb,QAAAA,GAAW,MAAMI,wBAAAA,CAAyB;YAC9CgB,IAAAA,EAAMJ,oBAAAA;YACNK,MAAAA,EAAQ;AAAEC,gBAAAA,SAAAA,EAAWV,OAAOU;AAAU;AACxC,SAAA,CAAA;AAEA,QAAA,IAAI,UAAUtB,QAAAA,EAAU;;AAGtB,YAAA,MAAMuB,sBAAsBvC,aAAAA,CAC1B;gBACEP,EAAAA,EAAI,wFAAA;gBACJ+C,cAAAA,EACE;aACJ,EACA;AACEC,gBAAAA,uBAAAA,EAAyBzB,QAAAA,CAASG,IAAI,CAACuB,IAAI,CAACD,uBAAuB;AACnEE,gBAAAA,YAAAA,EAAc3B,QAAAA,CAASG,IAAI,CAACuB,IAAI,CAACC;AACnC,aAAA,CAAA;AAGF,YAAA,MAAMC,YAAAA,GAAe;gBACnBV,IAAAA,EAAM,SAAA;AACNW,gBAAAA,KAAAA,EAAO7C,aAAAA,CACL;oBACEP,EAAAA,EAAI,sFAAA;oBACJ+C,cAAAA,EAAgB;iBAClB,EACA;AACEC,oBAAAA,uBAAAA,EAAyBzB,QAAAA,CAASG,IAAI,CAACuB,IAAI,CAACD,uBAAuB;AACnEE,oBAAAA,YAAAA,EAAc3B,QAAAA,CAASG,IAAI,CAACuB,IAAI,CAACC;AACnC,iBAAA,CAAA;AAEFG,gBAAAA,OAAAA,EAAS9B,SAASG,IAAI,CAACuB,IAAI,CAACD,uBAAuB,GAAGF,mBAAAA,GAAsB;AAC9E,aAAA;YAEArC,kBAAAA,CAAmB0C,YAAAA,CAAAA;YAEnB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,WAAW5B,QAAAA,EAAU;YACvB,IAAI+B,YAAAA,CAAa/B,QAAAA,CAASgC,KAAK,CAAA,EAAG;;gBAEhC9C,kBAAAA,CAAmB;oBACjBgC,IAAAA,EAAM,SAAA;oBACNY,OAAAA,EAAS1C,cAAAA,CAAeY,SAASgC,KAAK;AACxC,iBAAA,CAAA;YACF,CAAA,MAAO;;gBAEL9C,kBAAAA,CAAmB;oBACjBgC,IAAAA,EAAM,SAAA;AACNY,oBAAAA,OAAAA,EAAS9C,aAAAA,CAAc;wBAAEP,EAAAA,EAAI,oBAAA;wBAAsB+C,cAAAA,EAAgB;AAAoB,qBAAA;AACzF,iBAAA,CAAA;AACF,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,IAAI,CAAC1B,kBAAAA,IAAsB,CAACF,SAAAA,IAAa,CAACF,YAAY,OAAO,IAAA;IAE7D,OAAO;QACLuC,UAAAA,EAAY,SAAA;QACZC,OAAAA,EAAS,UAAA;AACTC,QAAAA,KAAAA,EAAOnD,aAAAA,CAAc;YACnBP,EAAAA,EAAI,0CAAA;YACJ+C,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAY,MAAAA,EAAQ;YACNlB,IAAAA,EAAM,OAAA;AACNW,YAAAA,KAAAA,EAAO7C,aAAAA,CAAc;gBACnBP,EAAAA,EAAI,0CAAA;gBACJ+C,cAAAA,EAAgB;AAClB,aAAA,CAAA;YACAa,OAAAA,EAAS,CAAC,EAAEC,OAAO,EAAE,GAAA;AACnB,gBAAA,qBACEC,GAAA,CAACC,MAAAA,EAAAA;AACCC,oBAAAA,QAAAA,EAAU,OAAO7B,MAAAA,GAAAA;wBACf,MAAMT,IAAAA,GAAO,MAAMQ,YAAAA,CAAaC,MAAAA,CAAAA;AAChC,wBAAA,IAAIT,IAAAA,EAAM;4BACR,OAAOmC,OAAAA,EAAAA;AACT,wBAAA;AACF,oBAAA,CAAA;oBACAI,gBAAAA,EAAkBC,0BAAAA;oBAClBC,aAAAA,EAAeC,cAAAA;AAEd,oBAAA,QAAA,EAAA,CAAC,EAAEjC,MAAM,EAAEkC,aAAa,EAAE,iBACzBC,IAAA,CAACC,IAAAA,EAAAA;;AACE9C,gCAAAA,QAAAA,EAAU+C,WAAW,CAAA,iBACpBV,GAAA,CAACW,UAAAA,EAAAA,EAAAA,CAAAA,iBAEDX,GAAA,CAACY,MAAMC,IAAI,EAAA;AACT,oCAAA,QAAA,gBAAAL,IAAA,CAACM,IAAAA,EAAAA;wCAAKC,SAAAA,EAAU,QAAA;wCAASC,UAAAA,EAAW,SAAA;wCAAUC,GAAAA,EAAK,CAAA;;0DACjDjB,GAAA,CAACkB,GAAAA,EAAAA;gDAAIC,aAAAA,EAAe,CAAA;wEAClBX,IAAA,CAACY,MAAMC,IAAI,EAAA;oDAACC,QAAQ,EAAA,IAAA;;AAClB,sEAAAtB,GAAA,CAACoB,MAAMG,KAAK,EAAA;sEACT9E,aAAAA,CAAc;gEACbP,EAAAA,EAAI,wEAAA;gEACJ+C,cAAAA,EAAgB;AAClB,6DAAA;;sEAEFe,GAAA,CAACwB,YAAAA,EAAAA;AACCC,4DAAAA,WAAAA,EAAahF,aAAAA,CAAc;gEACzBP,EAAAA,EAAI,8EAAA;gEACJ+C,cAAAA,EAAgB;AAClB,6DAAA,CAAA;4DACAyC,QAAAA,EAAU,CAACC,KAAAA,GAAUpB,aAAAA,CAAc,WAAA,EAAaoB,KAAAA,CAAAA;AAChDA,4DAAAA,KAAAA,EAAOtD,OAAOU,SAAS;sEAEtBpB,QAAAA,EAAUM,GAAAA,CAAI,CAAC2D,OAAAA,iBACd5B,GAAA,CAAC6B,kBAAAA,EAAAA;AAAoCF,oEAAAA,KAAAA,EAAOC,QAAQ1F,EAAE;AACnD0F,oEAAAA,QAAAA,EAAAA,OAAAA,CAAQE;AADcF,iEAAAA,EAAAA,OAAAA,CAAQ1F,EAAE,CAAA;;;;;AAO3C,0DAAA8D,GAAA,CAACoB,MAAMG,KAAK,EAAA;0DACT9E,aAAAA,CAAc;oDACbP,EAAAA,EAAI,6EAAA;oDACJ+C,cAAAA,EAAgB;AAClB,iDAAA;;0DAEFe,GAAA,CAAC+B,oBAAAA,EAAAA;AACCC,gDAAAA,QAAAA,EAAU3D,OAAOM,IAAI;AACrBsD,gDAAAA,YAAAA,EAAc,CAACC,CAAAA,GAAM3B,aAAAA,CAAc,QAAQ2B,CAAAA,CAAEC,MAAM,CAACR,KAAK,CAAA;gDACzDG,IAAAA,EAAK;;;;;AAKb,8CAAAtB,IAAA,CAACI,MAAMwB,MAAM,EAAA;;sDACXpC,GAAA,CAACqC,MAAAA,EAAAA;4CAAOC,OAAAA,EAASvC,OAAAA;4CAASJ,OAAAA,EAAQ,UAAA;4CAAWmC,IAAAA,EAAK,QAAA;sDAC/CrF,aAAAA,CAAc;gDACbP,EAAAA,EAAI,yEAAA;gDACJ+C,cAAAA,EAAgB;AAClB,6CAAA;;sDAKFe,GAAA,CAACqC,MAAAA,EAAAA;4CAAO1D,IAAAA,EAAK,QAAA;4CAAS4D,QAAAA,EAAU,CAAClE,OAAOU,SAAS;4CAAEyD,OAAAA,EAAS1E,SAAAA;sDACzDrB,aAAAA,CAAc;gDACbP,EAAAA,EAAI,2EAAA;gDACJ+C,cAAAA,EAAgB;AAClB,6CAAA;;;;;;;AAOd,YAAA;AACF;AACF,KAAA;AACF;;;;"}