@strapi/content-releases 0.0.0-next.6d59515520a3850456f256fb0e4c54b75054ddf4 → 0.0.0-next.734763e5757af27ff96ad1c9662161f3f677052a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/_chunks/{App-_20W9dYa.js → App-c5uGEz9O.js} +744 -446
  2. package/dist/_chunks/App-c5uGEz9O.js.map +1 -0
  3. package/dist/_chunks/{App-L1jSxCiL.mjs → App-xQ5ljY7-.mjs} +752 -455
  4. package/dist/_chunks/App-xQ5ljY7-.mjs.map +1 -0
  5. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs +51 -0
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js +51 -0
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-gYDqKYFd.js → en-3SGjiVyR.js} +29 -7
  10. package/dist/_chunks/en-3SGjiVyR.js.map +1 -0
  11. package/dist/_chunks/{en-MyLPoISH.mjs → en-bpHsnU0n.mjs} +29 -7
  12. package/dist/_chunks/en-bpHsnU0n.mjs.map +1 -0
  13. package/dist/_chunks/{index-KJa1Rb5F.js → index-4U0Q_Fgd.js} +350 -34
  14. package/dist/_chunks/index-4U0Q_Fgd.js.map +1 -0
  15. package/dist/_chunks/{index-c4zRX_sg.mjs → index-ifoPtgmH.mjs} +363 -47
  16. package/dist/_chunks/index-ifoPtgmH.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +2 -2
  19. package/dist/server/index.js +998 -399
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/index.mjs +997 -399
  22. package/dist/server/index.mjs.map +1 -1
  23. package/package.json +14 -11
  24. package/dist/_chunks/App-L1jSxCiL.mjs.map +0 -1
  25. package/dist/_chunks/App-_20W9dYa.js.map +0 -1
  26. package/dist/_chunks/en-MyLPoISH.mjs.map +0 -1
  27. package/dist/_chunks/en-gYDqKYFd.js.map +0 -1
  28. package/dist/_chunks/index-KJa1Rb5F.js.map +0 -1
  29. package/dist/_chunks/index-c4zRX_sg.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, prefixPluginTranslations } from "@strapi/helper-plugin";
1
+ import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, useRBAC, prefixPluginTranslations } from "@strapi/helper-plugin";
2
2
  import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as React from "react";
@@ -8,7 +8,7 @@ import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
8
  import { isAxiosError as isAxiosError$1 } from "axios";
9
9
  import { Formik, Form } from "formik";
10
10
  import { useIntl } from "react-intl";
11
- import { NavLink, useParams, Link as Link$1 } from "react-router-dom";
11
+ import { NavLink, Link as Link$1 } from "react-router-dom";
12
12
  import * as yup from "yup";
13
13
  import { createApi } from "@reduxjs/toolkit/query/react";
14
14
  import styled from "styled-components";
@@ -251,6 +251,19 @@ const releaseApi = createApi({
251
251
  { type: "ReleaseAction", id: "LIST" }
252
252
  ]
253
253
  }),
254
+ createManyReleaseActions: build.mutation({
255
+ query({ body, params }) {
256
+ return {
257
+ url: `/content-releases/${params.releaseId}/actions/bulk`,
258
+ method: "POST",
259
+ data: body
260
+ };
261
+ },
262
+ invalidatesTags: [
263
+ { type: "Release", id: "LIST" },
264
+ { type: "ReleaseAction", id: "LIST" }
265
+ ]
266
+ }),
254
267
  updateReleaseAction: build.mutation({
255
268
  query({ body, params }) {
256
269
  return {
@@ -259,7 +272,27 @@ const releaseApi = createApi({
259
272
  data: body
260
273
  };
261
274
  },
262
- invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }]
275
+ invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
276
+ async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
277
+ const paramsWithoutActionId = {
278
+ releaseId: params.releaseId,
279
+ ...query
280
+ };
281
+ const patchResult = dispatch(
282
+ releaseApi.util.updateQueryData("getReleaseActions", paramsWithoutActionId, (draft) => {
283
+ const [key, index] = actionPath;
284
+ const action = draft.data[key][index];
285
+ if (action) {
286
+ action.type = body.type;
287
+ }
288
+ })
289
+ );
290
+ try {
291
+ await queryFulfilled;
292
+ } catch {
293
+ patchResult.undo();
294
+ }
295
+ }
263
296
  }),
