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

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 (110) hide show
  1. package/dist/_chunks/{App-OP70yd5M.js → App-C0DlH0im.js} +245 -217
  2. package/dist/_chunks/App-C0DlH0im.js.map +1 -0
  3. package/dist/_chunks/{App-x6Tjj3HN.mjs → App-O0ZO-S35.mjs} +228 -200
  4. package/dist/_chunks/App-O0ZO-S35.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-DAHdUpAA.js} +4 -4
  6. package/dist/_chunks/PurchaseContentReleases-DAHdUpAA.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-Ex09YpKR.mjs} +5 -5
  8. package/dist/_chunks/PurchaseContentReleases-Ex09YpKR.mjs.map +1 -0
  9. package/dist/_chunks/{en-bpHsnU0n.mjs → en-B9Ur3VsE.mjs} +2 -1
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-3SGjiVyR.js → en-DtFJ5ViE.js} +2 -1
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-1ejXLtzt.mjs → index-DjDPK8kb.mjs} +155 -117
  14. package/dist/_chunks/index-DjDPK8kb.mjs.map +1 -0
  15. package/dist/_chunks/{index-ydocdaZ0.js → index-DoZNNtsb.js} +161 -123
  16. package/dist/_chunks/index-DoZNNtsb.js.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 +152 -93
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +153 -93
  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-OP70yd5M.js.map +0 -1
  104. package/dist/_chunks/App-x6Tjj3HN.mjs.map +0 -1
  105. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
  106. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
  107. package/dist/_chunks/en-3SGjiVyR.js.map +0 -1
  108. package/dist/_chunks/en-bpHsnU0n.mjs.map +0 -1
  109. package/dist/_chunks/index-1ejXLtzt.mjs.map +0 -1
  110. package/dist/_chunks/index-ydocdaZ0.js.map +0 -1
