@strapi/content-releases 0.0.0-next.c5f067b5650921187770124e9b6c8186e805e242 → 0.0.0-next.cb00a1799402728de4ecec6d52a815e33fcedaf3

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-5PsAyVt2.js → App--3HPsVgM.js} +728 -459
  2. package/dist/_chunks/App--3HPsVgM.js.map +1 -0
  3. package/dist/_chunks/{App-3ycH2d3s.mjs → App-CRNZU_DZ.mjs} +738 -470
  4. package/dist/_chunks/App-CRNZU_DZ.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-2DuPv5k0.js → en-3SGjiVyR.js} +26 -7
  10. package/dist/_chunks/en-3SGjiVyR.js.map +1 -0
  11. package/dist/_chunks/{en-SOqjCdyh.mjs → en-bpHsnU0n.mjs} +26 -7
  12. package/dist/_chunks/en-bpHsnU0n.mjs.map +1 -0
  13. package/dist/_chunks/{index-4gUWuCQV.mjs → index-_wu9g0yG.mjs} +332 -37
  14. package/dist/_chunks/index-_wu9g0yG.mjs.map +1 -0
  15. package/dist/_chunks/{index-D57Rztnc.js → index-xV3jXcZj.js} +320 -25
  16. package/dist/_chunks/index-xV3jXcZj.js.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 +962 -408
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/index.mjs +961 -408
  22. package/dist/server/index.mjs.map +1 -1
  23. package/package.json +15 -12
  24. package/dist/_chunks/App-3ycH2d3s.mjs.map +0 -1
  25. package/dist/_chunks/App-5PsAyVt2.js.map +0 -1
  26. package/dist/_chunks/en-2DuPv5k0.js.map +0 -1
  27. package/dist/_chunks/en-SOqjCdyh.mjs.map +0 -1
  28. package/dist/_chunks/index-4gUWuCQV.mjs.map +0 -1
  29. package/dist/_chunks/index-D57Rztnc.js.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";
@@ -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 {
@@ -288,8 +301,9 @@ const releaseApi = createApi({
288
301
  method: "DELETE"
289
302
  };
290
303
  },
291
- invalidatesTags: [
304
+ invalidatesTags: (result, error, arg) => [
292
305
  { type: "Release", id: "LIST" },
306
+ { type: "Release", id: arg.params.releaseId },
293
307
  { type: "ReleaseAction", id: "LIST" }
294
308
  ]
295
309
  }),
@@ -309,7 +323,7 @@ const releaseApi = createApi({
309
323
  method: "DELETE"
310
324
  };
311
325
  },
312
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
326
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }]
313
327
  })
314
328
  };
315
329
  }
@@ -321,12 +335,29 @@ const {
321
335
  useGetReleaseActionsQuery,
322
336
  useCreateReleaseMutation,
323
337
  useCreateReleaseActionMutation,
338
+ useCreateManyReleaseActionsMutation,
324
339
  useUpdateReleaseMutation,
325
340
  useUpdateReleaseActionMutation,
326
341
  usePublishReleaseMutation,
327
342
  useDeleteReleaseActionMutation,
328
343
  useDeleteReleaseMutation
329
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
+ };
330
361
  const useTypedDispatch = useDispatch;
331
362
  const useTypedSelector = useSelector;
332
363
  const StyledMenuItem = styled(Menu.Item)`
@@ -397,7 +428,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
397
428
  }
398
429
  };
399
430
  return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
400
- /* @__PURE__ */ jsx(Icon, { as: Cross, padding: 1 }),
431
+ /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
401
432
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
402
433
  id: "content-releases.content-manager-edit-view.remove-from-release",
403
434
  defaultMessage: "Remove from release"
@@ -436,7 +467,7 @@ const ReleaseActionEntryLinkItem = ({
436
467
  pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
437
468
  search: locale && `?plugins[i18n][locale]=${locale}`
438
469
  },
439
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, padding: 1 }),
470
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
440
471
  children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
441
472
  id: "content-releases.content-manager-edit-view.edit-entry",
442
473
  defaultMessage: "Edit entry"
@@ -446,6 +477,21 @@ const ReleaseActionEntryLinkItem = ({
446
477
  }
447
478
  );
448
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
+ };
449
495
  const Root = ({ children, hasTriggerBorder = false }) => {
450
496
  const { formatMessage } = useIntl();
451
497
  return (
@@ -470,6 +516,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
470
516
  };
471
517
  const ReleaseActionMenu = {
472
518
  Root,
519
+ EditReleaseItem,
473
520
  DeleteReleaseActionItem,
474
521
  ReleaseActionEntryLinkItem
475
522
  };
@@ -493,19 +540,40 @@ const FieldWrapper = styled(Field)`
493
540
  text-transform: capitalize;
