@strapi/content-releases 0.0.0-experimental.d00dc50c81bce037c4321a90cc2f790eb3c51acb → 0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403

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-gu1aiP6i.mjs → App-Cmn2Mkn7.mjs} +213 -200
  2. package/dist/_chunks/App-Cmn2Mkn7.mjs.map +1 -0
  3. package/dist/_chunks/{App-HjWtUYmc.js → App-FVorrIzF.js} +224 -211
  4. package/dist/_chunks/App-FVorrIzF.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-C8djn9fP.mjs} +1 -1
  6. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs.map → PurchaseContentReleases-C8djn9fP.mjs.map} +1 -1
  7. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-sD6ADHk2.js} +1 -1
  8. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js.map → PurchaseContentReleases-sD6ADHk2.js.map} +1 -1
  9. package/dist/_chunks/{en-ltT1TlKQ.mjs → en-B9Ur3VsE.mjs} +1 -1
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-HrREghh3.js → en-DtFJ5ViE.js} +1 -1
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-ZNwxYN8H.js → index-BfJLth9Z.js} +120 -189
  14. package/dist/_chunks/index-BfJLth9Z.js.map +1 -0
  15. package/dist/_chunks/{index-mvj9PSKd.mjs → index-DDohgTaQ.mjs} +125 -194
  16. package/dist/_chunks/index-DDohgTaQ.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -15
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +2 -16
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
  22. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  23. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  24. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  25. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  26. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  27. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  28. package/dist/admin/src/constants.d.ts +58 -0
  29. package/dist/admin/src/index.d.ts +3 -0
  30. package/dist/admin/src/pages/App.d.ts +1 -0
  31. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  32. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  33. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  34. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  35. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  36. package/dist/admin/src/pluginId.d.ts +1 -0
  37. package/dist/admin/src/services/axios.d.ts +29 -0
  38. package/dist/admin/src/services/release.d.ts +429 -0
  39. package/dist/admin/src/store/hooks.d.ts +7 -0
  40. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  41. package/dist/admin/src/utils/time.d.ts +1 -0
  42. package/dist/server/index.js +83 -86
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +84 -86
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/server/src/bootstrap.d.ts +5 -0
  47. package/dist/server/src/bootstrap.d.ts.map +1 -0
  48. package/dist/server/src/constants.d.ts +12 -0
  49. package/dist/server/src/constants.d.ts.map +1 -0
  50. package/dist/server/src/content-types/index.d.ts +99 -0
  51. package/dist/server/src/content-types/index.d.ts.map +1 -0
  52. package/dist/server/src/content-types/release/index.d.ts +48 -0
  53. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  54. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  55. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  56. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  57. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  58. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  59. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  60. package/dist/server/src/controllers/index.d.ts +20 -0
  61. package/dist/server/src/controllers/index.d.ts.map +1 -0
  62. package/dist/server/src/controllers/release-action.d.ts +10 -0
  63. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  64. package/dist/server/src/controllers/release.d.ts +12 -0
  65. package/dist/server/src/controllers/release.d.ts.map +1 -0
  66. package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
  67. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  68. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  69. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  70. package/dist/server/src/destroy.d.ts +5 -0
  71. package/dist/server/src/destroy.d.ts.map +1 -0
  72. package/dist/server/src/index.d.ts +2096 -0
  73. package/dist/server/src/index.d.ts.map +1 -0
  74. package/dist/server/src/migrations/index.d.ts +13 -0
  75. package/dist/server/src/migrations/index.d.ts.map +1 -0
  76. package/dist/server/src/register.d.ts +5 -0
  77. package/dist/server/src/register.d.ts.map +1 -0
  78. package/dist/server/src/routes/index.d.ts +35 -0
  79. package/dist/server/src/routes/index.d.ts.map +1 -0
  80. package/dist/server/src/routes/release-action.d.ts +18 -0
  81. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  82. package/dist/server/src/routes/release.d.ts +18 -0
  83. package/dist/server/src/routes/release.d.ts.map +1 -0
  84. package/dist/server/src/services/index.d.ts +1826 -0
  85. package/dist/server/src/services/index.d.ts.map +1 -0
  86. package/dist/server/src/services/release.d.ts +66 -0
  87. package/dist/server/src/services/release.d.ts.map +1 -0
  88. package/dist/server/src/services/scheduling.d.ts +18 -0
  89. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  90. package/dist/server/src/services/validation.d.ts +18 -0
  91. package/dist/server/src/services/validation.d.ts.map +1 -0
  92. package/dist/server/src/utils/index.d.ts +14 -0
  93. package/dist/server/src/utils/index.d.ts.map +1 -0
  94. package/dist/shared/contracts/release-actions.d.ts +131 -0
  95. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  96. package/dist/shared/contracts/releases.d.ts +182 -0
  97. package/dist/shared/contracts/releases.d.ts.map +1 -0
  98. package/dist/shared/types.d.ts +24 -0
  99. package/dist/shared/types.d.ts.map +1 -0
  100. package/dist/shared/validation-schemas.d.ts +2 -0
  101. package/dist/shared/validation-schemas.d.ts.map +1 -0
  102. package/package.json +26 -31
  103. package/dist/_chunks/App-HjWtUYmc.js.map +0 -1
  104. package/dist/_chunks/App-gu1aiP6i.mjs.map +0 -1
  105. package/dist/_chunks/en-HrREghh3.js.map +0 -1
  106. package/dist/_chunks/en-ltT1TlKQ.mjs.map +0 -1
  107. package/dist/_chunks/index-ZNwxYN8H.js.map +0 -1
  108. package/dist/_chunks/index-mvj9PSKd.mjs.map +0 -1