@@ -1,18 +1,18 @@
1
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, useRBAC, prefixPluginTranslations } from "@strapi/helper-plugin";
2
1
  import { Cross, Pencil, More, Plus, 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, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
- import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
5
+ import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, useQueryParams } from "@strapi/admin/strapi-admin";
6
+ import { Menu, IconButton, Flex, Typography, Link, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, EmptyStateLayout, LinkButton, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
+ import { EmptyDocuments } from "@strapi/icons/symbols";
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) {
@@ -136,7 +136,7 @@ const isAxiosError = (err) => {
136
136
  const releaseApi = createApi({
137
137
  reducerPath: pluginId,
138
138
  baseQuery: axiosBaseQuery,
139
- tagTypes: ["Release", "ReleaseAction"],
139
+ tagTypes: ["Release", "ReleaseAction", "EntriesInRelease"],
140
140
  endpoints: (build) => {
141
141
  return {
142
142
  getReleasesForEntry: build.query({
@@ -261,7 +261,8 @@ const releaseApi = createApi({
261
261
  },
262
262
  invalidatesTags: [
263
263
  { type: "Release", id: "LIST" },
264
- { type: "ReleaseAction", id: "LIST" }
264
+ { type: "ReleaseAction", id: "LIST" },
265
+ { type: "EntriesInRelease" }
265
266
  ]
266
267
  }),
267
268
  updateReleaseAction: build.mutation({
@@ -304,7 +305,8 @@ const releaseApi = createApi({
304
305
  invalidatesTags: (result, error, arg) => [
305
306
  { type: "Release", id: "LIST" },
306
307
  { type: "Release", id: arg.params.releaseId },
307
- { type: "ReleaseAction", id: "LIST" }
308
+ { type: "ReleaseAction", id: "LIST" },
309
+ { type: "EntriesInRelease" }
308
310
  ]
309
311
  }),
310
312
  publishRelease: build.mutation({
@@ -323,7 +325,22 @@ const releaseApi = createApi({
323
325
  method: "DELETE"
324
326
  };
325
327
  },
326
- invalidatesTags: () => [{ type: "Release", id: "LIST" }]
328
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }, { type: "EntriesInRelease" }]
329
+ }),
330
+ getMappedEntriesInReleases: build.query({
331
+ query(params) {
332
+ return {
333
+ url: "/content-releases/mapEntriesToReleases",
334
+ method: "GET",
335
+ config: {
336
+ params
337
+ }
338
+ };
339
+ },
340
+ transformResponse(response) {
341
+ return response.data;
342
+ },
343
+ providesTags: [{ type: "EntriesInRelease" }]
327
344
  })
328
345
  };
329
346
  }
@@ -340,7 +357,8 @@ const {
340
357
  useUpdateReleaseActionMutation,
341
358
  usePublishReleaseMutation,
342
359
  useDeleteReleaseActionMutation,
343
- useDeleteReleaseMutation
360
+ useDeleteReleaseMutation,
361
+ useGetMappedEntriesInReleasesQuery
344
362
  } = releaseApi;
345
363
  const getTimezoneOffset = (timezone, date) => {
346
364
  try {
@@ -358,16 +376,12 @@ const getTimezoneOffset = (timezone, date) => {
358
376
  return "";
359
377
  }
360
378
  };
361
- const useTypedDispatch = useDispatch;
362
- const useTypedSelector = useSelector;
363
379
  const StyledMenuItem = styled(Menu.Item)`
364
380
  &:hover {
365
381
  background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
366
382
 
367
383
  svg {
368
- path {
369
- fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
370
- }
384
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
371
385
  }
372
386
 
373
387
  a {
@@ -376,9 +390,7 @@ const StyledMenuItem = styled(Menu.Item)`
376
390
  }
377
391
 
378
392
  svg {
379
- path {
380
- fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
381
- }
393
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
382
394
  }
383
395
 
384
396
  a {
@@ -396,9 +408,12 @@ const StyledIconButton = styled(IconButton)`
396
408
  `;
397
409
  const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
398
410
  const { formatMessage } = useIntl();
399
- const toggleNotification = useNotification();
411
+ const { toggleNotification } = useNotification();
400
412
  const { formatAPIError } = useAPIErrorHandler();
401
413
  const [deleteReleaseAction] = useDeleteReleaseActionMutation();
414
+ const {
415
+ allowedActions: { canDeleteAction }
416
+ } = useRBAC(PERMISSIONS);
402
417
  const handleDeleteAction = async () => {
403
418
  const response = await deleteReleaseAction({
404
419
  params: { releaseId, actionId }
@@ -416,24 +431,27 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
416
431
  if ("error" in response) {
417
432
  if (isAxiosError$1(response.error)) {
418
433
  toggleNotification({
419
- type: "warning",
434
+ type: "danger",
420
435
  message: formatAPIError(response.error)
421
436
  });
422
437
  } else {
423
438
  toggleNotification({
424
- type: "warning",
439
+ type: "danger",
425
440
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
426
441
  });
427
442
  }
428
443
  }
429
444
  };
430
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
431
- /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
445
+ if (!canDeleteAction) {
446
+ return null;
447
+ }
448
+ return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
449
+ /* @__PURE__ */ jsx(Cross, { width: "1.2rem", height: "1.2rem" }),
432
450
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
433
451
  id: "content-releases.content-manager-edit-view.remove-from-release",
434
452
  defaultMessage: "Remove from release"
435
453
  }) })
436
- ] }) }) });
454
+ ] }) });
437
455
  };
