@strapi/content-releases 0.0.0-experimental.d362bf200f5f9359a4bbd4a549603de5ee1f04ca → 0.0.0-experimental.d5b46d578a5c055b8dcc66939e1b5d540976fafb

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 (108) hide show
  1. package/dist/_chunks/{App-1LckaIGY.js → App-OP70yd5M.js} +210 -224
  2. package/dist/_chunks/App-OP70yd5M.js.map +1 -0
  3. package/dist/_chunks/{App-X01LBg5V.mjs → App-x6Tjj3HN.mjs} +202 -216
  4. package/dist/_chunks/App-x6Tjj3HN.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +2 -2
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-bpIYXOfu.js} +2 -2
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-faJDuv3q.js → en-3SGjiVyR.js} +10 -2
  10. package/dist/_chunks/en-3SGjiVyR.js.map +1 -0
  11. package/dist/_chunks/{en-RdapH-9X.mjs → en-bpHsnU0n.mjs} +10 -2
  12. package/dist/_chunks/en-bpHsnU0n.mjs.map +1 -0
  13. package/dist/_chunks/{index-OD9AlD-6.mjs → index-1ejXLtzt.mjs} +273 -103
  14. package/dist/_chunks/index-1ejXLtzt.mjs.map +1 -0
  15. package/dist/_chunks/{index-cYWov2wa.js → index-ydocdaZ0.js} +270 -100
  16. package/dist/_chunks/index-ydocdaZ0.js.map +1 -0
  17. package/dist/admin/index.js +15 -1
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +16 -2
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/server/index.js +62 -60
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +62 -61
  24. package/dist/server/index.mjs.map +1 -1
  25. package/package.json +28 -21
  26. package/dist/_chunks/App-1LckaIGY.js.map +0 -1
  27. package/dist/_chunks/App-X01LBg5V.mjs.map +0 -1
  28. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  29. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  30. package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
  31. package/dist/_chunks/en-faJDuv3q.js.map +0 -1
  32. package/dist/_chunks/index-OD9AlD-6.mjs.map +0 -1
  33. package/dist/_chunks/index-cYWov2wa.js.map +0 -1
  34. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  35. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  36. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  37. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  38. package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
  39. package/dist/admin/src/constants.d.ts +0 -58
  40. package/dist/admin/src/index.d.ts +0 -3
  41. package/dist/admin/src/pages/App.d.ts +0 -1
  42. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  43. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  44. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  45. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  46. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  47. package/dist/admin/src/pluginId.d.ts +0 -1
  48. package/dist/admin/src/services/axios.d.ts +0 -29
  49. package/dist/admin/src/services/release.d.ts +0 -369
  50. package/dist/admin/src/store/hooks.d.ts +0 -7
  51. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
  52. package/dist/admin/src/utils/time.d.ts +0 -1
  53. package/dist/server/src/bootstrap.d.ts +0 -5
  54. package/dist/server/src/bootstrap.d.ts.map +0 -1
  55. package/dist/server/src/constants.d.ts +0 -12
  56. package/dist/server/src/constants.d.ts.map +0 -1
  57. package/dist/server/src/content-types/index.d.ts +0 -99
  58. package/dist/server/src/content-types/index.d.ts.map +0 -1
  59. package/dist/server/src/content-types/release/index.d.ts +0 -48
  60. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  61. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  62. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  63. package/dist/server/src/content-types/release-action/index.d.ts +0 -50
  64. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  65. package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
  66. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  67. package/dist/server/src/controllers/index.d.ts +0 -19
  68. package/dist/server/src/controllers/index.d.ts.map +0 -1
  69. package/dist/server/src/controllers/release-action.d.ts +0 -10
  70. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  71. package/dist/server/src/controllers/release.d.ts +0 -11
  72. package/dist/server/src/controllers/release.d.ts.map +0 -1
  73. package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
  74. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  75. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  76. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  77. package/dist/server/src/destroy.d.ts +0 -5
  78. package/dist/server/src/destroy.d.ts.map +0 -1
  79. package/dist/server/src/index.d.ts +0 -2095
  80. package/dist/server/src/index.d.ts.map +0 -1
  81. package/dist/server/src/migrations/index.d.ts +0 -13
  82. package/dist/server/src/migrations/index.d.ts.map +0 -1
  83. package/dist/server/src/register.d.ts +0 -5
  84. package/dist/server/src/register.d.ts.map +0 -1
  85. package/dist/server/src/routes/index.d.ts +0 -35
  86. package/dist/server/src/routes/index.d.ts.map +0 -1
  87. package/dist/server/src/routes/release-action.d.ts +0 -18
  88. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  89. package/dist/server/src/routes/release.d.ts +0 -18
  90. package/dist/server/src/routes/release.d.ts.map +0 -1
  91. package/dist/server/src/services/index.d.ts +0 -1826
  92. package/dist/server/src/services/index.d.ts.map +0 -1
  93. package/dist/server/src/services/release.d.ts +0 -66
  94. package/dist/server/src/services/release.d.ts.map +0 -1
  95. package/dist/server/src/services/scheduling.d.ts +0 -18
  96. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  97. package/dist/server/src/services/validation.d.ts +0 -18
  98. package/dist/server/src/services/validation.d.ts.map +0 -1
  99. package/dist/server/src/utils/index.d.ts +0 -14
  100. package/dist/server/src/utils/index.d.ts.map +0 -1
  101. package/dist/shared/contracts/release-actions.d.ts +0 -131
  102. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  103. package/dist/shared/contracts/releases.d.ts +0 -166
  104. package/dist/shared/contracts/releases.d.ts.map +0 -1
  105. package/dist/shared/types.d.ts +0 -24
  106. package/dist/shared/types.d.ts.map +0 -1
  107. package/dist/shared/validation-schemas.d.ts +0 -2
  108. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