264
297
  deleteReleaseAction: build.mutation({
265
298
  query({ params }) {
@@ -268,8 +301,9 @@ const releaseApi = createApi({
268
301
  method: "DELETE"
269
302
  };
270
303
  },
271
- invalidatesTags: [
304
+ invalidatesTags: (result, error, arg) => [
272
305
  { type: "Release", id: "LIST" },
306
+ { type: "Release", id: arg.params.releaseId },
273
307
  { type: "ReleaseAction", id: "LIST" }
274
308
  ]
275
309
  }),
@@ -289,7 +323,7 @@ const releaseApi = createApi({
289
323
  method: "DELETE"
290
324
  };
291
325
  },
292
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
326
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }]
293
327
  })
294
328
  };
295
329
  }
@@ -301,12 +335,29 @@ const {
301
335
  useGetReleaseActionsQuery,
302
336
  useCreateReleaseMutation,
303
337
  useCreateReleaseActionMutation,
338
+ useCreateManyReleaseActionsMutation,
304
339
  useUpdateReleaseMutation,
305
340
  useUpdateReleaseActionMutation,
306
341
  usePublishReleaseMutation,
307
342
  useDeleteReleaseActionMutation,
308
343
  useDeleteReleaseMutation
309
344
  } = releaseApi;
345
+ const getTimezoneOffset = (timezone, date) => {
346
+ try {
347
+ const offsetPart = new Intl.DateTimeFormat("en", {
348
+ timeZone: timezone,
349
+ timeZoneName: "longOffset"
350
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
351
+ const offset = offsetPart ? offsetPart.value : "";
352
+ let utcOffset = offset.replace("GMT", "UTC");
353
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
354
+ utcOffset = `${utcOffset}+00:00`;
355
+ }
356
+ return utcOffset;
357
+ } catch (error) {
358
+ return "";
359
+ }
360
+ };
310
361
  const useTypedDispatch = useDispatch;
311
362
  const useTypedSelector = useSelector;
312
363
  const StyledMenuItem = styled(Menu.Item)`
@@ -377,7 +428,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
377
428
  }
378
429
  };
379
430
  return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
380
- /* @__PURE__ */ jsx(Icon, { as: Cross, padding: 1 }),
431
+ /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
381
432
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
382
433
  id: "content-releases.content-manager-edit-view.remove-from-release",
383
434
  defaultMessage: "Remove from release"
@@ -416,7 +467,7 @@ const ReleaseActionEntryLinkItem = ({
416
467
  pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
417
468
  search: locale && `?plugins[i18n][locale]=${locale}`
418
469
  },
419
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, padding: 1 }),
470
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
420
471
  children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
421
472
  id: "content-releases.content-manager-edit-view.edit-entry",
422
473
  defaultMessage: "Edit entry"
@@ -426,6 +477,21 @@ const ReleaseActionEntryLinkItem = ({
426
477
  }
427
478
  );
428
479
  };
480
+ const EditReleaseItem = ({ releaseId }) => {
481
+ const { formatMessage } = useIntl();
482
+ return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
483
+ Link,
484
+ {
485
+ href: `/admin/plugins/content-releases/${releaseId}`,
486
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
487
+ isExternal: false,
488
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
489
+ id: "content-releases.content-manager-edit-view.edit-release",
490
+ defaultMessage: "Edit release"
491
+ }) })
492
+ }
493
+ ) });
494
+ };
429
495
  const Root = ({ children, hasTriggerBorder = false }) => {
430
496
  const { formatMessage } = useIntl();
431
497
  return (
@@ -450,6 +516,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
450
516
  };
451
517
  const ReleaseActionMenu = {
452
518
  Root,
519
+ EditReleaseItem,
453
520
  DeleteReleaseActionItem,
454
521
  ReleaseActionEntryLinkItem
455
522
  };
@@ -473,19 +540,40 @@ const FieldWrapper = styled(Field)`
473
540
  text-transform: capitalize;
474
541
  }