494
541
  }
495
542
 
496
- &:active,
497
543
  &[data-checked='true'] {
498
- color: ${({ theme }) => theme.colors.primary700};
499
- background-color: ${({ theme }) => theme.colors.primary100};
500
- 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};
501
547
  }
502
548
 
503
549
  &[data-checked='false'] {
504
550
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
505
551
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
506
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
+ }
507
569
  `;
508
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
570
+ const ActionOption = ({
571
+ selected,
572
+ actionType,
573
+ handleChange,
574
+ name,
575
+ disabled = false
576
+ }) => {
509
577
  return /* @__PURE__ */ jsx(
510
578
  FieldWrapper,
511
579
  {
@@ -516,6 +584,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
516
584
  position: "relative",
517
585
  cursor: "pointer",
518
586
  "data-checked": selected === actionType,
587
+ "data-disabled": disabled && selected !== actionType,
519
588
  children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
520
589
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
521
590
  FieldInput,
@@ -525,7 +594,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
525
594
  name,
526
595
  checked: selected === actionType,
527
596
  onChange: handleChange,
528
- value: actionType
597
+ value: actionType,
598
+ disabled
529
599
  }
530
600
  ) }),
531
601
  actionType
@@ -533,7 +603,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
533
603
  }
534
604
  );
535
605
  };
536
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
606
+ const ReleaseActionOptions = ({
607
+ selected,
608
+ handleChange,
609
+ name,
610
+ disabled = false
611
+ }) => {
537
612
  return /* @__PURE__ */ jsxs(Flex, { children: [
538
613
  /* @__PURE__ */ jsx(
539
614
  ActionOption,
@@ -541,7 +616,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
541
616
  actionType: "publish",
542
617
  selected,
543
618
  handleChange,
544
- name
619
+ name,
620
+ disabled
545
621
  }
546
622
  ),
547
623
  /* @__PURE__ */ jsx(
@@ -550,7 +626,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
550
626
  actionType: "unpublish",
551
627
  selected,
552
628
  handleChange,
553
- name
629
+ name,
630
+ disabled
554
631
  }
555
632
  )
556
633
  ] });
@@ -594,6 +671,7 @@ const AddActionToReleaseModal = ({
594
671
  contentTypeUid,
595
672
  entryId
596
673
  }) => {
674
+ const releaseHeaderId = React.useId();
597
675
  const { formatMessage } = useIntl();
598
676
  const toggleNotification = useNotification();
599
677
  const { formatAPIError } = useAPIErrorHandler();
@@ -641,8 +719,8 @@ const AddActionToReleaseModal = ({
641
719
  }
642
720
  }
643
721
  };
644
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
645
- /* @__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({
646
724
  id: "content-releases.content-manager-edit-view.add-to-release",
647
725
  defaultMessage: "Add to release"
648
726
  }) }) }),
@@ -712,7 +790,7 @@ const AddActionToReleaseModal = ({
712
790
  };
713
791
  const CMReleasesContainer = () => {
714
792
  const [isModalOpen, setIsModalOpen] = React.useState(false);
715
- const { formatMessage } = useIntl();
793
+ const { formatMessage, formatDate, formatTime } = useIntl();
716
794
  const {
717
795
  isCreatingEntry,
718
796
  hasDraftAndPublish,
@@ -798,15 +876,40 @@ const CMReleasesContainer = () => {
798
876
  )
799
877
  }
800
878
  ),
801
- /* @__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: [
802
880
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
803
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsx(
804
- 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
+ },
805
886
  {
806
- releaseId: release.id,
807
- 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
+ )
808
901
  }
809
- ) }) })
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
+ ] }) })
810
913
  ] })
811
914
  ]
812
915
  },
@@ -842,9 +945,181 @@ const CMReleasesContainer = () => {
842
945
  }
843
946
  ) });
844
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
+ };
845
1119
  const admin = {
846
1120
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
847
1121
  register(app) {
1122
+ app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
848
1123
  if (window.strapi.features.isEnabled("cms-content-releases")) {
849
1124
  app.addMenuLink({
850
1125
  to: `/plugins/${pluginId}`,
@@ -854,7 +1129,7 @@ const admin = {
854
1129
  defaultMessage: "Releases"
855
1130
  },
856
1131
  async Component() {
857
- const { App } = await import("./App-3ycH2d3s.mjs");
1132
+ const { App } = await import("./App-CRNZU_DZ.mjs");
858
1133
  return App;
859
1134
  },
860
1135
  permissions: PERMISSIONS.main
@@ -867,12 +1142,31 @@ const admin = {
867
1142
  name: `${pluginId}-link`,
868
1143
  Component: CMReleasesContainer
869
1144
  });
1145
+ app.plugins["content-manager"].apis.addBulkAction((actions) => {
1146
+ const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
1147
+ actions.splice(deleteActionIndex, 0, ReleaseAction);
1148
+ return actions;
1149
+ });
1150
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1151
+ app.addMenuLink({
1152
+ to: `/plugins/purchase-content-releases`,
1153
+ icon: PaperPlane,
1154
+ intlLabel: {
1155
+ id: `${pluginId}.plugin.name`,
1156
+ defaultMessage: "Releases"
1157
+ },
1158
+ async Component() {
1159
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-3tRbmbY3.mjs");
1160
+ return PurchaseContentReleases;
1161
+ },
1162
+ lockIcon: true
1163
+ });
870
1164
  }
871
1165
  },
872
1166
  async registerTrads({ locales }) {
873
1167
  const importedTrads = await Promise.all(
874
1168
  locales.map((locale) => {
875
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-SOqjCdyh.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1169
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-bpHsnU0n.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
876
1170
  return {
877
1171
  data: prefixPluginTranslations(data, "content-releases"),
878
1172
  locale
@@ -891,19 +1185,20 @@ const admin = {
891
1185
  export {
892
1186
  PERMISSIONS as P,
893
1187
  ReleaseActionOptions as R,
894
- useUpdateReleaseMutation as a,
895
- useDeleteReleaseMutation as b,
896
- usePublishReleaseMutation as c,
897
- useTypedDispatch as d,
898
- useGetReleaseActionsQuery as e,
899
- useUpdateReleaseActionMutation as f,
900
- ReleaseActionMenu as g,
901
- useGetReleasesQuery as h,
1188
+ useCreateReleaseMutation as a,
1189
+ useGetReleaseQuery as b,
1190
+ useUpdateReleaseMutation as c,
1191
+ useDeleteReleaseMutation as d,
1192
+ usePublishReleaseMutation as e,
1193
+ useTypedDispatch as f,
1194
+ getTimezoneOffset as g,
1195
+ useGetReleaseActionsQuery as h,
902
1196
  isAxiosError as i,
903
- useCreateReleaseMutation as j,
904
- admin as k,
1197
+ useUpdateReleaseActionMutation as j,
1198
+ ReleaseActionMenu as k,
1199
+ admin as l,
905
1200
  pluginId as p,
906
1201
  releaseApi as r,
907
- useGetReleaseQuery as u
1202
+ useGetReleasesQuery as u
908
1203
  };
909
- //# sourceMappingURL=index-4gUWuCQV.mjs.map
1204
+ //# sourceMappingURL=index-_wu9g0yG.mjs.map