+ const helperPlugin = require("@strapi/helper-plugin");
2
3
  const icons = require("@strapi/icons");
3
4
  const jsxRuntime = require("react/jsx-runtime");
4
5
  const React = require("react");
5
6
  const query = require("@reduxjs/toolkit/query");
6
- const strapiAdmin = require("@strapi/admin/strapi-admin");
7
7
  const designSystem = require("@strapi/design-system");
8
8
  const v2 = require("@strapi/design-system/v2");
9
9
  const axios = require("axios");
@@ -13,6 +13,7 @@ const reactRouterDom = require("react-router-dom");
13
13
  const yup = require("yup");
14
14
  const react = require("@reduxjs/toolkit/query/react");
15
15
  const styled = require("styled-components");
16
+ const reactRedux = require("react-redux");
16
17
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
17
18
  function _interopNamespace(e) {
18
19
  if (e && e.__esModule)
@@ -124,7 +125,7 @@ const axiosBaseQuery = async ({
124
125
  config
125
126
  }) => {
126
127
  try {
127
- const { get, post, del, put } = strapiAdmin.getFetchClient();
128
+ const { get, post, del, put } = helperPlugin.getFetchClient();
128
129
  if (method === "POST") {
129
130
  const result2 = await post(url, data, config);
130
131
  return { data: result2.data };
@@ -273,6 +274,19 @@ const releaseApi = react.createApi({
273
274
  { type: "ReleaseAction", id: "LIST" }
274
275
  ]
275
276
  }),
277
+ createManyReleaseActions: build.mutation({
278
+ query({ body, params }) {
279
+ return {
280
+ url: `/content-releases/${params.releaseId}/actions/bulk`,
281
+ method: "POST",
282
+ data: body
283
+ };
284
+ },
285
+ invalidatesTags: [
286
+ { type: "Release", id: "LIST" },
287
+ { type: "ReleaseAction", id: "LIST" }
288
+ ]
289
+ }),
276
290
  updateReleaseAction: build.mutation({
277
291
  query({ body, params }) {
278
292
  return {
@@ -344,6 +358,7 @@ const {
344
358
  useGetReleaseActionsQuery,
345
359
  useCreateReleaseMutation,
346
360
  useCreateReleaseActionMutation,
361
+ useCreateManyReleaseActionsMutation,
347
362
  useUpdateReleaseMutation,
348
363
  useUpdateReleaseActionMutation,
349
364
  usePublishReleaseMutation,
@@ -366,6 +381,8 @@ const getTimezoneOffset = (timezone, date) => {
366
381
  return "";
367
382
  }
368
383
  };
384
+ const useTypedDispatch = reactRedux.useDispatch;
385
+ const useTypedSelector = reactRedux.useSelector;
369
386
  const StyledMenuItem = styled__default.default(v2.Menu.Item)`
370
387
  &:hover {
371
388
  background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
@@ -402,12 +419,9 @@ const StyledIconButton = styled__default.default(designSystem.IconButton)`
402
419
  `;
403
420
  const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
404
421
  const { formatMessage } = reactIntl.useIntl();
405
- const { toggleNotification } = strapiAdmin.useNotification();
406
- const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
422
+ const toggleNotification = helperPlugin.useNotification();
423
+ const { formatAPIError } = helperPlugin.useAPIErrorHandler();
407
424
  const [deleteReleaseAction] = useDeleteReleaseActionMutation();
408
- const {
409
- allowedActions: { canDeleteAction }
410
- } = strapiAdmin.useRBAC(PERMISSIONS);
411
425
  const handleDeleteAction = async () => {
412
426
  const response = await deleteReleaseAction({
413
427
  params: { releaseId, actionId }
@@ -425,27 +439,24 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
425
439
  if ("error" in response) {
426
440
  if (axios.isAxiosError(response.error)) {
427
441
  toggleNotification({
428
- type: "danger",
442
+ type: "warning",
429
443
  message: formatAPIError(response.error)
430
444
  });
431
445
  } else {
432
446
  toggleNotification({
433
- type: "danger",
447
+ type: "warning",
434
448
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
435
449
  });
436
450
  }
437
451
  }
438
452
  };
439
- if (!canDeleteAction) {
440
- return null;
441
- }
442
- return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
453
+ return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
443
454
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Cross, width: 3, height: 3 }),
444
455
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
445
456
  id: "content-releases.content-manager-edit-view.remove-from-release",
446
457
  defaultMessage: "Remove from release"
447
458
  }) })
448
- ] }) });
459
+ ] }) }) });
449
460
  };
450
461
  const ReleaseActionEntryLinkItem = ({
451
462
  contentTypeUid,
@@ -453,44 +464,41 @@ const ReleaseActionEntryLinkItem = ({
453
464
  locale
454
465
  }) => {
455
466
  const { formatMessage } = reactIntl.useIntl();
456
- const userPermissions = strapiAdmin.useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
457
- const canUpdateEntryForLocale = React__namespace.useMemo(() => {
458
- const updatePermissions = userPermissions.find(
459
- (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
460
- );
461
- if (!updatePermissions) {
462
- return false;
463
- }
464
- return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
465
- }, [contentTypeUid, locale, userPermissions]);
466
- const {
467
- allowedActions: { canUpdateContentType }
468
- } = strapiAdmin.useRBAC({
469
- updateContentType: [
470
- {
471
- action: "plugin::content-manager.explorer.update",
472
- subject: contentTypeUid
473
- }
474
- ]
475
- });
476
- if (!canUpdateContentType || !canUpdateEntryForLocale) {
477
- return null;
478
- }
479
- return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
480
- v2.Link,
467
+ const collectionTypePermissions = useTypedSelector(
468
+ (state) => state.rbacProvider.collectionTypesRelatedPermissions
469
+ );
470
+ const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
471
+ const canUpdateEntryForLocale = Boolean(
472
+ !locale || updatePermissions?.find(
473
+ (permission) => permission.properties?.locales?.includes(locale)
474
+ )
475
+ );
476
+ return /* @__PURE__ */ jsxRuntime.jsx(
477
+ helperPlugin.CheckPermissions,
481
478
  {
482
- as: reactRouterDom.NavLink,
483
- to: {
484
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
485
- search: locale && `?plugins[i18n][locale]=${locale}`
486
- },
487
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, width: 3, height: 3 }),
488
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
489
- id: "content-releases.content-manager-edit-view.edit-entry",
490
- defaultMessage: "Edit entry"
491
- }) })
479
+ permissions: [
480
+ {
481
+ action: "plugin::content-manager.explorer.update",
482
+ subject: contentTypeUid
483
+ }
484
+ ],
485
+ children: canUpdateEntryForLocale && /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
486
+ v2.Link,
487
+ {
488
+ as: reactRouterDom.NavLink,
489
+ to: {
490
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
491
+ search: locale && `?plugins[i18n][locale]=${locale}`
492
+ },
493
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, width: 3, height: 3 }),
494
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
495
+ id: "content-releases.content-manager-edit-view.edit-entry",
496
+ defaultMessage: "Edit entry"
497
+ }) })
498
+ }
499
+ ) })
492
500
  }
493
- ) });
501
+ );
494
502
  };
495
503
  const EditReleaseItem = ({ releaseId }) => {
496
504
  const { formatMessage } = reactIntl.useIntl();
@@ -509,10 +517,9 @@ const EditReleaseItem = ({ releaseId }) => {
509
517
  };
510
518
  const Root = ({ children, hasTriggerBorder = false }) => {
511
519
  const { formatMessage } = reactIntl.useIntl();
512
- const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
513
520
  return (
514
521
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
515
- allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
522
+ /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
516
523
  /* @__PURE__ */ jsxRuntime.jsx(
517
524
  v2.Menu.Trigger,
518
525
  {
@@ -527,7 +534,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
527
534
  }
528
535
  ),
529
536
  /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
530
- ] }) : null
537
+ ] }) })
531
538
  );
532
539
  };
533
540
  const ReleaseActionMenu = {
@@ -659,13 +666,12 @@ const INITIAL_VALUES = {
659
666
  const NoReleases = () => {
660
667
  const { formatMessage } = reactIntl.useIntl();
661
668
  return /* @__PURE__ */ jsxRuntime.jsx(
662
- designSystem.EmptyStateLayout,
669
+ helperPlugin.NoContent,
663
670
  {
664
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.EmptyDocuments, { width: "10rem" }),
665
- content: formatMessage({
671
+ content: {
666
672
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
667
673
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
668
- }),
674
+ },
669
675
  action: /* @__PURE__ */ jsxRuntime.jsx(
670
676
  v2.LinkButton,
671
677
  {
@@ -690,10 +696,9 @@ const AddActionToReleaseModal = ({
690
696
  }) => {
691
697
  const releaseHeaderId = React__namespace.useId();
692
698
  const { formatMessage } = reactIntl.useIntl();
693
- const { toggleNotification } = strapiAdmin.useNotification();
694
- const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
695
- const [{ query: query2 }] = strapiAdmin.useQueryParams();
696
- const locale = query2.plugins?.i18n?.locale;
699
+ const toggleNotification = helperPlugin.useNotification();
700
+ const { formatAPIError } = helperPlugin.useAPIErrorHandler();
701
+ const { modifiedData } = helperPlugin.useCMEditViewDataManager();
697
702
  const response = useGetReleasesForEntryQuery({
698
703
  contentTypeUid,
699
704
  entryId,
@@ -702,6 +707,7 @@ const AddActionToReleaseModal = ({
702
707
  const releases = response.data?.data;
703
708
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
704
709
  const handleSubmit = async (values) => {
710
+ const locale = modifiedData.locale;
705
711
  const releaseActionEntry = {
706
712
  contentType: contentTypeUid,
707
713
  id: entryId,
@@ -725,12 +731,12 @@ const AddActionToReleaseModal = ({
725
731
  if ("error" in response2) {
726
732
  if (axios.isAxiosError(response2.error)) {
727
733
  toggleNotification({
728
- type: "danger",
734
+ type: "warning",
729
735
  message: formatAPIError(response2.error)
730
736
  });
731
737
  } else {
732
738
  toggleNotification({
733
- type: "danger",
739
+ type: "warning",
734
740
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
735
741
  });
736
742
  }
@@ -808,21 +814,17 @@ const AddActionToReleaseModal = ({
808
814
  const CMReleasesContainer = () => {
809
815
  const [isModalOpen, setIsModalOpen] = React__namespace.useState(false);
810
816
  const { formatMessage, formatDate, formatTime } = reactIntl.useIntl();
811
- const { id, slug, collectionType } = reactRouterDom.useParams();
812
- const isCreatingEntry = id === "create";
813
817
  const {
814
- allowedActions: { canCreateAction, canMain, canDeleteAction }
815
- } = strapiAdmin.useRBAC(PERMISSIONS);
816
- const { schema } = strapiAdmin.unstable_useDocument({
817
- collectionType,
818
- model: slug
819
- });
820
- const hasDraftAndPublish = schema?.options?.draftAndPublish;
818
+ isCreatingEntry,
819
+ hasDraftAndPublish,
820
+ initialData: { id: entryId },
821
+ slug
822
+ } = helperPlugin.useCMEditViewDataManager();
821
823
  const contentTypeUid = slug;
822
- const canFetch = id != null && contentTypeUid != null;
824
+ const canFetch = entryId != null && contentTypeUid != null;
823
825
  const fetchParams = canFetch ? {
824
826
  contentTypeUid,
825
- entryId: id,
827
+ entryId,
826
828
  hasEntryAttached: true
827
829
  } : query.skipToken;
828
830
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -840,10 +842,7 @@ const CMReleasesContainer = () => {
840
842
  }
841
843
  return `success${shade}`;
842
844
  };
843
- if (!canMain) {
844
- return null;
845
- }
846
- return /* @__PURE__ */ jsxRuntime.jsxs(
845
+ return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(
847
846
  designSystem.Box,
848
847
  {
849
848
  as: "aside",
@@ -900,7 +899,7 @@ const CMReleasesContainer = () => {
900
899
  )
901
900
  }
902
901
  ),
903
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
902
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
904
903
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
905
904
  release.scheduledAt && release.timezone && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
906
905
  {
@@ -924,7 +923,7 @@ const CMReleasesContainer = () => {
924
923
  )
925
924
  }
926
925
  ) }),
927
- canDeleteAction ? /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
926
+ /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
928
927
  /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
929
928
  /* @__PURE__ */ jsxRuntime.jsx(
930
929
  ReleaseActionMenu.DeleteReleaseActionItem,
@@ -933,14 +932,14 @@ const CMReleasesContainer = () => {
933
932
  actionId: release.action.id
934
933
  }
935
934
  )
936
- ] }) : null
937
- ] }) })
935
+ ] }) })
936
+ ] })
938
937
  ]
939
938
  },
940
939
  release.id
941
940
  );
942
941
  }),
943
- canCreateAction ? /* @__PURE__ */ jsxRuntime.jsx(
942
+ /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsxRuntime.jsx(
944
943
  designSystem.Button,
945
944
  {
946
945
  justifyContent: "center",
@@ -955,41 +954,206 @@ const CMReleasesContainer = () => {
955
954
  defaultMessage: "Add to release"
956
955
  })
957
956
  }
958
- ) : null
957
+ ) })
959
958
  ] }),
960
959
  isModalOpen && /* @__PURE__ */ jsxRuntime.jsx(
961
960
  AddActionToReleaseModal,
962
961
  {
963
962
  handleClose: toggleModal,
964
963
  contentTypeUid,
965
- entryId: id
964
+ entryId
966
965
  }
967
966
  )
968
967
  ]
969
968
  }
970
- );
969
+ ) });
971
970
  };
972
- const prefixPluginTranslations = (trad, pluginId2) => {
973
- if (!pluginId2) {
974
- throw new TypeError("pluginId can't be empty");
975
- }
976
- return Object.keys(trad).reduce((acc, current) => {
977
- acc[`${pluginId2}.${current}`] = trad[current];
978
- return acc;
979
- }, {});
971
+ const getContentPermissions = (subject) => {
972
+ const permissions = {
973
+ publish: [
974
+ {
975
+ action: "plugin::content-manager.explorer.publish",
976
+ subject,
977
+ id: "",
978
+ actionParameters: {},
979
+ properties: {},
980
+ conditions: []
981
+ }
982
+ ]
983
+ };
984
+ return permissions;
985
+ };
986
+ const ReleaseAction = ({ ids, model }) => {
987
+ const { formatMessage } = reactIntl.useIntl();
988
+ const toggleNotification = helperPlugin.useNotification();
989
+ const { formatAPIError } = helperPlugin.useAPIErrorHandler();
990
+ const { modifiedData } = helperPlugin.useCMEditViewDataManager();
991
+ const contentPermissions = getContentPermissions(model);
992
+ const {
993
+ allowedActions: { canPublish }
994
+ } = helperPlugin.useRBAC(contentPermissions);
995
+ const {
996
+ allowedActions: { canCreate }
997
+ } = helperPlugin.useRBAC(PERMISSIONS);
998
+ const response = useGetReleasesQuery();
999
+ const releases = response.data?.data;
1000
+ const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
1001
+ const handleSubmit = async (values) => {
1002
+ const locale = modifiedData.locale;
1003
+ const releaseActionEntries = ids.map((id) => ({
1004
+ type: values.type,
1005
+ entry: {
1006
+ contentType: model,
1007
+ id,
1008
+ locale
1009
+ }
1010
+ }));
1011
+ const response2 = await createManyReleaseActions({
1012
+ body: releaseActionEntries,
1013
+ params: { releaseId: values.releaseId }
1014
+ });
1015
+ if ("data" in response2) {
1016
+ const notificationMessage = formatMessage(
1017
+ {
1018
+ id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
1019
+ defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
1020
+ },
1021
+ {
1022
+ entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
1023
+ totalEntries: response2.data.meta.totalEntries
1024
+ }
1025
+ );
1026
+ const notification = {
1027
+ type: "success",
1028
+ title: formatMessage(
1029
+ {
1030
+ id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
1031
+ defaultMessage: "Successfully added to release."
1032
+ },
1033
+ {
1034
+ entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
1035
+ totalEntries: response2.data.meta.totalEntries
1036
+ }
1037
+ ),
1038
+ message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
1039
+ };
1040
+ toggleNotification(notification);
1041
+ return true;
1042
+ }
1043
+ if ("error" in response2) {
1044
+ if (axios.isAxiosError(response2.error)) {
1045
+ toggleNotification({
1046
+ type: "warning",
1047
+ message: formatAPIError(response2.error)
1048
+ });
1049
+ } else {
1050
+ toggleNotification({
1051
+ type: "warning",
1052
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1053
+ });
1054
+ }
1055
+ }
1056
+ };
1057
+ if (!canCreate || !canPublish)
1058
+ return null;
1059
+ return {
1060
+ actionType: "release",
1061
+ variant: "tertiary",
1062
+ label: formatMessage({
1063
+ id: "content-manager-list-view.add-to-release",
1064
+ defaultMessage: "Add to Release"
1065
+ }),
1066
+ dialog: {
1067
+ type: "modal",
1068
+ title: formatMessage({
1069
+ id: "content-manager-list-view.add-to-release",
1070
+ defaultMessage: "Add to Release"
1071
+ }),
1072
+ content: ({ onClose }) => {
1073
+ return /* @__PURE__ */ jsxRuntime.jsx(
1074
+ formik.Formik,
1075
+ {
1076
+ onSubmit: async (values) => {
1077
+ const data = await handleSubmit(values);
1078
+ if (data) {
1079
+ return onClose();
1080
+ }
1081
+ },
1082
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
1083
+ initialValues: INITIAL_VALUES,
1084
+ children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { children: [
1085
+ releases?.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(NoReleases, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalBody, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
1086
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsx(
1087
+ designSystem.SingleSelect,
1088
+ {
1089
+ required: true,
1090
+ label: formatMessage({
1091
+ id: "content-releases.content-manager-list-view.add-to-release.select-label",
1092
+ defaultMessage: "Select a release"
1093
+ }),
1094
+ placeholder: formatMessage({
1095
+ id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
1096
+ defaultMessage: "Select"
1097
+ }),
1098
+ onChange: (value) => setFieldValue("releaseId", value),
1099
+ value: values.releaseId,
1100
+ children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: release.id, children: release.name }, release.id))
1101
+ }
1102
+ ) }),
1103
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.FieldLabel, { children: formatMessage({
1104
+ id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
1105
+ defaultMessage: "What do you want to do with these entries?"
1106
+ }) }),
1107
+ /* @__PURE__ */ jsxRuntime.jsx(
1108
+ ReleaseActionOptions,
1109
+ {
1110
+ selected: values.type,
1111
+ handleChange: (e) => setFieldValue("type", e.target.value),
1112
+ name: "type"
1113
+ }
1114
+ )
1115
+ ] }) }),
1116
+ /* @__PURE__ */ jsxRuntime.jsx(
1117
+ designSystem.ModalFooter,
1118
+ {
1119
+ startActions: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
1120
+ id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
1121
+ defaultMessage: "Cancel"
1122
+ }) }),
1123
+ endActions: (
1124
+ /**
1125
+ * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
1126
+ * for yup.string().required(), even when the value is falsy (including empty string)
1127
+ */
1128
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
1129
+ id: "content-releases.content-manager-list-view.add-to-release.continue-button",
1130
+ defaultMessage: "Continue"
1131
+ }) })
1132
+ )
1133
+ }
1134
+ )
1135
+ ] })
1136
+ }
1137
+ );
1138
+ }
1139
+ }
1140
+ };
980
1141
  };
981
1142
  const admin = {
982
1143
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
983
1144
  register(app) {
984
1145
  if (window.strapi.features.isEnabled("cms-content-releases")) {
985
1146
  app.addMenuLink({
986
- to: `plugins/${pluginId}`,
1147
+ to: `/plugins/${pluginId}`,
987
1148
  icon: icons.PaperPlane,
988
1149
  intlLabel: {
989
1150
  id: `${pluginId}.plugin.name`,
990
1151
  defaultMessage: "Releases"
991
1152
  },
992
- Component: () => Promise.resolve().then(() => require("./App-1LckaIGY.js")).then((mod) => ({ default: mod.App })),
1153
+ async Component() {
1154
+ const { App } = await Promise.resolve().then(() => require("./App-OP70yd5M.js"));
1155
+ return App;
1156
+ },
993
1157
  permissions: PERMISSIONS.main
994
1158
  });
995
1159
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -1000,6 +1164,11 @@ const admin = {
1000
1164
  name: `${pluginId}-link`,
1001
1165
  Component: CMReleasesContainer
1002
1166
  });
1167
+ app.plugins["content-manager"].apis.addBulkAction((actions) => {
1168
+ const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
1169
+ actions.splice(deleteActionIndex, 0, ReleaseAction);
1170
+ return actions;
1171
+ });
1003
1172
  } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1004
1173
  app.addMenuLink({
1005
1174
  to: `/plugins/purchase-content-releases`,
@@ -1009,7 +1178,7 @@ const admin = {
1009
1178
  defaultMessage: "Releases"
1010
1179
  },
1011
1180
  async Component() {
1012
- const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-YhAPgpG9.js"));
1181
+ const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-bpIYXOfu.js"));
1013
1182
  return PurchaseContentReleases;
1014
1183
  },
1015
1184
  lockIcon: true
@@ -1019,9 +1188,9 @@ const admin = {
1019
1188
  async registerTrads({ locales }) {
1020
1189
  const importedTrads = await Promise.all(
1021
1190
  locales.map((locale) => {
1022
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-faJDuv3q.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1191
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-3SGjiVyR.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1023
1192
  return {
1024
- data: prefixPluginTranslations(data, "content-releases"),
1193
+ data: helperPlugin.prefixPluginTranslations(data, "content-releases"),
1025
1194
  locale
1026
1195
  };
1027
1196
  }).catch(() => {
@@ -1049,6 +1218,7 @@ exports.useGetReleaseActionsQuery = useGetReleaseActionsQuery;
1049
1218
  exports.useGetReleaseQuery = useGetReleaseQuery;
1050
1219
  exports.useGetReleasesQuery = useGetReleasesQuery;
1051
1220
  exports.usePublishReleaseMutation = usePublishReleaseMutation;
1221
+ exports.useTypedDispatch = useTypedDispatch;
1052
1222
  exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
1053
1223
  exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
1054
- //# sourceMappingURL=index-cYWov2wa.js.map
1224
+ //# sourceMappingURL=index-ydocdaZ0.js.map