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

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 +1352 -0
  2. package/dist/_chunks/App-1LckaIGY.js.map +1 -0
  3. package/dist/_chunks/App-X01LBg5V.mjs +1329 -0
  4. package/dist/_chunks/App-X01LBg5V.mjs.map +1 -0
  5. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs +51 -0
  6. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +1 -0
  7. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js +51 -0
  8. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +1 -0
  9. package/dist/_chunks/{en-SOqjCdyh.mjs → en-RdapH-9X.mjs} +18 -7
  10. package/dist/_chunks/en-RdapH-9X.mjs.map +1 -0
  11. package/dist/_chunks/{en-2DuPv5k0.js → en-faJDuv3q.js} +18 -7
  12. package/dist/_chunks/en-faJDuv3q.js.map +1 -0
  13. package/dist/_chunks/{index-bsuc8ZwZ.mjs → index-OD9AlD-6.mjs} +233 -107
  14. package/dist/_chunks/index-OD9AlD-6.mjs.map +1 -0
  15. package/dist/_chunks/{index-_lT-gI3M.js → index-cYWov2wa.js} +226 -100
  16. package/dist/_chunks/index-cYWov2wa.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 +1 -15
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/src/components/CMReleasesContainer.d.ts +1 -0
  22. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  23. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  24. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  25. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  26. package/dist/admin/src/constants.d.ts +58 -0
  27. package/dist/admin/src/index.d.ts +3 -0
  28. package/dist/admin/src/pages/App.d.ts +1 -0
  29. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  30. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  31. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  32. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  33. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  34. package/dist/admin/src/pluginId.d.ts +1 -0
  35. package/dist/admin/src/services/axios.d.ts +29 -0
  36. package/dist/admin/src/services/release.d.ts +369 -0
  37. package/dist/admin/src/store/hooks.d.ts +7 -0
  38. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  39. package/dist/admin/src/utils/time.d.ts +1 -0
  40. package/dist/server/index.js +1014 -417
  41. package/dist/server/index.js.map +1 -1
  42. package/dist/server/index.mjs +1014 -417
  43. package/dist/server/index.mjs.map +1 -1
  44. package/dist/server/src/bootstrap.d.ts +5 -0
  45. package/dist/server/src/bootstrap.d.ts.map +1 -0
  46. package/dist/server/src/constants.d.ts +12 -0
  47. package/dist/server/src/constants.d.ts.map +1 -0
  48. package/dist/server/src/content-types/index.d.ts +99 -0
  49. package/dist/server/src/content-types/index.d.ts.map +1 -0
  50. package/dist/server/src/content-types/release/index.d.ts +48 -0
  51. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  52. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  53. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  54. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  55. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  56. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  57. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  58. package/dist/server/src/controllers/index.d.ts +19 -0
  59. package/dist/server/src/controllers/index.d.ts.map +1 -0
  60. package/dist/server/src/controllers/release-action.d.ts +10 -0
  61. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  62. package/dist/server/src/controllers/release.d.ts +11 -0
  63. package/dist/server/src/controllers/release.d.ts.map +1 -0
  64. package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
  65. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  66. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  67. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  68. package/dist/server/src/destroy.d.ts +5 -0
  69. package/dist/server/src/destroy.d.ts.map +1 -0
  70. package/dist/server/src/index.d.ts +2095 -0
  71. package/dist/server/src/index.d.ts.map +1 -0
  72. package/dist/server/src/migrations/index.d.ts +13 -0
  73. package/dist/server/src/migrations/index.d.ts.map +1 -0
  74. package/dist/server/src/register.d.ts +5 -0
  75. package/dist/server/src/register.d.ts.map +1 -0
  76. package/dist/server/src/routes/index.d.ts +35 -0
  77. package/dist/server/src/routes/index.d.ts.map +1 -0
  78. package/dist/server/src/routes/release-action.d.ts +18 -0
  79. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  80. package/dist/server/src/routes/release.d.ts +18 -0
  81. package/dist/server/src/routes/release.d.ts.map +1 -0
  82. package/dist/server/src/services/index.d.ts +1826 -0
  83. package/dist/server/src/services/index.d.ts.map +1 -0
  84. package/dist/server/src/services/release.d.ts +66 -0
  85. package/dist/server/src/services/release.d.ts.map +1 -0
  86. package/dist/server/src/services/scheduling.d.ts +18 -0
  87. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  88. package/dist/server/src/services/validation.d.ts +18 -0
  89. package/dist/server/src/services/validation.d.ts.map +1 -0
  90. package/dist/server/src/utils/index.d.ts +14 -0
  91. package/dist/server/src/utils/index.d.ts.map +1 -0
  92. package/dist/shared/contracts/release-actions.d.ts +131 -0
  93. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  94. package/dist/shared/contracts/releases.d.ts +166 -0
  95. package/dist/shared/contracts/releases.d.ts.map +1 -0
  96. package/dist/shared/types.d.ts +24 -0
  97. package/dist/shared/types.d.ts.map +1 -0
  98. package/dist/shared/validation-schemas.d.ts +2 -0
  99. package/dist/shared/validation-schemas.d.ts.map +1 -0
  100. package/package.json +25 -29
  101. package/dist/_chunks/App-_Jj3tWts.mjs +0 -1053
  102. package/dist/_chunks/App-_Jj3tWts.mjs.map +0 -1
  103. package/dist/_chunks/App-iqqoPnBO.js +0 -1075
  104. package/dist/_chunks/App-iqqoPnBO.js.map +0 -1
  105. package/dist/_chunks/en-2DuPv5k0.js.map +0 -1
  106. package/dist/_chunks/en-SOqjCdyh.mjs.map +0 -1
  107. package/dist/_chunks/index-_lT-gI3M.js.map +0 -1
  108. package/dist/_chunks/index-bsuc8ZwZ.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
