@strapi/content-releases 0.0.0-experimental.b5b7b8260a4549f3bd7443fbd68be5ccc9857cd7 → 0.0.0-experimental.c5354c231bf2abb4fe353d2ab7812bced4a1c6fa

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 (30) hide show
  1. package/dist/_chunks/{App-AYV8n9jv.js → App-OP70yd5M.js} +784 -435
  2. package/dist/_chunks/App-OP70yd5M.js.map +1 -0
  3. package/dist/_chunks/App-x6Tjj3HN.mjs +1315 -0
  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-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-NFIckO1N.mjs → index-1ejXLtzt.mjs} +367 -48
  14. package/dist/_chunks/index-1ejXLtzt.mjs.map +1 -0
  15. package/dist/_chunks/{index-FYDbIuRi.js → index-ydocdaZ0.js} +355 -36
  16. package/dist/_chunks/index-ydocdaZ0.js.map +1 -0
  17. package/dist/admin/index.js +2 -2
  18. package/dist/admin/index.mjs +3 -3
  19. package/dist/server/index.js +1059 -377
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/index.mjs +1060 -379
  22. package/dist/server/index.mjs.map +1 -1
  23. package/package.json +16 -11
  24. package/dist/_chunks/App-AYV8n9jv.js.map +0 -1
  25. package/dist/_chunks/App-KBaxZVmD.mjs +0 -967
  26. package/dist/_chunks/App-KBaxZVmD.mjs.map +0 -1
  27. package/dist/_chunks/en-MyLPoISH.mjs.map +0 -1
  28. package/dist/_chunks/en-gYDqKYFd.js.map +0 -1
  29. package/dist/_chunks/index-FYDbIuRi.js.map +0 -1
  30. package/dist/_chunks/index-NFIckO1N.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,11 +8,11 @@ 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
- import { useSelector } from "react-redux";
15
14
  import styled from "styled-components";
15
+ import { useDispatch, useSelector } from "react-redux";
16
16
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
17
  const v = glob[path];
18
18
  if (v) {
@@ -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,30 @@ 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
+ };
361
+ const useTypedDispatch = useDispatch;
310
362
  const useTypedSelector = useSelector;
311
363
  const StyledMenuItem = styled(Menu.Item)`
312
364
  &:hover {
@@ -376,7 +428,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
376
428
  }
377
429
  };
378
430
  return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
379
- /* @__PURE__ */ jsx(Icon, { as: Cross, padding: 1 }),
431
+ /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
380
432
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
381
433
  id: "content-releases.content-manager-edit-view.remove-from-release",
382
434
  defaultMessage: "Remove from release"
@@ -415,7 +467,7 @@ const ReleaseActionEntryLinkItem = ({
415
467
  pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
416
468
  search: locale && `?plugins[i18n][locale]=${locale}`
417
469
  },
418
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, padding: 1 }),
470
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
419
471
  children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
420
472
  id: "content-releases.content-manager-edit-view.edit-entry",
421
473
  defaultMessage: "Edit entry"
@@ -425,6 +477,21 @@ const ReleaseActionEntryLinkItem = ({
425
477
  }
426
478
  );
427
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
+ };
428
495
  const Root = ({ children, hasTriggerBorder = false }) => {
429
496
  const { formatMessage } = useIntl();
430
497
  return (
@@ -449,6 +516,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
449
516
  };
450
517
  const ReleaseActionMenu = {
451
518
  Root,
519
+ EditReleaseItem,
452
520
  DeleteReleaseActionItem,
453
521
  ReleaseActionEntryLinkItem
454
522
  };
@@ -472,19 +540,40 @@ const FieldWrapper = styled(Field)`
472
540
  text-transform: capitalize;
473
541
  }
474
542
 
475
- &:active,
476
543
  &[data-checked='true'] {
477
- color: ${({ theme }) => theme.colors.primary700};
478
- background-color: ${({ theme }) => theme.colors.primary100};
479
- 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};
480
547
  }
481
548
 