475
542
 
476
- &:active,
477
543
  &[data-checked='true'] {
478
- color: ${({ theme }) => theme.colors.primary700};
479
- background-color: ${({ theme }) => theme.colors.primary100};
480
- border-color: ${({ theme }) => theme.colors.primary700};
544
+ color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
545
+ background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
546
+ border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
481
547
  }
482
548
 
483
549
  &[data-checked='false'] {
484
550
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
485
551
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
486
552
  }
553
+
554
+ &[data-checked='false'][data-disabled='false']:hover {
555
+ color: ${({ theme }) => theme.colors.neutral700};
556
+ background-color: ${({ theme }) => theme.colors.neutral100};
557
+ border-color: ${({ theme }) => theme.colors.neutral200};
558
+
559
+ & > label {
560
+ cursor: pointer;
561
+ }
562
+ }
563
+
564
+ &[data-disabled='true'] {
565
+ color: ${({ theme }) => theme.colors.neutral600};
566
+ background-color: ${({ theme }) => theme.colors.neutral150};
567
+ border-color: ${({ theme }) => theme.colors.neutral300};
568
+ }
487
569
  `;
488
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
570
+ const ActionOption = ({
571
+ selected,
572
+ actionType,
573
+ handleChange,
574
+ name,
575
+ disabled = false
576
+ }) => {
489
577
  return /* @__PURE__ */ jsx(
490
578
  FieldWrapper,
491
579
  {
@@ -496,6 +584,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
496
584
  position: "relative",
497
585
  cursor: "pointer",
498
586
  "data-checked": selected === actionType,
587
+ "data-disabled": disabled && selected !== actionType,
499
588
  children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
500
589
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
501
590
  FieldInput,
@@ -505,7 +594,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
505
594
  name,
506
595
  checked: selected === actionType,
507
596
  onChange: handleChange,
508
- value: actionType
597
+ value: actionType,
598
+ disabled
509
599
  }
510
600
  ) }),
511
601
  actionType
@@ -513,7 +603,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
513
603
  }
514
604
  );
515
605
  };
516
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
606
+ const ReleaseActionOptions = ({
607
+ selected,
608
+ handleChange,
609
+ name,
610
+ disabled = false
611
+ }) => {
517
612
  return /* @__PURE__ */ jsxs(Flex, { children: [
518
613
  /* @__PURE__ */ jsx(
519
614
  ActionOption,
@@ -521,7 +616,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
521
616
  actionType: "publish",
522
617
  selected,
523
618
  handleChange,
524
- name
619
+ name,
620
+ disabled
525
621
  }
526
622
  ),
527
623
  /* @__PURE__ */ jsx(
@@ -530,7 +626,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
530
626
  actionType: "unpublish",
531
627
  selected,
532
628
  handleChange,
533
- name
629
+ name,
630
+ disabled
534
631
  }
535
632
  )
536
633
  ] });
@@ -574,6 +671,7 @@ const AddActionToReleaseModal = ({
574
671
  contentTypeUid,
575
672
  entryId
576
673
  }) => {
674
+ const releaseHeaderId = React.useId();
577
675
  const { formatMessage } = useIntl();
578
676
  const toggleNotification = useNotification();
579
677
  const { formatAPIError } = useAPIErrorHandler();
@@ -621,8 +719,8 @@ const AddActionToReleaseModal = ({
621
719
  }
622
720
  }
623
721
  };
624
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
625
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
722
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
723
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
626
724
  id: "content-releases.content-manager-edit-view.add-to-release",
627
725
  defaultMessage: "Add to release"
628
726
  }) }) }),
@@ -692,16 +790,18 @@ const AddActionToReleaseModal = ({
692
790
  };
693
791
  const CMReleasesContainer = () => {
694
792
  const [isModalOpen, setIsModalOpen] = React.useState(false);
695
- const { formatMessage } = useIntl();
793
+ const { formatMessage, formatDate, formatTime } = useIntl();
696
794
  const {
697
795
  isCreatingEntry,
698
- allLayoutData: { contentType }
796
+ hasDraftAndPublish,
797
+ initialData: { id: entryId },
798
+ slug
699
799
  } = useCMEditViewDataManager();
700
- const params = useParams();
701
- const canFetch = params?.id != null && contentType?.uid != null;
800
+ const contentTypeUid = slug;
801
+ const canFetch = entryId != null && contentTypeUid != null;
702
802
  const fetchParams = canFetch ? {
703
- contentTypeUid: contentType.uid,
704
- entryId: params.id,
803
+ contentTypeUid,
804
+ entryId,
705
805
  hasEntryAttached: true
706
806
  } : skipToken;
707
807
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -709,7 +809,7 @@ const CMReleasesContainer = () => {
709
809
  if (!canFetch) {
710
810
  return null;
711
811
  }
712
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
812
+ if (isCreatingEntry || !hasDraftAndPublish) {
713
813
  return null;
714
814
  }
715
815
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -776,15 +876,40 @@ const CMReleasesContainer = () => {
776
876
  )
777
877
  }
778
878
  ),
779
- /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
879
+ /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
780
880
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
781
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsx(
782
- ReleaseActionMenu.DeleteReleaseActionItem,
881
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
882
+ {
883
+ id: "content-releases.content-manager-edit-view.scheduled.date",
884
+ defaultMessage: "{date} at {time} ({offset})"
885
+ },
783
886
  {
784
- releaseId: release.id,
785
- actionId: release.action.id
887
+ date: formatDate(new Date(release.scheduledAt), {
888
+ day: "2-digit",
889
+ month: "2-digit",
890
+ year: "numeric",
891
+ timeZone: release.timezone
892
+ }),
893
+ time: formatTime(new Date(release.scheduledAt), {
894
+ hourCycle: "h23",
895
+ timeZone: release.timezone
896
+ }),
897
+ offset: getTimezoneOffset(
898
+ release.timezone,
899
+ new Date(release.scheduledAt)
900
+ )
786
901
  }
787
- ) }) })
902
+ ) }),
903
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
904
+ /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
905
+ /* @__PURE__ */ jsx(
906
+ ReleaseActionMenu.DeleteReleaseActionItem,
907
+ {
908
+ releaseId: release.id,
909
+ actionId: release.action.id
910
+ }
911
+ )
912
+ ] }) })
788
913
  ] })
789
914
  ]
790
915
  },
@@ -812,14 +937,185 @@ const CMReleasesContainer = () => {
812
937
  AddActionToReleaseModal,
813
938
  {
814
939
  handleClose: toggleModal,
815
- contentTypeUid: contentType.uid,
816
- entryId: params.id
940
+ contentTypeUid,
941
+ entryId
817
942
  }
818
943
  )
819
944
  ]
820
945
  }
821
946
  ) });
822
947
  };
948
+ const getContentPermissions = (subject) => {
949
+ const permissions = {
950
+ publish: [
951
+ {
952
+ action: "plugin::content-manager.explorer.publish",
953
+ subject,
954
+ id: "",
955
+ actionParameters: {},
956
+ properties: {},
957
+ conditions: []
958
+ }
959
+ ]
960
+ };
961
+ return permissions;
962
+ };
963
+ const ReleaseAction = ({ ids, model }) => {
964
+ const { formatMessage } = useIntl();
965
+ const toggleNotification = useNotification();
966
+ const { formatAPIError } = useAPIErrorHandler();
967
+ const { modifiedData } = useCMEditViewDataManager();
968
+ const contentPermissions = getContentPermissions(model);
969
+ const {
970
+ allowedActions: { canPublish }
971
+ } = useRBAC(contentPermissions);
972
+ const {
973
+ allowedActions: { canCreate }
974
+ } = useRBAC(PERMISSIONS);
975
+ const response = useGetReleasesQuery();
976
+ const releases = response.data?.data;
977
+ const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
978
+ const handleSubmit = async (values) => {
979
+ const locale = modifiedData.locale;
980
+ const releaseActionEntries = ids.map((id) => ({
981
+ type: values.type,
982
+ entry: {
983
+ contentType: model,
984
+ id,
985
+ locale
986
+ }
987
+ }));
988
+ const response2 = await createManyReleaseActions({
989
+ body: releaseActionEntries,
990
+ params: { releaseId: values.releaseId }
991
+ });
992
+ if ("data" in response2) {
993
+ const notificationMessage = formatMessage(
994
+ {
995
+ id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
996
+ defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
997
+ },
998
+ {
999
+ entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
1000
+ totalEntries: response2.data.meta.totalEntries
1001
+ }
1002
+ );
1003
+ const notification = {
1004
+ type: "success",
1005
+ title: formatMessage(
1006
+ {
1007
+ id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
1008
+ defaultMessage: "Successfully added to release."
1009
+ },
1010
+ {
1011
+ entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
1012
+ totalEntries: response2.data.meta.totalEntries
1013
+ }
1014
+ ),
1015
+ message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
1016
+ };
1017
+ toggleNotification(notification);
1018
+ return true;
1019
+ }
1020
+ if ("error" in response2) {
1021
+ if (isAxiosError$1(response2.error)) {
1022
+ toggleNotification({
1023
+ type: "warning",
1024
+ message: formatAPIError(response2.error)
1025
+ });
1026
+ } else {
1027
+ toggleNotification({
1028
+ type: "warning",
1029
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1030
+ });
1031
+ }
1032
+ }
1033
+ };
1034
+ if (!canCreate || !canPublish)
1035
+ return null;
1036
+ return {
1037
+ actionType: "release",
1038
+ variant: "tertiary",
1039
+ label: formatMessage({
1040
+ id: "content-manager-list-view.add-to-release",
1041
+ defaultMessage: "Add to Release"
1042
+ }),
1043
+ dialog: {
1044
+ type: "modal",
1045
+ title: formatMessage({
1046
+ id: "content-manager-list-view.add-to-release",
1047
+ defaultMessage: "Add to Release"
1048
+ }),
1049
+ content: ({ onClose }) => {
1050
+ return /* @__PURE__ */ jsx(
1051
+ Formik,
1052
+ {
1053
+ onSubmit: async (values) => {
1054
+ const data = await handleSubmit(values);
1055
+ if (data) {
1056
+ return onClose();
1057
+ }
1058
+ },
1059
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
1060
+ initialValues: INITIAL_VALUES,
1061
+ children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
1062
+ releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
1063
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
1064
+ SingleSelect,
1065
+ {
1066
+ required: true,
1067
+ label: formatMessage({
1068
+ id: "content-releases.content-manager-list-view.add-to-release.select-label",
1069
+ defaultMessage: "Select a release"
1070
+ }),
1071
+ placeholder: formatMessage({
1072
+ id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
1073
+ defaultMessage: "Select"
1074
+ }),
1075
+ onChange: (value) => setFieldValue("releaseId", value),
1076
+ value: values.releaseId,
1077
+ children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
1078
+ }
1079
+ ) }),
1080
+ /* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
1081
+ id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
1082
+ defaultMessage: "What do you want to do with these entries?"
1083
+ }) }),
1084
+ /* @__PURE__ */ jsx(
1085
+ ReleaseActionOptions,
1086
+ {
1087
+ selected: values.type,
1088
+ handleChange: (e) => setFieldValue("type", e.target.value),
1089
+ name: "type"
1090
+ }
1091
+ )
1092
+ ] }) }),
1093
+ /* @__PURE__ */ jsx(
1094
+ ModalFooter,
1095
+ {
1096
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
1097
+ id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
1098
+ defaultMessage: "Cancel"
1099
+ }) }),
1100
+ endActions: (
1101
+ /**
1102
+ * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
1103
+ * for yup.string().required(), even when the value is falsy (including empty string)
1104
+ */
1105
+ /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
1106
+ id: "content-releases.content-manager-list-view.add-to-release.continue-button",
1107
+ defaultMessage: "Continue"
1108
+ }) })
1109
+ )
1110
+ }
1111
+ )
1112
+ ] })
1113
+ }
1114
+ );
1115
+ }
1116
+ }
1117
+ };
1118
+ };
823
1119
  const admin = {
824
1120
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
825
1121
  register(app) {
@@ -832,7 +1128,7 @@ const admin = {
832
1128
  defaultMessage: "Releases"
833
1129
  },
834
1130
  async Component() {
835
- const { App } = await import("./App-L1jSxCiL.mjs");
1131
+ const { App } = await import("./App-xQ5ljY7-.mjs");
836
1132
  return App;
837
1133
  },
838
1134
  permissions: PERMISSIONS.main
@@ -845,12 +1141,31 @@ const admin = {
845
1141
  name: `${pluginId}-link`,
846
1142
  Component: CMReleasesContainer
847
1143
  });
1144
+ app.plugins["content-manager"].apis.addBulkAction((actions) => {
1145
+ const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
1146
+ actions.splice(deleteActionIndex, 0, ReleaseAction);
1147
+ return actions;
1148
+ });
1149
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1150
+ app.addMenuLink({
1151
+ to: `/plugins/purchase-content-releases`,
1152
+ icon: PaperPlane,
1153
+ intlLabel: {
1154
+ id: `${pluginId}.plugin.name`,
1155
+ defaultMessage: "Releases"
1156
+ },
1157
+ async Component() {
1158
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-3tRbmbY3.mjs");
1159
+ return PurchaseContentReleases;
1160
+ },
1161
+ lockIcon: true
1162
+ });
848
1163
  }
849
1164
  },
850
1165
  async registerTrads({ locales }) {
851
1166
  const importedTrads = await Promise.all(
852
1167
  locales.map((locale) => {
853
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-MyLPoISH.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1168
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-bpHsnU0n.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
854
1169
  return {
855
1170
  data: prefixPluginTranslations(data, "content-releases"),
856
1171
  locale
@@ -869,19 +1184,20 @@ const admin = {
869
1184
  export {
870
1185
  PERMISSIONS as P,
871
1186
  ReleaseActionOptions as R,
872
- useUpdateReleaseMutation as a,
873
- useDeleteReleaseMutation as b,
874
- usePublishReleaseMutation as c,
875
- useTypedDispatch as d,
876
- useGetReleaseActionsQuery as e,
877
- useUpdateReleaseActionMutation as f,
878
- ReleaseActionMenu as g,
879
- useGetReleasesQuery as h,
1187
+ useCreateReleaseMutation as a,
1188
+ useGetReleaseQuery as b,
1189
+ useUpdateReleaseMutation as c,
1190
+ useDeleteReleaseMutation as d,
1191
+ usePublishReleaseMutation as e,
1192
+ useTypedDispatch as f,
1193
+ getTimezoneOffset as g,
1194
+ useGetReleaseActionsQuery as h,
880
1195
  isAxiosError as i,
881
- useCreateReleaseMutation as j,
882
- admin as k,
1196
+ useUpdateReleaseActionMutation as j,
1197
+ ReleaseActionMenu as k,
1198
+ admin as l,
883
1199
  pluginId as p,
884
1200
  releaseApi as r,
885
- useGetReleaseQuery as u
1201
+ useGetReleasesQuery as u
886
1202
  };
887
- //# sourceMappingURL=index-c4zRX_sg.mjs.map
1203
+ //# sourceMappingURL=index-ifoPtgmH.mjs.map