438
456
  const ReleaseActionEntryLinkItem = ({
439
457
  contentTypeUid,
@@ -441,41 +459,44 @@ const ReleaseActionEntryLinkItem = ({
441
459
  locale
442
460
  }) => {
443
461
  const { formatMessage } = useIntl();
444
- const collectionTypePermissions = useTypedSelector(
445
- (state) => state.rbacProvider.collectionTypesRelatedPermissions
446
- );
447
- const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
448
- const canUpdateEntryForLocale = Boolean(
449
- !locale || updatePermissions?.find(
450
- (permission) => permission.properties?.locales?.includes(locale)
451
- )
452
- );
453
- return /* @__PURE__ */ jsx(
454
- CheckPermissions,
462
+ const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
463
+ const canUpdateEntryForLocale = React.useMemo(() => {
464
+ const updatePermissions = userPermissions.find(
465
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
466
+ );
467
+ if (!updatePermissions) {
468
+ return false;
469
+ }
470
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
471
+ }, [contentTypeUid, locale, userPermissions]);
472
+ const {
473
+ allowedActions: { canUpdate: canUpdateContentType }
474
+ } = useRBAC({
475
+ updateContentType: [
476
+ {
477
+ action: "plugin::content-manager.explorer.update",
478
+ subject: contentTypeUid
479
+ }
480
+ ]
481
+ });
482
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
483
+ return null;
484
+ }
485
+ return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
486
+ Link,
455
487
  {
456
- permissions: [
457
- {
458
- action: "plugin::content-manager.explorer.update",
459
- subject: contentTypeUid
460
- }
461
- ],
462
- children: canUpdateEntryForLocale && /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
463
- Link,
464
- {
465
- as: NavLink,
466
- to: {
467
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
468
- search: locale && `?plugins[i18n][locale]=${locale}`
469
- },
470
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
471
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
472
- id: "content-releases.content-manager-edit-view.edit-entry",
473
- defaultMessage: "Edit entry"
474
- }) })
475
- }
476
- ) })
488
+ as: NavLink,
489
+ to: {
490
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
491
+ search: locale && `?plugins[i18n][locale]=${locale}`
492
+ },
493
+ startIcon: /* @__PURE__ */ jsx(Pencil, { width: "1.2rem", height: "1.2rem" }),
494
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
495
+ id: "content-releases.content-manager-edit-view.edit-entry",
496
+ defaultMessage: "Edit entry"
497
+ }) })
477
498
  }
478
- );
499
+ ) });
479
500
  };
480
501
  const EditReleaseItem = ({ releaseId }) => {
481
502
  const { formatMessage } = useIntl();
@@ -483,7 +504,7 @@ const EditReleaseItem = ({ releaseId }) => {
483
504
  Link,
484
505
  {
485
506
  href: `/admin/plugins/content-releases/${releaseId}`,
486
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
507
+ startIcon: /* @__PURE__ */ jsx(Pencil, { width: "1.2rem", height: "1.2rem" }),
487
508
  isExternal: false,
488
509
  children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
489
510
  id: "content-releases.content-manager-edit-view.edit-release",
@@ -494,9 +515,10 @@ const EditReleaseItem = ({ releaseId }) => {
494
515
  };
495
516
  const Root = ({ children, hasTriggerBorder = false }) => {
496
517
  const { formatMessage } = useIntl();
518
+ const { allowedActions } = useRBAC(PERMISSIONS);
497
519
  return (
498
520
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
499
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
521
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
500
522
  /* @__PURE__ */ jsx(
501
523
  Menu.Trigger,
502
524
  {
@@ -511,7 +533,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
511
533
  }
512
534
  ),
513
535
  /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
514
- ] }) })
536
+ ] }) : null
515
537
  );
516
538
  };