- const helperPlugin = require("@strapi/helper-plugin");
3
2
  const icons = require("@strapi/icons");
4
3
  const jsxRuntime = require("react/jsx-runtime");
5
4
  const React = require("react");
6
5
  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,7 +13,6 @@ 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");
17
16
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
18
17
  function _interopNamespace(e) {
19
18
  if (e && e.__esModule)
@@ -125,7 +124,7 @@ const axiosBaseQuery = async ({
125
124
  config
126
125
  }) => {
127
126
  try {
128
- const { get, post, del, put } = helperPlugin.getFetchClient();
127
+ const { get, post, del, put } = strapiAdmin.getFetchClient();
129
128
  if (method === "POST") {
130
129
  const result2 = await post(url, data, config);
131
130
  return { data: result2.data };
@@ -311,8 +310,9 @@ const releaseApi = react.createApi({
311
310
  method: "DELETE"
312
311
  };
313
312
  },
314
- invalidatesTags: [
313
+ invalidatesTags: (result, error, arg) => [
315
314
  { type: "Release", id: "LIST" },
315
+ { type: "Release", id: arg.params.releaseId },
316
316
  { type: "ReleaseAction", id: "LIST" }
317
317
  ]
318
318
  }),
@@ -332,7 +332,7 @@ const releaseApi = react.createApi({
332
332
  method: "DELETE"
333
333
  };
334
334
  },
335
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
335
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }]
336
336
  })
337
337
  };
338
338
  }
@@ -350,8 +350,22 @@ const {
350
350
  useDeleteReleaseActionMutation,
351
351
  useDeleteReleaseMutation
352
352
  } = releaseApi;