482
549
  &[data-checked='false'] {
483
550
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
484
551
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
485
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
+ }
486
569
  `;
487
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
570
+ const ActionOption = ({
571
+ selected,
572
+ actionType,
573
+ handleChange,
574
+ name,
575
+ disabled = false
576
+ }) => {
488
577
  return /* @__PURE__ */ jsx(
489
578
  FieldWrapper,
490
579
  {
@@ -495,6 +584,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
495
584
  position: "relative",
496
585
  cursor: "pointer",
497
586
  "data-checked": selected === actionType,
587
+ "data-disabled": disabled && selected !== actionType,
498
588
  children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
499
589
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
500
590
  FieldInput,
@@ -504,7 +594,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
504
594
  name,
505
595
  checked: selected === actionType,
506
596
  onChange: handleChange,
507
- value: actionType
597
+ value: actionType,
598
+ disabled
508
599
  }
509
600
  ) }),
510
601
  actionType
@@ -512,7 +603,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
512
603
  }
513
604
  );
514
605
  };
515
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
606
+ const ReleaseActionOptions = ({
607
+ selected,
608
+ handleChange,
609
+ name,
610
+ disabled = false
611
+ }) => {
516
612
  return /* @__PURE__ */ jsxs(Flex, { children: [
517
613
  /* @__PURE__ */ jsx(
518
614
  ActionOption,
@@ -520,7 +616,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
520
616
  actionType: "publish",
521
617
  selected,
522
618
  handleChange,
523
- name
619
+ name,
620
+ disabled
524
621
  }
525
622
  ),
526
623
  /* @__PURE__ */ jsx(
@@ -529,7 +626,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
529
626
  actionType: "unpublish",
530
627
  selected,
531
628
  handleChange,
532
- name
629
+ name,
630
+ disabled
533
631
  }
534
632
  )
535
633
  ] });
@@ -573,6 +671,7 @@ const AddActionToReleaseModal = ({
573
671
  contentTypeUid,
574
672
  entryId
575
673
  }) => {
674
+ const releaseHeaderId = React.useId();
576
675
  const { formatMessage } = useIntl();
577
676
  const toggleNotification = useNotification();
578
677
  const { formatAPIError } = useAPIErrorHandler();
@@ -620,8 +719,8 @@ const AddActionToReleaseModal = ({
620
719
  }
621
720
  }
622
721
  };
623
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
624
- /* @__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({
625
724
  id: "content-releases.content-manager-edit-view.add-to-release",
626
725
  defaultMessage: "Add to release"
627
726
  }) }) }),
@@ -691,16 +790,18 @@ const AddActionToReleaseModal = ({
691
790
  };
692
791
  const CMReleasesContainer = () => {
693
792
  const [isModalOpen, setIsModalOpen] = React.useState(false);
694
- const { formatMessage } = useIntl();
793
+ const { formatMessage, formatDate, formatTime } = useIntl();
695
794
  const {
696
795
  isCreatingEntry,
697
- allLayoutData: { contentType }
796
+ hasDraftAndPublish,
797
+ initialData: { id: entryId },
798
+ slug
698
799
  } = useCMEditViewDataManager();
699
- const params = useParams();
700
- const canFetch = params?.id != null && contentType?.uid != null;
800
+ const contentTypeUid = slug;
801
+ const canFetch = entryId != null && contentTypeUid != null;
701
802
  const fetchParams = canFetch ? {
702
- contentTypeUid: contentType.uid,
703
- entryId: params.id,
803
+ contentTypeUid,
804
+ entryId,
704
805
  hasEntryAttached: true
705
806
  } : skipToken;
706
807
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -708,7 +809,7 @@ const CMReleasesContainer = () => {
708
809
  if (!canFetch) {
709
810
  return null;
710
811
  }
711
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
812
+ if (isCreatingEntry || !hasDraftAndPublish) {
712
813
  return null;
713
814
  }
714
815
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -775,15 +876,40 @@ const CMReleasesContainer = () => {
775
876
  )
776
877
  }
777
878
  ),
778
- /* @__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: [
779
880
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
780
- /* @__PURE__ */ jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsx(
781
- 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
+ },
782
886
  {
783
- releaseId: release.id,
784
- 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
+ )
785
901
  }
786
- ) })
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
+ ] }) })
787
913
  ] })
788
914
  ]
789
915
  },
@@ -811,18 +937,189 @@ const CMReleasesContainer = () => {
811
937
  AddActionToReleaseModal,
812
938
  {
813
939
  handleClose: toggleModal,
814
- contentTypeUid: contentType.uid,
815
- entryId: params.id
940
+ contentTypeUid,
941
+ entryId
816
942
  }
817
943
  )
818
944
  ]
819
945
  }
820
946
  ) });
821
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
+ };
822
1119
  const admin = {
823
1120
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
824
1121
  register(app) {
825
- if (window.strapi.features.isEnabled("cms-content-releases") && window.strapi.future.isEnabled("contentReleases")) {
1122
+ if (window.strapi.features.isEnabled("cms-content-releases")) {
826
1123
  app.addMenuLink({
827
1124
  to: `/plugins/${pluginId}`,
828
1125
  icon: PaperPlane,
@@ -831,7 +1128,7 @@ const admin = {
831
1128
  defaultMessage: "Releases"
832
1129
  },
833
1130
  async Component() {
834
- const { App } = await import("./App-KBaxZVmD.mjs");
1131
+ const { App } = await import("./App-x6Tjj3HN.mjs");
835
1132
  return App;
836
1133
  },
837
1134
  permissions: PERMISSIONS.main
@@ -844,12 +1141,31 @@ const admin = {
844
1141
  name: `${pluginId}-link`,
845
1142
  Component: CMReleasesContainer
846
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
+ });
847
1163
  }
848
1164
  },
849
1165
  async registerTrads({ locales }) {
850
1166
  const importedTrads = await Promise.all(
851
1167
  locales.map((locale) => {
852
- 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 }) => {
853
1169
  return {
854
1170
  data: prefixPluginTranslations(data, "content-releases"),
855
1171
  locale
@@ -868,17 +1184,20 @@ const admin = {
868
1184
  export {
869
1185
  PERMISSIONS as P,
870
1186
  ReleaseActionOptions as R,
871
- useUpdateReleaseMutation as a,
872
- useDeleteReleaseMutation as b,
873
- usePublishReleaseMutation as c,
874
- useGetReleaseActionsQuery as d,
875
- useUpdateReleaseActionMutation as e,
876
- ReleaseActionMenu as f,
877
- useGetReleasesQuery as g,
878
- useCreateReleaseMutation 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,
879
1195
  isAxiosError as i,
880
- admin as j,
1196
+ useUpdateReleaseActionMutation as j,
1197
+ ReleaseActionMenu as k,
1198
+ admin as l,
881
1199
  pluginId as p,
882
- useGetReleaseQuery as u
1200
+ releaseApi as r,
1201
+ useGetReleasesQuery as u
883
1202
  };
884
- //# sourceMappingURL=index-NFIckO1N.mjs.map
1203
+ //# sourceMappingURL=index-1ejXLtzt.mjs.map