517
539
  const ReleaseActionMenu = {
@@ -643,12 +665,13 @@ const INITIAL_VALUES = {
643
665
  const NoReleases = () => {
644
666
  const { formatMessage } = useIntl();
645
667
  return /* @__PURE__ */ jsx(
646
- NoContent,
668
+ EmptyStateLayout,
647
669
  {
648
- content: {
670
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
671
+ content: formatMessage({
649
672
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
650
673
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
651
- },
674
+ }),
652
675
  action: /* @__PURE__ */ jsx(
653
676
  LinkButton,
654
677
  {
@@ -673,9 +696,10 @@ const AddActionToReleaseModal = ({
673
696
  }) => {
674
697
  const releaseHeaderId = React.useId();
675
698
  const { formatMessage } = useIntl();
676
- const toggleNotification = useNotification();
699
+ const { toggleNotification } = useNotification();
677
700
  const { formatAPIError } = useAPIErrorHandler();
678
- const { modifiedData } = useCMEditViewDataManager();
701
+ const [{ query }] = useQueryParams();
702
+ const locale = query.plugins?.i18n?.locale;
679
703
  const response = useGetReleasesForEntryQuery({
680
704
  contentTypeUid,
681
705
  entryId,
@@ -684,7 +708,6 @@ const AddActionToReleaseModal = ({
684
708
  const releases = response.data?.data;
685
709
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
686
710
  const handleSubmit = async (values) => {
687
- const locale = modifiedData.locale;
688
711
  const releaseActionEntry = {
689
712
  contentType: contentTypeUid,
690
713
  id: entryId,
@@ -708,12 +731,12 @@ const AddActionToReleaseModal = ({
708
731
  if ("error" in response2) {
709
732
  if (isAxiosError$1(response2.error)) {
710
733
  toggleNotification({
711
- type: "warning",
734
+ type: "danger",
712
735
  message: formatAPIError(response2.error)
713
736
  });
714
737
  } else {
715
738
  toggleNotification({
716
- type: "warning",
739
+ type: "danger",
717
740
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
718
741
  });
719
742
  }
@@ -791,17 +814,20 @@ const AddActionToReleaseModal = ({
791
814
  const CMReleasesContainer = () => {
792
815
  const [isModalOpen, setIsModalOpen] = React.useState(false);
793
816
  const { formatMessage, formatDate, formatTime } = useIntl();
794
- const {
795
- isCreatingEntry,
796
- hasDraftAndPublish,
797
- initialData: { id: entryId },
798
- slug
799
- } = useCMEditViewDataManager();
817
+ const { id, slug, collectionType } = useParams();
818
+ const isCreatingEntry = id === "create";
819
+ const { allowedActions } = useRBAC(PERMISSIONS);
820
+ const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
821
+ const { schema } = unstable_useDocument({
822
+ collectionType,
823
+ model: slug
824
+ });
825
+ const hasDraftAndPublish = schema?.options?.draftAndPublish;
800
826
  const contentTypeUid = slug;
801
- const canFetch = entryId != null && contentTypeUid != null;
827
+ const canFetch = id != null && contentTypeUid != null;
802
828
  const fetchParams = canFetch ? {
803
829
  contentTypeUid,
804
- entryId,
830
+ entryId: id,
805
831
  hasEntryAttached: true
806
832
  } : skipToken;
807
833
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -819,7 +845,10 @@ const CMReleasesContainer = () => {
819
845
  }
820
846
  return `success${shade}`;
821
847
  };
822
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(
848
+ if (!canMain) {
849
+ return null;
850
+ }
851
+ return /* @__PURE__ */ jsxs(
823
852
  Box,
824
853
  {
825
854
  as: "aside",
@@ -846,7 +875,7 @@ const CMReleasesContainer = () => {
846
875
  alignItems: "start",
847
876
  borderWidth: "1px",
848
877
  borderStyle: "solid",
849
- borderColor: getReleaseColorVariant(release.action.type, "200"),
878
+ borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
850
879
  overflow: "hidden",
851
880
  hasRadius: true,
852
881
  children: [
@@ -857,26 +886,26 @@ const CMReleasesContainer = () => {
857
886
  paddingBottom: 3,
858
887
  paddingLeft: 4,
859
888
  paddingRight: 4,
860
- background: getReleaseColorVariant(release.action.type, "100"),
889
+ background: getReleaseColorVariant(release.actions[0].type, "100"),
861
890
  width: "100%",
862
891
  children: /* @__PURE__ */ jsx(
863
892
  Typography,
864
893
  {
865
894
  fontSize: 1,
866
895
  variant: "pi",
867
- textColor: getReleaseColorVariant(release.action.type, "600"),
896
+ textColor: getReleaseColorVariant(release.actions[0].type, "600"),
868
897
  children: formatMessage(
869
898
  {
870
899
  id: "content-releases.content-manager-edit-view.list-releases.title",
871
900
  defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
872
901
  },
873
- { isPublish: release.action.type === "publish" }
902
+ { isPublish: release.actions[0].type === "publish" }
874
903
  )
875
904
  }
876
905
  )
877
906
  }
878
907
  ),
879
- /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
908
+ /* @__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: [
880
909
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
881
910
  release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
882
911
  {
@@ -900,23 +929,23 @@ const CMReleasesContainer = () => {
900
929
  )
901
930
  }
902
931
  ) }),
903
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
932
+ canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
904
933
  /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
905
934
  /* @__PURE__ */ jsx(
906
935
  ReleaseActionMenu.DeleteReleaseActionItem,
907
936
  {
908
937
  releaseId: release.id,
909
- actionId: release.action.id
938
+ actionId: release.actions[0].id
910
939
  }
911
940
  )
912
- ] }) })
913
- ] })
941
+ ] }) : null
942
+ ] }) })
914
943
  ]
915
944
  },
916
945
  release.id
917
946
  );
918
947
  }),
919
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
948
+ canCreateAction ? /* @__PURE__ */ jsx(
920
949
  Button,
921
950
  {
922
951
  justifyContent: "center",
@@ -931,19 +960,19 @@ const CMReleasesContainer = () => {
931
960
  defaultMessage: "Add to release"
932
961
  })
933
962
  }
934
- ) })
963
+ ) : null
935
964
  ] }),