@@ -1,18 +1,18 @@
1
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, useRBAC, SortIcon, prefixPluginTranslations } from "@strapi/helper-plugin";
2
- import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
1
+ import { Cross, Pencil, More, Plus, EmptyDocuments, PaperPlane } from "@strapi/icons";
3
2
  import { jsx, jsxs } from "react/jsx-runtime";
4
3
  import * as React from "react";
5
4
  import { skipToken } from "@reduxjs/toolkit/query";
6
- import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button as Button$1, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter, Popover } from "@strapi/design-system";
5
+ import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, useQueryParams } from "@strapi/admin/strapi-admin";
6
+ import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, EmptyStateLayout, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
7
  import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
+ import { unstable_useDocument } from "@strapi/plugin-content-manager/strapi-admin";
8
9
  import { isAxiosError as isAxiosError$1 } from "axios";
9
10
  import { Formik, Form } from "formik";
10
11
  import { useIntl } from "react-intl";
11
- import { NavLink, Link as Link$1 } from "react-router-dom";
12
+ import { NavLink, useParams, Link as Link$1 } from "react-router-dom";
12
13
  import * as yup from "yup";
13
14
  import { createApi } from "@reduxjs/toolkit/query/react";
14
15
  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) {
@@ -376,8 +376,6 @@ const getTimezoneOffset = (timezone, date) => {
376
376
  return "";
377
377
  }
378
378
  };
