@strapi/content-releases 0.0.0-experimental.cae3a5a17d131a6f59673b62d01cfac869ea9cc2 → 0.0.0-experimental.cf82c830d8a75c9f35466f4c6010fb588d34063f

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-iqqoPnBO.js → App-OP70yd5M.js} +696 -433
  2. package/dist/_chunks/App-OP70yd5M.js.map +1 -0
  3. package/dist/_chunks/{App-_Jj3tWts.mjs → App-x6Tjj3HN.mjs} +704 -442
  4. package/dist/_chunks/App-x6Tjj3HN.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-bsuc8ZwZ.mjs → index-1ejXLtzt.mjs} +342 -46
  14. package/dist/_chunks/index-1ejXLtzt.mjs.map +1 -0
  15. package/dist/_chunks/{index-_lT-gI3M.js → index-ydocdaZ0.js} +329 -33
  16. package/dist/_chunks/index-ydocdaZ0.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 +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 +15 -12
  24. package/dist/_chunks/App-_Jj3tWts.mjs.map +0 -1
  25. package/dist/_chunks/App-iqqoPnBO.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-_lT-gI3M.js.map +0 -1
  29. package/dist/_chunks/index-bsuc8ZwZ.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 {
@@ -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,16 +790,18 @@ 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
- allLayoutData: { contentType }
796
+ hasDraftAndPublish,
797
+ initialData: { id: entryId },
798
+ slug
719
799
  } = useCMEditViewDataManager();
720
- const params = useParams();
721
- const canFetch = params?.id != null && contentType?.uid != null;
800
+ const contentTypeUid = slug;
801
+ const canFetch = entryId != null && contentTypeUid != null;
722
802
  const fetchParams = canFetch ? {
723
- contentTypeUid: contentType.uid,
724
- entryId: params.id,
803
+ contentTypeUid,
804
+ entryId,
725
805
  hasEntryAttached: true
726
806
  } : skipToken;
727
807
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -729,7 +809,7 @@ const CMReleasesContainer = () => {
729
809
  if (!canFetch) {
730
810
  return null;
731
811
  }
732
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
812
+ if (isCreatingEntry || !hasDraftAndPublish) {
733
813
  return null;
734
814
  }
735
815
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -796,15 +876,40 @@ const CMReleasesContainer = () => {
796
876
  )
797
877
  }
798
878
  ),
799
- /* @__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: [
800
880
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
801
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsx(
802
- ReleaseActionMenu.DeleteReleaseActionItem,
881
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
803
882
  {
804
- releaseId: release.id,
805
- actionId: release.action.id
883
+ id: "content-releases.content-manager-edit-view.scheduled.date",
884
+ defaultMessage: "{date} at {time} ({offset})"
885
+ },
886
+ {
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
+ )
806
901
  }
807
- ) }) })
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
+ ] }) })
808
913
  ] })
809
914
  ]
810
915
  },
@@ -832,14 +937,185 @@ const CMReleasesContainer = () => {
832
937
  AddActionToReleaseModal,
833
938
  {
834
939
  handleClose: toggleModal,
835
- contentTypeUid: contentType.uid,
836
- entryId: params.id
940
+ contentTypeUid,
941
+ entryId
837
942
  }
838
943
  )
839
944
  ]
840
945
  }
841
946
  ) });
842
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
+ };
843
1119
  const admin = {
844
1120
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
845
1121
  register(app) {
@@ -852,7 +1128,7 @@ const admin = {
852
1128
  defaultMessage: "Releases"
853
1129
  },
854
1130
  async Component() {
855
- const { App } = await import("./App-_Jj3tWts.mjs");
1131
+ const { App } = await import("./App-x6Tjj3HN.mjs");
856
1132
  return App;
857
1133
  },
858
1134
  permissions: PERMISSIONS.main
@@ -865,12 +1141,31 @@ const admin = {
865
1141
  name: `${pluginId}-link`,
866
1142
  Component: CMReleasesContainer
867
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
+ });
868
1163
  }
869
1164
  },
870
1165
  async registerTrads({ locales }) {
871
1166
  const importedTrads = await Promise.all(
872
1167
  locales.map((locale) => {
873
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-SOqjCdyh.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 }) => {
874
1169
  return {
875
1170
  data: prefixPluginTranslations(data, "content-releases"),
876
1171
  locale
@@ -889,19 +1184,20 @@ const admin = {
889
1184
  export {
890
1185
  PERMISSIONS as P,
891
1186
  ReleaseActionOptions as R,
892
- useUpdateReleaseMutation as a,
893
- useDeleteReleaseMutation as b,
894
- usePublishReleaseMutation as c,
895
- useTypedDispatch as d,
896
- useGetReleaseActionsQuery as e,
897
- useUpdateReleaseActionMutation as f,
898
- ReleaseActionMenu as g,
899
- 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,
900
1195
  isAxiosError as i,
901
- useCreateReleaseMutation as j,
902
- admin as k,
1196
+ useUpdateReleaseActionMutation as j,
1197
+ ReleaseActionMenu as k,
1198
+ admin as l,
903
1199
  pluginId as p,
904
1200
  releaseApi as r,
905
- useGetReleaseQuery as u
1201
+ useGetReleasesQuery as u
906
1202
  };
907
- //# sourceMappingURL=index-bsuc8ZwZ.mjs.map
1203
+ //# sourceMappingURL=index-1ejXLtzt.mjs.map