936
965
  isModalOpen && /* @__PURE__ */ jsx(
937
966
  AddActionToReleaseModal,
938
967
  {
939
968
  handleClose: toggleModal,
940
969
  contentTypeUid,
941
- entryId
970
+ entryId: id
942
971
  }
943
972
  )
944
973
  ]
945
974
  }
946
- ) });
975
+ );
947
976
  };
948
977
  const getContentPermissions = (subject) => {
949
978
  const permissions = {
@@ -960,11 +989,11 @@ const getContentPermissions = (subject) => {
960
989
  };
961
990
  return permissions;
962
991
  };
963
- const ReleaseAction = ({ ids, model }) => {
992
+ const ReleaseAction = ({ documentIds, model }) => {
964
993
  const { formatMessage } = useIntl();
965
- const toggleNotification = useNotification();
994
+ const { toggleNotification } = useNotification();
966
995
  const { formatAPIError } = useAPIErrorHandler();
967
- const { modifiedData } = useCMEditViewDataManager();
996
+ const [{ query }] = useQueryParams();
968
997
  const contentPermissions = getContentPermissions(model);
969
998
  const {
970
999
  allowedActions: { canPublish }
@@ -976,15 +1005,17 @@ const ReleaseAction = ({ ids, model }) => {
976
1005
  const releases = response.data?.data;
977
1006
  const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
978
1007
  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
- }));
1008
+ const locale = query.plugins?.i18n?.locale;
1009
+ const releaseActionEntries = documentIds.map(
1010
+ (id) => ({
1011
+ type: values.type,
1012
+ entry: {
1013
+ contentType: model,
1014
+ id,
1015
+ locale
1016
+ }
1017
+ })
1018
+ );
988
1019
  const response2 = await createManyReleaseActions({
989
1020
  body: releaseActionEntries,
990
1021
  params: { releaseId: values.releaseId }
@@ -1116,28 +1147,35 @@ const ReleaseAction = ({ ids, model }) => {
1116
1147
  }
1117
1148
  };
1118
1149
  };
1150
+ const prefixPluginTranslations = (trad, pluginId2) => {
1151
+ if (!pluginId2) {
1152
+ throw new TypeError("pluginId can't be empty");
1153
+ }
1154
+ return Object.keys(trad).reduce((acc, current) => {
1155
+ acc[`${pluginId2}.${current}`] = trad[current];
1156
+ return acc;
1157
+ }, {});
1158
+ };
1119
1159
  const admin = {
1120
1160
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1121
1161
  register(app) {
1162
+ app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
1122
1163
  if (window.strapi.features.isEnabled("cms-content-releases")) {
1123
1164
  app.addMenuLink({
1124
- to: `/plugins/${pluginId}`,
1165
+ to: `plugins/${pluginId}`,
1125
1166
  icon: PaperPlane,
1126
1167
  intlLabel: {
1127
1168
  id: `${pluginId}.plugin.name`,
1128
1169
  defaultMessage: "Releases"
1129
1170
  },
1130
- async Component() {
1131
- const { App } = await import("./App-x6Tjj3HN.mjs");
1132
- return App;
1133
- },
1171
+ Component: () => import("./App-O0ZO-S35.mjs").then((mod) => ({ default: mod.App })),
1134
1172
  permissions: PERMISSIONS.main
1135
1173
  });
1136
1174
  app.addMiddlewares([() => releaseApi.middleware]);
1137
1175
  app.addReducers({
1138
1176
  [releaseApi.reducerPath]: releaseApi.reducer
1139
1177
  });
1140
- app.injectContentManagerComponent("editView", "right-links", {
1178
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
1141
1179
  name: `${pluginId}-link`,
1142
1180
  Component: CMReleasesContainer
1143
1181
  });
@@ -1154,9 +1192,10 @@ const admin = {
1154
1192
  id: `${pluginId}.plugin.name`,
1155
1193
  defaultMessage: "Releases"
1156
1194
  },
1195
+ permissions: [],
1157
1196
  async Component() {
1158
- const { PurchaseContentReleases } = await import("./PurchaseContentReleases-3tRbmbY3.mjs");
1159
- return PurchaseContentReleases;
1197
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-Ex09YpKR.mjs");
1198
+ return { default: PurchaseContentReleases };
1160
1199
  },
1161
1200
  lockIcon: true
1162
1201
  });
@@ -1165,7 +1204,7 @@ const admin = {
1165
1204
  async registerTrads({ locales }) {
1166
1205
  const importedTrads = await Promise.all(
1167
1206
  locales.map((locale) => {
1168
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-bpHsnU0n.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1207
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B9Ur3VsE.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1169
1208
  return {
1170
1209
  data: prefixPluginTranslations(data, "content-releases"),
1171
1210
  locale
@@ -1189,15 +1228,14 @@ export {
1189
1228
  useUpdateReleaseMutation as c,
1190
1229
  useDeleteReleaseMutation as d,
1191
1230
  usePublishReleaseMutation as e,
1192
- useTypedDispatch as f,
1231
+ useGetReleaseActionsQuery as f,
1193
1232
  getTimezoneOffset as g,
1194
- useGetReleaseActionsQuery as h,
1233
+ useUpdateReleaseActionMutation as h,
1195
1234
  isAxiosError as i,
1196
- useUpdateReleaseActionMutation as j,
1197
- ReleaseActionMenu as k,
1198
- admin as l,
1235
+ ReleaseActionMenu as j,
1236
+ admin as k,
1199
1237
  pluginId as p,
1200
1238
  releaseApi as r,
1201
1239
  useGetReleasesQuery as u
1202
1240
  };
1203
- //# sourceMappingURL=index-1ejXLtzt.mjs.map
1241
+ //# sourceMappingURL=index-DjDPK8kb.mjs.map