379
- const useTypedDispatch = useDispatch;
380
- const useTypedSelector = useSelector;
381
379
  const StyledMenuItem = styled(Menu.Item)`
382
380
  &:hover {
383
381
  background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
@@ -414,9 +412,12 @@ const StyledIconButton = styled(IconButton)`
414
412
  `;
415
413
  const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
416
414
  const { formatMessage } = useIntl();
417
- const toggleNotification = useNotification();
415
+ const { toggleNotification } = useNotification();
418
416
  const { formatAPIError } = useAPIErrorHandler();
419
417
  const [deleteReleaseAction] = useDeleteReleaseActionMutation();
418
+ const {
419
+ allowedActions: { canDeleteAction }
420
+ } = useRBAC(PERMISSIONS);
420
421
  const handleDeleteAction = async () => {
421
422
  const response = await deleteReleaseAction({
422
423
  params: { releaseId, actionId }
@@ -434,24 +435,27 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
434
435
  if ("error" in response) {
435
436
  if (isAxiosError$1(response.error)) {
436
437
  toggleNotification({
437
- type: "warning",
438
+ type: "danger",
438
439
  message: formatAPIError(response.error)
439
440
  });
440
441
  } else {
441
442
  toggleNotification({
442
- type: "warning",
443
+ type: "danger",
443
444
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
444
445
  });
445
446
  }
446
447
  }
447
448
  };
448
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
449
+ if (!canDeleteAction) {
450
+ return null;
451
+ }
452
+ return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
449
453
  /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
450
454
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
451
455
  id: "content-releases.content-manager-edit-view.remove-from-release",
452
456
  defaultMessage: "Remove from release"
453
457
  }) })
454
- ] }) }) });
458
+ ] }) });
455
459
  };
456
460
  const ReleaseActionEntryLinkItem = ({
457
461
  contentTypeUid,
@@ -459,41 +463,44 @@ const ReleaseActionEntryLinkItem = ({
459
463
  locale
460
464
  }) => {
461
465
  const { formatMessage } = useIntl();
462
- const collectionTypePermissions = useTypedSelector(
463
- (state) => state.rbacProvider.collectionTypesRelatedPermissions
464
- );
465
- const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
466
- const canUpdateEntryForLocale = Boolean(
467
- !locale || updatePermissions?.find(
468
- (permission) => permission.properties?.locales?.includes(locale)
469
- )
470
- );
471
- return /* @__PURE__ */ jsx(
472
- CheckPermissions,
466
+ const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
467
+ const canUpdateEntryForLocale = React.useMemo(() => {
468
+ const updatePermissions = userPermissions.find(
469
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
470
+ );
471
+ if (!updatePermissions) {
472
+ return false;
473
+ }
474
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
475
+ }, [contentTypeUid, locale, userPermissions]);
476
+ const {
477
+ allowedActions: { canUpdate: canUpdateContentType }
478
+ } = useRBAC({
479
+ updateContentType: [
480
+ {
481
+ action: "plugin::content-manager.explorer.update",
482
+ subject: contentTypeUid
483
+ }
484
+ ]
485
+ });
486
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
487
+ return null;
488
+ }
489
+ return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
490
+ Link,
473
491
  {
474
- permissions: [
475
- {
476
- action: "plugin::content-manager.explorer.update",
477
- subject: contentTypeUid
478
- }
479
- ],
480
- children: canUpdateEntryForLocale && /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
481
- Link,
482
- {
483
- as: NavLink,
484
- to: {
485
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
486
- search: locale && `?plugins[i18n][locale]=${locale}`
487
- },
488
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
489
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
490
- id: "content-releases.content-manager-edit-view.edit-entry",
491
- defaultMessage: "Edit entry"
492
- }) })
493
- }
494
- ) })
492
+ as: NavLink,
493
+ to: {
494
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
495
+ search: locale && `?plugins[i18n][locale]=${locale}`
496
+ },
497
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
498
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
499
+ id: "content-releases.content-manager-edit-view.edit-entry",
500
+ defaultMessage: "Edit entry"
501
+ }) })
495
502
  }
496
- );
503
+ ) });
497
504
  };
498
505
  const EditReleaseItem = ({ releaseId }) => {
499
506
  const { formatMessage } = useIntl();
@@ -512,9 +519,10 @@ const EditReleaseItem = ({ releaseId }) => {
512
519
  };
513
520
  const Root = ({ children, hasTriggerBorder = false }) => {
514
521
  const { formatMessage } = useIntl();
522
+ const { allowedActions } = useRBAC(PERMISSIONS);
515
523
  return (
516
524
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
517
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
525
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
518
526
  /* @__PURE__ */ jsx(
519
527
  Menu.Trigger,
520
528
  {
@@ -529,7 +537,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
529
537
  }
530
538
  ),
531
539
  /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
532
- ] }) })
540
+ ] }) : null
533
541
  );
534
542
  };
535
543
  const ReleaseActionMenu = {
@@ -661,12 +669,13 @@ const INITIAL_VALUES = {
661
669
  const NoReleases = () => {
662
670
  const { formatMessage } = useIntl();
663
671
  return /* @__PURE__ */ jsx(
664
- NoContent,
672
+ EmptyStateLayout,
665
673
  {
666
- content: {
674
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
675
+ content: formatMessage({
667
676
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
668
677
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
669
- },
678
+ }),
670
679
  action: /* @__PURE__ */ jsx(
671
680
  LinkButton,
672
681
  {
@@ -691,9 +700,10 @@ const AddActionToReleaseModal = ({
691
700
  }) => {
692
701
  const releaseHeaderId = React.useId();
693
702
  const { formatMessage } = useIntl();
694
- const toggleNotification = useNotification();
703
+ const { toggleNotification } = useNotification();
695
704
  const { formatAPIError } = useAPIErrorHandler();
696
- const { modifiedData } = useCMEditViewDataManager();
705
+ const [{ query }] = useQueryParams();
706
+ const locale = query.plugins?.i18n?.locale;
697
707
  const response = useGetReleasesForEntryQuery({
698
708
  contentTypeUid,
699
709
  entryId,
@@ -702,7 +712,6 @@ const AddActionToReleaseModal = ({
702
712
  const releases = response.data?.data;
703
713
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
704
714
  const handleSubmit = async (values) => {
705
- const locale = modifiedData.locale;
706
715
  const releaseActionEntry = {
707
716
  contentType: contentTypeUid,
708
717
  id: entryId,
@@ -726,12 +735,12 @@ const AddActionToReleaseModal = ({
726
735
  if ("error" in response2) {
727
736
  if (isAxiosError$1(response2.error)) {
728
737
  toggleNotification({
729
- type: "warning",
738
+ type: "danger",
730
739
  message: formatAPIError(response2.error)
731
740
  });
732
741
  } else {
733
742
  toggleNotification({
734
- type: "warning",
743
+ type: "danger",
735
744
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
736
745
  });
737
746
  }
@@ -784,7 +793,7 @@ const AddActionToReleaseModal = ({
784
793
  /* @__PURE__ */ jsx(
785
794
  ModalFooter,
786
795
  {
787
- startActions: /* @__PURE__ */ jsx(Button$1, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
796
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
788
797
  id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
789
798
  defaultMessage: "Cancel"
790
799
  }) }),
@@ -793,7 +802,7 @@ const AddActionToReleaseModal = ({
793
802
  * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
794
803
  * for yup.string().required(), even when the value is falsy (including empty string)
795
804
  */
796
- /* @__PURE__ */ jsx(Button$1, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
805
+ /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
797
806
  id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
798
807
  defaultMessage: "Continue"
799
808
  }) })
@@ -809,17 +818,20 @@ const AddActionToReleaseModal = ({
809
818
  const CMReleasesContainer = () => {
810
819
  const [isModalOpen, setIsModalOpen] = React.useState(false);
811
820
  const { formatMessage, formatDate, formatTime } = useIntl();
812
- const {
813
- isCreatingEntry,
814
- hasDraftAndPublish,
815
- initialData: { id: entryId },
816
- slug
817
- } = useCMEditViewDataManager();
821
+ const { id, slug, collectionType } = useParams();
822
+ const isCreatingEntry = id === "create";
823
+ const { allowedActions } = useRBAC(PERMISSIONS);
824
+ const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
825
+ const { schema } = unstable_useDocument({
826
+ collectionType,
827
+ model: slug
828
+ });
829
+ const hasDraftAndPublish = schema?.options?.draftAndPublish;
818
830
  const contentTypeUid = slug;
819
- const canFetch = entryId != null && contentTypeUid != null;
831
+ const canFetch = id != null && contentTypeUid != null;
820
832
  const fetchParams = canFetch ? {
821
833
  contentTypeUid,
822
- entryId,
834
+ entryId: id,
823
835
  hasEntryAttached: true
824
836
  } : skipToken;
825
837
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -837,7 +849,10 @@ const CMReleasesContainer = () => {
837
849
  }
838
850
  return `success${shade}`;
839
851
  };
840
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(
852
+ if (!canMain) {
853
+ return null;
854
+ }
855
+ return /* @__PURE__ */ jsxs(
841
856
  Box,
842
857
  {
843
858
  as: "aside",
@@ -894,7 +909,7 @@ const CMReleasesContainer = () => {
894
909
  )
895
910
  }
896
911
  ),
897
- /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
912
+ /* @__PURE__ */ jsx(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
898
913
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
899
914
  release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
900
915
  {
@@ -918,7 +933,7 @@ const CMReleasesContainer = () => {
918
933
  )
919
934
  }
920
935
  ) }),
921
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
936
+ canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
922
937
  /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
923
938
  /* @__PURE__ */ jsx(
924
939
  ReleaseActionMenu.DeleteReleaseActionItem,
@@ -927,15 +942,15 @@ const CMReleasesContainer = () => {
927
942
  actionId: release.actions[0].id
928
943
  }
929
944
  )
930
- ] }) })
931
- ] })
945
+ ] }) : null
946
+ ] }) })
932
947
  ]
933
948
  },
934
949
  release.id
935
950
  );
936
951
  }),
937
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
938
- Button$1,
952
+ canCreateAction ? /* @__PURE__ */ jsx(
953
+ Button,
939
954
  {
940
955
  justifyContent: "center",
941
956
  paddingLeft: 4,
@@ -949,19 +964,19 @@ const CMReleasesContainer = () => {
949
964
  defaultMessage: "Add to release"
950
965
  })
951
966
  }
952
- ) })
967
+ ) : null
953
968
  ] }),
954
969
  isModalOpen && /* @__PURE__ */ jsx(
955
970
  AddActionToReleaseModal,
956
971
  {
957
972
  handleClose: toggleModal,
958
973
  contentTypeUid,
959
- entryId
974
+ entryId: id
960
975
  }
961
976
  )
962
977
  ]
963
978
  }
964
- ) });
979
+ );
965
980
  };
966
981
  const getContentPermissions = (subject) => {
967
982
  const permissions = {
@@ -978,11 +993,11 @@ const getContentPermissions = (subject) => {
978
993
  };
979
994
  return permissions;
980
995
  };
981
- const ReleaseAction = ({ ids, model }) => {
996
+ const ReleaseAction = ({ documentIds, model }) => {
982
997
  const { formatMessage } = useIntl();
983
- const toggleNotification = useNotification();
998
+ const { toggleNotification } = useNotification();
984
999
  const { formatAPIError } = useAPIErrorHandler();
985
- const { modifiedData } = useCMEditViewDataManager();
1000
+ const [{ query }] = useQueryParams();
986
1001
  const contentPermissions = getContentPermissions(model);
987
1002
  const {
988
1003
  allowedActions: { canPublish }
@@ -994,15 +1009,17 @@ const ReleaseAction = ({ ids, model }) => {
994
1009
  const releases = response.data?.data;
995
1010
  const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
996
1011
  const handleSubmit = async (values) => {
997
- const locale = modifiedData.locale;
998
- const releaseActionEntries = ids.map((id) => ({
999
- type: values.type,
1000
- entry: {
1001
- contentType: model,
1002
- id,
1003
- locale
1004
- }
1005
- }));
1012
+ const locale = query.plugins?.i18n?.locale;
1013
+ const releaseActionEntries = documentIds.map(
1014
+ (id) => ({
1015
+ type: values.type,
1016
+ entry: {
1017
+ contentType: model,
1018
+ id,
1019
+ locale
1020
+ }
1021
+ })
1022
+ );
1006
1023
  const response2 = await createManyReleaseActions({
1007
1024
  body: releaseActionEntries,
1008
1025
  params: { releaseId: values.releaseId }
@@ -1111,7 +1128,7 @@ const ReleaseAction = ({ ids, model }) => {
1111
1128
  /* @__PURE__ */ jsx(
1112
1129
  ModalFooter,
1113
1130
  {
1114
- startActions: /* @__PURE__ */ jsx(Button$1, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
1131
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
1115
1132
  id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
1116
1133
  defaultMessage: "Cancel"
1117
1134
  }) }),
@@ -1120,7 +1137,7 @@ const ReleaseAction = ({ ids, model }) => {
1120
1137
  * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
1121
1138
  * for yup.string().required(), even when the value is falsy (including empty string)
1122
1139
  */
1123
- /* @__PURE__ */ jsx(Button$1, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
1140
+ /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
1124
1141
  id: "content-releases.content-manager-list-view.add-to-release.continue-button",
1125
1142
  defaultMessage: "Continue"
1126
1143
  }) })
@@ -1134,96 +1151,14 @@ const ReleaseAction = ({ ids, model }) => {
1134
1151
  }
1135
1152
  };
1136
1153
  };
1137
- const Button = styled.button`
1138
- svg {
1139
- > g,
1140
- path {
1141
- fill: ${({ theme }) => theme.colors.neutral500};
1142
- }
1143
- }
1144
- &:hover {
1145
- svg {
1146
- > g,
1147
- path {
1148
- fill: ${({ theme }) => theme.colors.neutral600};
1149
- }
1150
- }
1151
- }
1152
- &:active {
1153
- svg {
1154
- > g,
1155
- path {
1156
- fill: ${({ theme }) => theme.colors.neutral400};
1157
- }
1158
- }
1159
- }
1160
- `;
1161
- const ActionWrapper = styled(Flex)`
1162
- svg {
1163
- height: ${4 / 16}rem;
1164
- }
1165
- `;
1166
- const useReleasesList = (entryId) => {
1167
- const { uid: contentTypeUid } = useTypedSelector(
1168
- (state) => state["content-manager_listView"].contentType
1169
- );
1170
- const listViewData = useTypedSelector((state) => state["content-manager_listView"].data);
1171
- const entriesIds = listViewData.map((entry) => entry.id);
1172
- const response = useGetMappedEntriesInReleasesQuery(
1173
- { contentTypeUid, entriesIds },
1174
- { skip: !entriesIds || !contentTypeUid || entriesIds.length === 0 }
1175
- );
1176
- const mappedEntriesInReleases = response.data || {};
1177
- return mappedEntriesInReleases?.[entryId] || [];
1178
- };
1179
- const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1180
- const { contentType } = layout;
1181
- if (!contentType.options?.draftAndPublish) {
1182
- return { displayedHeaders, layout };
1154
+ const prefixPluginTranslations = (trad, pluginId2) => {
1155
+ if (!pluginId2) {
1156
+ throw new TypeError("pluginId can't be empty");
1183
1157
  }
1184
- return {
1185
- displayedHeaders: [
1186
- ...displayedHeaders,
1187
- {
1188
- key: "__release_key__",
1189
- fieldSchema: { type: "string" },
1190
- metadatas: { label: "To be released in", searchable: true, sortable: false },
1191
- name: "releasedAt",
1192
- cellFormatter: (props) => /* @__PURE__ */ jsx(ReleaseListCell, { ...props })
1193
- }
1194
- ],
1195
- layout
1196
- };
1197
- };
1198
- const ReleaseListCell = ({ id }) => {
1199
- const releases = useReleasesList(id);
1200
- const [visible, setVisible] = React.useState(false);
1201
- const buttonRef = React.useRef(null);
1202
- const { formatMessage } = useIntl();
1203
- const handleTogglePopover = () => setVisible((prev) => !prev);
1204
- return /* @__PURE__ */ jsx(Flex, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(Button, { type: "button", onClick: handleTogglePopover, ref: buttonRef, children: /* @__PURE__ */ jsxs(ActionWrapper, { height: "2rem", width: "2rem", children: [
1205
- /* @__PURE__ */ jsx(Typography, { style: { maxWidth: "252px", cursor: "pointer" }, textColor: "neutral800", children: releases.length > 0 ? formatMessage(
1206
- {
1207
- id: "content-releases.content-manager.list-view.releases-number",
1208
- defaultMessage: "{number} {number, plural, one {release} other {releases}}"
1209
- },
1210
- {
1211
- number: releases.length
1212
- }
1213
- ) : "-" }),
1214
- /* @__PURE__ */ jsxs(Flex, { children: [
1215
- releases.length > 0 && /* @__PURE__ */ jsx(SortIcon, {}),
1216
- visible && /* @__PURE__ */ jsx(
1217
- Popover,
1218
- {
1219
- onDismiss: handleTogglePopover,
1220
- source: buttonRef,
1221
- spacing: 16,
1222
- children: /* @__PURE__ */ jsx("ul", { children: releases.map(({ id: id2, name }) => /* @__PURE__ */ jsx(Box, { padding: 3, as: "li", children: /* @__PURE__ */ jsx(Link, { href: `/admin/plugins/content-releases/${id2}`, isExternal: false, children: name }) }, id2)) })
1223
- }
1224
- )
1225
- ] })
1226
- ] }) }) });
1158
+ return Object.keys(trad).reduce((acc, current) => {
1159
+ acc[`${pluginId2}.${current}`] = trad[current];
1160
+ return acc;
1161
+ }, {});
1227
1162
  };
1228
1163
  const admin = {
1229
1164
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1231,23 +1166,20 @@ const admin = {
1231
1166
  app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
1232
1167
  if (window.strapi.features.isEnabled("cms-content-releases")) {
1233
1168
  app.addMenuLink({
1234
- to: `/plugins/${pluginId}`,
1169
+ to: `plugins/${pluginId}`,
1235
1170
  icon: PaperPlane,
1236
1171
  intlLabel: {
1237
1172
  id: `${pluginId}.plugin.name`,
1238
1173
  defaultMessage: "Releases"
1239
1174
  },
1240
- async Component() {
1241
- const { App } = await import("./App-gu1aiP6i.mjs");
1242
- return App;
1243
- },
1175
+ Component: () => import("./App-Cmn2Mkn7.mjs").then((mod) => ({ default: mod.App })),
1244
1176
  permissions: PERMISSIONS.main
1245
1177
  });
1246
1178
  app.addMiddlewares([() => releaseApi.middleware]);
1247
1179
  app.addReducers({
1248
1180
  [releaseApi.reducerPath]: releaseApi.reducer
1249
1181
  });
1250
- app.injectContentManagerComponent("editView", "right-links", {
1182
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
1251
1183
  name: `${pluginId}-link`,
1252
1184
  Component: CMReleasesContainer
1253
1185
  });
@@ -1256,7 +1188,6 @@ const admin = {
1256
1188
  actions.splice(deleteActionIndex, 0, ReleaseAction);
1257
1189
  return actions;
1258
1190
  });
1259
- app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
1260
1191
  } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1261
1192
  app.addMenuLink({
1262
1193
  to: `/plugins/purchase-content-releases`,
@@ -1265,9 +1196,10 @@ const admin = {
1265
1196
  id: `${pluginId}.plugin.name`,
1266
1197
  defaultMessage: "Releases"
1267
1198
  },
1199
+ permissions: [],
1268
1200
  async Component() {
1269
- const { PurchaseContentReleases } = await import("./PurchaseContentReleases-3tRbmbY3.mjs");
1270
- return PurchaseContentReleases;
1201
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-C8djn9fP.mjs");
1202
+ return { default: PurchaseContentReleases };
1271
1203
  },
1272
1204
  lockIcon: true
1273
1205
  });
@@ -1276,7 +1208,7 @@ const admin = {
1276
1208
  async registerTrads({ locales }) {
1277
1209
  const importedTrads = await Promise.all(
1278
1210
  locales.map((locale) => {
1279
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-ltT1TlKQ.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1211
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B9Ur3VsE.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1280
1212
  return {
1281
1213
  data: prefixPluginTranslations(data, "content-releases"),
1282
1214
  locale
@@ -1300,15 +1232,14 @@ export {
1300
1232
  useUpdateReleaseMutation as c,
1301
1233
  useDeleteReleaseMutation as d,
1302
1234
  usePublishReleaseMutation as e,
1303
- useTypedDispatch as f,
1235
+ useGetReleaseActionsQuery as f,
1304
1236
  getTimezoneOffset as g,
1305
- useGetReleaseActionsQuery as h,
1237
+ useUpdateReleaseActionMutation as h,
1306
1238
  isAxiosError as i,
1307
- useUpdateReleaseActionMutation as j,
1308
- ReleaseActionMenu as k,
1309
- admin as l,
1239
+ ReleaseActionMenu as j,
1240
+ admin as k,
1310
1241
  pluginId as p,
1311
1242
  releaseApi as r,
1312
1243
  useGetReleasesQuery as u
1313
1244
  };
1314
- //# sourceMappingURL=index-mvj9PSKd.mjs.map
1245
+ //# sourceMappingURL=index-DDohgTaQ.mjs.map