353
- const useTypedDispatch = reactRedux.useDispatch;
354
- const useTypedSelector = reactRedux.useSelector;
353
+ const getTimezoneOffset = (timezone, date) => {
354
+ try {
355
+ const offsetPart = new Intl.DateTimeFormat("en", {
356
+ timeZone: timezone,
357
+ timeZoneName: "longOffset"
358
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
359
+ const offset = offsetPart ? offsetPart.value : "";
360
+ let utcOffset = offset.replace("GMT", "UTC");
361
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
362
+ utcOffset = `${utcOffset}+00:00`;
363
+ }
364
+ return utcOffset;
365
+ } catch (error) {
366
+ return "";
367
+ }
368
+ };
355
369
  const StyledMenuItem = styled__default.default(v2.Menu.Item)`
356
370
  &:hover {
357
371
  background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
@@ -388,9 +402,12 @@ const StyledIconButton = styled__default.default(designSystem.IconButton)`
388
402
  `;
389
403
  const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
390
404
  const { formatMessage } = reactIntl.useIntl();
391
- const toggleNotification = helperPlugin.useNotification();
392
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
405
+ const { toggleNotification } = strapiAdmin.useNotification();
406
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
393
407
  const [deleteReleaseAction] = useDeleteReleaseActionMutation();
408
+ const {
409
+ allowedActions: { canDeleteAction }
410
+ } = strapiAdmin.useRBAC(PERMISSIONS);
394
411
  const handleDeleteAction = async () => {
395
412
  const response = await deleteReleaseAction({
396
413
  params: { releaseId, actionId }
@@ -408,24 +425,27 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
408
425
  if ("error" in response) {
409
426
  if (axios.isAxiosError(response.error)) {
410
427
  toggleNotification({
411
- type: "warning",
428
+ type: "danger",
412
429
  message: formatAPIError(response.error)
413
430
  });
414
431
  } else {
415
432
  toggleNotification({
416
- type: "warning",
433
+ type: "danger",
417
434
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
418
435
  });
419
436
  }
420
437
  }
421
438
  };
422
- 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: [
423
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Cross, padding: 1 }),
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: [
443
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Cross, width: 3, height: 3 }),
424
444
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
425
445
  id: "content-releases.content-manager-edit-view.remove-from-release",
426
446
  defaultMessage: "Remove from release"
427
447
  }) })
428
- ] }) }) });
448
+ ] }) });
429
449
  };
430
450
  const ReleaseActionEntryLinkItem = ({
431
451
  contentTypeUid,
@@ -433,47 +453,66 @@ const ReleaseActionEntryLinkItem = ({
433
453
  locale
434
454
  }) => {
435
455
  const { formatMessage } = reactIntl.useIntl();
436
- const collectionTypePermissions = useTypedSelector(
437
- (state) => state.rbacProvider.collectionTypesRelatedPermissions
438
- );
439
- const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
440
- const canUpdateEntryForLocale = Boolean(
441
- !locale || updatePermissions?.find(
442
- (permission) => permission.properties?.locales?.includes(locale)
443
- )
444
- );
445
- return /* @__PURE__ */ jsxRuntime.jsx(
446
- helperPlugin.CheckPermissions,
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,
447
481
  {
448
- permissions: [
449
- {
450
- action: "plugin::content-manager.explorer.update",
451
- subject: contentTypeUid
452
- }
453
- ],
454
- children: canUpdateEntryForLocale && /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
455
- v2.Link,
456
- {
457
- as: reactRouterDom.NavLink,
458
- to: {
459
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
460
- search: locale && `?plugins[i18n][locale]=${locale}`
461
- },
462
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, padding: 1 }),
463
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
464
- id: "content-releases.content-manager-edit-view.edit-entry",
465
- defaultMessage: "Edit entry"
466
- }) })
467
- }
468
- ) })
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
+ }) })
469
492
  }
470
- );
493
+ ) });
494
+ };
495
+ const EditReleaseItem = ({ releaseId }) => {
496
+ const { formatMessage } = reactIntl.useIntl();
497
+ return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
498
+ v2.Link,
499
+ {
500
+ href: `/admin/plugins/content-releases/${releaseId}`,
501
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, width: 3, height: 3 }),
502
+ isExternal: false,
503
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
504
+ id: "content-releases.content-manager-edit-view.edit-release",
505
+ defaultMessage: "Edit release"
506
+ }) })
507
+ }
508
+ ) });
471
509
  };
472
510
  const Root = ({ children, hasTriggerBorder = false }) => {
473
511
  const { formatMessage } = reactIntl.useIntl();
512
+ const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
474
513
  return (
475
514
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
476
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
515
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
477
516
  /* @__PURE__ */ jsxRuntime.jsx(
478
517
  v2.Menu.Trigger,
479
518
  {
@@ -488,11 +527,12 @@ const Root = ({ children, hasTriggerBorder = false }) => {
488
527
  }
489
528
  ),
490
529
  /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
491
- ] }) })
530
+ ] }) : null
492
531
  );
493
532
  };
494
533
  const ReleaseActionMenu = {
495
534
  Root,
535
+ EditReleaseItem,
496
536
  DeleteReleaseActionItem,
497
537
  ReleaseActionEntryLinkItem
498
538
  };
@@ -516,19 +556,40 @@ const FieldWrapper = styled__default.default(designSystem.Field)`
516
556
  text-transform: capitalize;
517
557
  }
518
558
 
519
- &:active,
520
559
  &[data-checked='true'] {
521
- color: ${({ theme }) => theme.colors.primary700};
522
- background-color: ${({ theme }) => theme.colors.primary100};
523
- border-color: ${({ theme }) => theme.colors.primary700};
560
+ color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
561
+ background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
562
+ border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
524
563
  }
525
564
 
526
565
  &[data-checked='false'] {
527
566
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
528
567
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
529
568
  }
569
+
570
+ &[data-checked='false'][data-disabled='false']:hover {
571
+ color: ${({ theme }) => theme.colors.neutral700};
572
+ background-color: ${({ theme }) => theme.colors.neutral100};
573
+ border-color: ${({ theme }) => theme.colors.neutral200};
574
+
575
+ & > label {
576
+ cursor: pointer;
577
+ }
578
+ }
579
+
580
+ &[data-disabled='true'] {
581
+ color: ${({ theme }) => theme.colors.neutral600};
582
+ background-color: ${({ theme }) => theme.colors.neutral150};
583
+ border-color: ${({ theme }) => theme.colors.neutral300};
584
+ }
530
585
  `;
531
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
586
+ const ActionOption = ({
587
+ selected,
588
+ actionType,
589
+ handleChange,
590
+ name,
591
+ disabled = false
592
+ }) => {
532
593
  return /* @__PURE__ */ jsxRuntime.jsx(
533
594
  FieldWrapper,
534
595
  {
@@ -539,6 +600,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
539
600
  position: "relative",
540
601
  cursor: "pointer",
541
602
  "data-checked": selected === actionType,
603
+ "data-disabled": disabled && selected !== actionType,
542
604
  children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
543
605
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { children: /* @__PURE__ */ jsxRuntime.jsx(
544
606
  designSystem.FieldInput,
@@ -548,7 +610,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
548
610
  name,
549
611
  checked: selected === actionType,
550
612
  onChange: handleChange,
551
- value: actionType
613
+ value: actionType,
614
+ disabled
552
615
  }
553
616
  ) }),
554
617
  actionType
@@ -556,7 +619,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
556
619
  }
557
620
  );
558
621
  };
559
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
622
+ const ReleaseActionOptions = ({
623
+ selected,
624
+ handleChange,
625
+ name,
626
+ disabled = false
627
+ }) => {
560
628
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
561
629
  /* @__PURE__ */ jsxRuntime.jsx(
562
630
  ActionOption,
@@ -564,7 +632,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
564
632
  actionType: "publish",
565
633
  selected,
566
634
  handleChange,
567
- name
635
+ name,
636
+ disabled
568
637
  }
569
638
  ),
570
639
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -573,7 +642,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
573
642
  actionType: "unpublish",
574
643
  selected,
575
644
  handleChange,
576
- name
645
+ name,
646
+ disabled
577
647
  }
578
648
  )
579
649
  ] });
@@ -589,12 +659,13 @@ const INITIAL_VALUES = {
589
659
  const NoReleases = () => {
590
660
  const { formatMessage } = reactIntl.useIntl();
591
661
  return /* @__PURE__ */ jsxRuntime.jsx(
592
- helperPlugin.NoContent,
662
+ designSystem.EmptyStateLayout,
593
663
  {
594
- content: {
664
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.EmptyDocuments, { width: "10rem" }),
665
+ content: formatMessage({
595
666
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
596
667
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
597
- },
668
+ }),
598
669
  action: /* @__PURE__ */ jsxRuntime.jsx(
599
670
  v2.LinkButton,
600
671
  {
@@ -617,10 +688,12 @@ const AddActionToReleaseModal = ({
617
688
  contentTypeUid,
618
689
  entryId
619
690
  }) => {
691
+ const releaseHeaderId = React__namespace.useId();
620
692
  const { formatMessage } = reactIntl.useIntl();
621
- const toggleNotification = helperPlugin.useNotification();
622
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
623
- const { modifiedData } = helperPlugin.useCMEditViewDataManager();
693
+ const { toggleNotification } = strapiAdmin.useNotification();
694
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
695
+ const [{ query: query2 }] = strapiAdmin.useQueryParams();
696
+ const locale = query2.plugins?.i18n?.locale;
624
697
  const response = useGetReleasesForEntryQuery({
625
698
  contentTypeUid,
626
699
  entryId,
@@ -629,7 +702,6 @@ const AddActionToReleaseModal = ({
629
702
  const releases = response.data?.data;
630
703
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
631
704
  const handleSubmit = async (values) => {
632
- const locale = modifiedData.locale;
633
705
  const releaseActionEntry = {
634
706
  contentType: contentTypeUid,
635
707
  id: entryId,
@@ -653,19 +725,19 @@ const AddActionToReleaseModal = ({
653
725
  if ("error" in response2) {
654
726
  if (axios.isAxiosError(response2.error)) {
655
727
  toggleNotification({
656
- type: "warning",
728
+ type: "danger",
657
729
  message: formatAPIError(response2.error)
658
730
  });
659
731
  } else {
660
732
  toggleNotification({
661
- type: "warning",
733
+ type: "danger",
662
734
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
663
735
  });
664
736
  }
665
737
  }
666
738
  };
667
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
668
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
739
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
740
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
669
741
  id: "content-releases.content-manager-edit-view.add-to-release",
670
742
  defaultMessage: "Add to release"
671
743
  }) }) }),
@@ -735,16 +807,22 @@ const AddActionToReleaseModal = ({
735
807
  };
736
808
  const CMReleasesContainer = () => {
737
809
  const [isModalOpen, setIsModalOpen] = React__namespace.useState(false);
738
- const { formatMessage } = reactIntl.useIntl();
810
+ const { formatMessage, formatDate, formatTime } = reactIntl.useIntl();
811
+ const { id, slug, collectionType } = reactRouterDom.useParams();
812
+ const isCreatingEntry = id === "create";
739
813
  const {
740
- isCreatingEntry,
741
- allLayoutData: { contentType }
742
- } = helperPlugin.useCMEditViewDataManager();
743
- const params = reactRouterDom.useParams();
744
- const canFetch = params?.id != null && contentType?.uid != null;
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;
821
+ const contentTypeUid = slug;
822
+ const canFetch = id != null && contentTypeUid != null;
745
823
  const fetchParams = canFetch ? {
746
- contentTypeUid: contentType.uid,
747
- entryId: params.id,
824
+ contentTypeUid,
825
+ entryId: id,
748
826
  hasEntryAttached: true
749
827
  } : query.skipToken;
750
828
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -752,7 +830,7 @@ const CMReleasesContainer = () => {
752
830
  if (!canFetch) {
753
831
  return null;
754
832
  }
755
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
833
+ if (isCreatingEntry || !hasDraftAndPublish) {
756
834
  return null;
757
835
  }
758
836
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -762,7 +840,10 @@ const CMReleasesContainer = () => {
762
840
  }
763
841
  return `success${shade}`;
764
842
  };
765
- return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(
843
+ if (!canMain) {
844
+ return null;
845
+ }
846
+ return /* @__PURE__ */ jsxRuntime.jsxs(
766
847
  designSystem.Box,
767
848
  {
768
849
  as: "aside",
@@ -819,22 +900,47 @@ const CMReleasesContainer = () => {
819
900
  )
820
901
  }
821
902
  ),
822
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
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: [
823
904
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
824
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsxRuntime.jsx(
825
- ReleaseActionMenu.DeleteReleaseActionItem,
905
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
826
906
  {
827
- releaseId: release.id,
828
- actionId: release.action.id
907
+ id: "content-releases.content-manager-edit-view.scheduled.date",
908
+ defaultMessage: "{date} at {time} ({offset})"
909
+ },
910
+ {
911
+ date: formatDate(new Date(release.scheduledAt), {
912
+ day: "2-digit",
913
+ month: "2-digit",
914
+ year: "numeric",
915
+ timeZone: release.timezone
916
+ }),
917
+ time: formatTime(new Date(release.scheduledAt), {
918
+ hourCycle: "h23",
919
+ timeZone: release.timezone
920
+ }),
921
+ offset: getTimezoneOffset(
922
+ release.timezone,
923
+ new Date(release.scheduledAt)
924
+ )
829
925
  }
830
- ) }) })
831
- ] })
926
+ ) }),
927
+ canDeleteAction ? /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
928
+ /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
929
+ /* @__PURE__ */ jsxRuntime.jsx(
930
+ ReleaseActionMenu.DeleteReleaseActionItem,
931
+ {
932
+ releaseId: release.id,
933
+ actionId: release.action.id
934
+ }
935
+ )
936
+ ] }) : null
937
+ ] }) })
832
938
  ]
833
939
  },
834
940
  release.id
835
941
  );
836
942
  }),
837
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsxRuntime.jsx(
943
+ canCreateAction ? /* @__PURE__ */ jsxRuntime.jsx(
838
944
  designSystem.Button,
839
945
  {
840
946
  justifyContent: "center",
@@ -849,35 +955,41 @@ const CMReleasesContainer = () => {
849
955
  defaultMessage: "Add to release"
850
956
  })
851
957
  }
852
- ) })
958
+ ) : null
853
959
  ] }),
854
960
  isModalOpen && /* @__PURE__ */ jsxRuntime.jsx(
855
961
  AddActionToReleaseModal,
856
962
  {
857
963
  handleClose: toggleModal,
858
- contentTypeUid: contentType.uid,
859
- entryId: params.id
964
+ contentTypeUid,
965
+ entryId: id
860
966
  }
861
967
  )
862
968
  ]
863
969
  }
864
- ) });
970
+ );
971
+ };
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
+ }, {});
865
980
  };
866
981
  const admin = {
867
982
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
868
983
  register(app) {
869
984
  if (window.strapi.features.isEnabled("cms-content-releases")) {
870
985
  app.addMenuLink({
871
- to: `/plugins/${pluginId}`,
986
+ to: `plugins/${pluginId}`,
872
987
  icon: icons.PaperPlane,
873
988
  intlLabel: {
874
989
  id: `${pluginId}.plugin.name`,
875
990
  defaultMessage: "Releases"
876
991
  },
877
- async Component() {
878
- const { App } = await Promise.resolve().then(() => require("./App-iqqoPnBO.js"));
879
- return App;
880
- },
992
+ Component: () => Promise.resolve().then(() => require("./App-1LckaIGY.js")).then((mod) => ({ default: mod.App })),
881
993
  permissions: PERMISSIONS.main
882
994
  });
883
995
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -888,14 +1000,28 @@ const admin = {
888
1000
  name: `${pluginId}-link`,
889
1001
  Component: CMReleasesContainer
890
1002
  });
1003
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1004
+ app.addMenuLink({
1005
+ to: `/plugins/purchase-content-releases`,
1006
+ icon: icons.PaperPlane,
1007
+ intlLabel: {
1008
+ id: `${pluginId}.plugin.name`,
1009
+ defaultMessage: "Releases"
1010
+ },
1011
+ async Component() {
1012
+ const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-YhAPgpG9.js"));
1013
+ return PurchaseContentReleases;
1014
+ },
1015
+ lockIcon: true
1016
+ });
891
1017
  }
892
1018
  },
893
1019
  async registerTrads({ locales }) {
894
1020
  const importedTrads = await Promise.all(
895
1021
  locales.map((locale) => {
896
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-2DuPv5k0.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1022
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-faJDuv3q.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
897
1023
  return {
898
- data: helperPlugin.prefixPluginTranslations(data, "content-releases"),
1024
+ data: prefixPluginTranslations(data, "content-releases"),
899
1025
  locale
900
1026
  };
901
1027
  }).catch(() => {
@@ -913,6 +1039,7 @@ exports.PERMISSIONS = PERMISSIONS;
913
1039
  exports.ReleaseActionMenu = ReleaseActionMenu;
914
1040
  exports.ReleaseActionOptions = ReleaseActionOptions;
915
1041
  exports.admin = admin;
1042
+ exports.getTimezoneOffset = getTimezoneOffset;
916
1043
  exports.isAxiosError = isAxiosError;
917
1044
  exports.pluginId = pluginId;
918
1045
  exports.releaseApi = releaseApi;
@@ -922,7 +1049,6 @@ exports.useGetReleaseActionsQuery = useGetReleaseActionsQuery;
922
1049
  exports.useGetReleaseQuery = useGetReleaseQuery;
923
1050
  exports.useGetReleasesQuery = useGetReleasesQuery;
924
1051
  exports.usePublishReleaseMutation = usePublishReleaseMutation;
925
- exports.useTypedDispatch = useTypedDispatch;
926
1052
  exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
927
1053
  exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
928
- //# sourceMappingURL=index-_lT-gI3M.js.map
1054
+ //# sourceMappingURL=index-cYWov2wa.js.map