@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
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, 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, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
5
+ import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, unstable_useDocument, useQueryParams } from "@strapi/admin/strapi-admin";
6
+ import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter, EmptyStateLayout } from "@strapi/design-system";
7
7
  import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
8
  import { isAxiosError as isAxiosError$1 } from "axios";
9
9
  import { Formik, Form } from "formik";
@@ -12,7 +12,6 @@ import { NavLink, useParams, Link as Link$1 } from "react-router-dom";
12
12
  import * as yup from "yup";
13
13
  import { createApi } from "@reduxjs/toolkit/query/react";
14
14
  import styled from "styled-components";
15
- import { useDispatch, useSelector } from "react-redux";
16
15
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
16
  const v = glob[path];
18
17
  if (v) {
@@ -288,8 +287,9 @@ const releaseApi = createApi({
288
287
  method: "DELETE"
289
288
  };
290
289
  },
291
- invalidatesTags: [
290
+ invalidatesTags: (result, error, arg) => [
292
291
  { type: "Release", id: "LIST" },
292
+ { type: "Release", id: arg.params.releaseId },
293
293
  { type: "ReleaseAction", id: "LIST" }
294
294
  ]
295
295
  }),
@@ -309,7 +309,7 @@ const releaseApi = createApi({
309
309
  method: "DELETE"
310
310
  };
311
311
  },
312
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
312
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }]
313
313
  })
314
314
  };
315
315
  }
@@ -327,8 +327,22 @@ const {
327
327
  useDeleteReleaseActionMutation,
328
328
  useDeleteReleaseMutation
329
329
  } = releaseApi;
330
- const useTypedDispatch = useDispatch;
331
- const useTypedSelector = useSelector;
330
+ const getTimezoneOffset = (timezone, date) => {
331
+ try {
332
+ const offsetPart = new Intl.DateTimeFormat("en", {
333
+ timeZone: timezone,
334
+ timeZoneName: "longOffset"
335
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
336
+ const offset = offsetPart ? offsetPart.value : "";
337
+ let utcOffset = offset.replace("GMT", "UTC");
338
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
339
+ utcOffset = `${utcOffset}+00:00`;
340
+ }
341
+ return utcOffset;
342
+ } catch (error) {
343
+ return "";
344
+ }
345
+ };
332
346
  const StyledMenuItem = styled(Menu.Item)`
333
347
  &:hover {
334
348
  background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
@@ -365,9 +379,12 @@ const StyledIconButton = styled(IconButton)`
365
379
  `;
366
380
  const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
367
381
  const { formatMessage } = useIntl();
368
- const toggleNotification = useNotification();
382
+ const { toggleNotification } = useNotification();
369
383
  const { formatAPIError } = useAPIErrorHandler();
370
384
  const [deleteReleaseAction] = useDeleteReleaseActionMutation();
385
+ const {
386
+ allowedActions: { canDeleteAction }
387
+ } = useRBAC(PERMISSIONS);
371
388
  const handleDeleteAction = async () => {
372
389
  const response = await deleteReleaseAction({
373
390
  params: { releaseId, actionId }
@@ -385,24 +402,27 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
385
402
  if ("error" in response) {
386
403
  if (isAxiosError$1(response.error)) {
387
404
  toggleNotification({
388
- type: "warning",
405
+ type: "danger",
389
406
  message: formatAPIError(response.error)
390
407
  });
391
408
  } else {
392
409
  toggleNotification({
393
- type: "warning",
410
+ type: "danger",
394
411
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
395
412
  });
396
413
  }
397
414
  }
398
415
  };
399
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
400
- /* @__PURE__ */ jsx(Icon, { as: Cross, padding: 1 }),
416
+ if (!canDeleteAction) {
417
+ return null;
418
+ }
419
+ return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
420
+ /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
401
421
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
402
422
  id: "content-releases.content-manager-edit-view.remove-from-release",
403
423
  defaultMessage: "Remove from release"
404
424
  }) })
405
- ] }) }) });
425
+ ] }) });
406
426
  };
407
427
  const ReleaseActionEntryLinkItem = ({
408
428
  contentTypeUid,
@@ -410,47 +430,66 @@ const ReleaseActionEntryLinkItem = ({
410
430
  locale
411
431
  }) => {
412
432
  const { formatMessage } = useIntl();
413
- const collectionTypePermissions = useTypedSelector(
414
- (state) => state.rbacProvider.collectionTypesRelatedPermissions
415
- );
416
- const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
417
- const canUpdateEntryForLocale = Boolean(
418
- !locale || updatePermissions?.find(
419
- (permission) => permission.properties?.locales?.includes(locale)
420
- )
421
- );
422
- return /* @__PURE__ */ jsx(
423
- CheckPermissions,
433
+ const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
434
+ const canUpdateEntryForLocale = React.useMemo(() => {
435
+ const updatePermissions = userPermissions.find(
436
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
437
+ );
438
+ if (!updatePermissions) {
439
+ return false;
440
+ }
441
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
442
+ }, [contentTypeUid, locale, userPermissions]);
443
+ const {
444
+ allowedActions: { canUpdateContentType }
445
+ } = useRBAC({
446
+ updateContentType: [
447
+ {
448
+ action: "plugin::content-manager.explorer.update",
449
+ subject: contentTypeUid
450
+ }
451
+ ]
452
+ });
453
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
454
+ return null;
455
+ }
456
+ return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
457
+ Link,
424
458
  {
425
- permissions: [
426
- {
427
- action: "plugin::content-manager.explorer.update",
428
- subject: contentTypeUid
429
- }
430
- ],
431
- children: canUpdateEntryForLocale && /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
432
- Link,
433
- {
434
- as: NavLink,
435
- to: {
436
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
437
- search: locale && `?plugins[i18n][locale]=${locale}`
438
- },
439
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, padding: 1 }),
440
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
441
- id: "content-releases.content-manager-edit-view.edit-entry",
442
- defaultMessage: "Edit entry"
443
- }) })
444
- }
445
- ) })
459
+ as: NavLink,
460
+ to: {
461
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
462
+ search: locale && `?plugins[i18n][locale]=${locale}`
463
+ },
464
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
465
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
466
+ id: "content-releases.content-manager-edit-view.edit-entry",
467
+ defaultMessage: "Edit entry"
468
+ }) })
446
469
  }
447
- );
470
+ ) });
471
+ };
472
+ const EditReleaseItem = ({ releaseId }) => {
473
+ const { formatMessage } = useIntl();
474
+ return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
475
+ Link,
476
+ {
477
+ href: `/admin/plugins/content-releases/${releaseId}`,
478
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
479
+ isExternal: false,
480
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
481
+ id: "content-releases.content-manager-edit-view.edit-release",
482
+ defaultMessage: "Edit release"
483
+ }) })
484
+ }
485
+ ) });
448
486
  };
449
487
  const Root = ({ children, hasTriggerBorder = false }) => {
450
488
  const { formatMessage } = useIntl();
489
+ const { allowedActions } = useRBAC(PERMISSIONS);
451
490
  return (
452
491
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
453
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
492
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
454
493
  /* @__PURE__ */ jsx(
455
494
  Menu.Trigger,
456
495
  {
@@ -465,11 +504,12 @@ const Root = ({ children, hasTriggerBorder = false }) => {
465
504
  }
466
505
  ),
467
506
  /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
468
- ] }) })
507
+ ] }) : null
469
508
  );
470
509
  };
471
510
  const ReleaseActionMenu = {
472
511
  Root,
512
+ EditReleaseItem,
473
513
  DeleteReleaseActionItem,
474
514
  ReleaseActionEntryLinkItem
475
515
  };
@@ -493,19 +533,40 @@ const FieldWrapper = styled(Field)`
493
533
  text-transform: capitalize;
494
534
  }
495
535
 
496
- &:active,
497
536
  &[data-checked='true'] {
498
- color: ${({ theme }) => theme.colors.primary700};
499
- background-color: ${({ theme }) => theme.colors.primary100};
500
- border-color: ${({ theme }) => theme.colors.primary700};
537
+ color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
538
+ background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
539
+ border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
501
540
  }
502
541
 
503
542
  &[data-checked='false'] {
504
543
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
505
544
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
506
545
  }
546
+
547
+ &[data-checked='false'][data-disabled='false']:hover {
548
+ color: ${({ theme }) => theme.colors.neutral700};
549
+ background-color: ${({ theme }) => theme.colors.neutral100};
550
+ border-color: ${({ theme }) => theme.colors.neutral200};
551
+
552
+ & > label {
553
+ cursor: pointer;
554
+ }
555
+ }
556
+
557
+ &[data-disabled='true'] {
558
+ color: ${({ theme }) => theme.colors.neutral600};
559
+ background-color: ${({ theme }) => theme.colors.neutral150};
560
+ border-color: ${({ theme }) => theme.colors.neutral300};
561
+ }
507
562
  `;
508
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
563
+ const ActionOption = ({
564
+ selected,
565
+ actionType,
566
+ handleChange,
567
+ name,
568
+ disabled = false
569
+ }) => {
509
570
  return /* @__PURE__ */ jsx(
510
571
  FieldWrapper,
511
572
  {
@@ -516,6 +577,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
516
577
  position: "relative",
517
578
  cursor: "pointer",
518
579
  "data-checked": selected === actionType,
580
+ "data-disabled": disabled && selected !== actionType,
519
581
  children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
520
582
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
521
583
  FieldInput,
@@ -525,7 +587,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
525
587
  name,
526
588
  checked: selected === actionType,
527
589
  onChange: handleChange,
528
- value: actionType
590
+ value: actionType,
591
+ disabled
529
592
  }
530
593
  ) }),
531
594
  actionType
@@ -533,7 +596,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
533
596
  }
534
597
  );
535
598
  };
536
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
599
+ const ReleaseActionOptions = ({
600
+ selected,
601
+ handleChange,
602
+ name,
603
+ disabled = false
604
+ }) => {
537
605
  return /* @__PURE__ */ jsxs(Flex, { children: [
538
606
  /* @__PURE__ */ jsx(
539
607
  ActionOption,
@@ -541,7 +609,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
541
609
  actionType: "publish",
542
610
  selected,
543
611
  handleChange,
544
- name
612
+ name,
613
+ disabled
545
614
  }
546
615
  ),
547
616
  /* @__PURE__ */ jsx(
@@ -550,7 +619,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
550
619
  actionType: "unpublish",
551
620
  selected,
552
621
  handleChange,
553
- name
622
+ name,
623
+ disabled
554
624
  }
555
625
  )
556
626
  ] });
@@ -566,12 +636,13 @@ const INITIAL_VALUES = {
566
636
  const NoReleases = () => {
567
637
  const { formatMessage } = useIntl();
568
638
  return /* @__PURE__ */ jsx(
569
- NoContent,
639
+ EmptyStateLayout,
570
640
  {
571
- content: {
641
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
642
+ content: formatMessage({
572
643
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
573
644
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
574
- },
645
+ }),
575
646
  action: /* @__PURE__ */ jsx(
576
647
  LinkButton,
577
648
  {
@@ -594,10 +665,12 @@ const AddActionToReleaseModal = ({
594
665
  contentTypeUid,
595
666
  entryId
596
667
  }) => {
668
+ const releaseHeaderId = React.useId();
597
669
  const { formatMessage } = useIntl();
598
- const toggleNotification = useNotification();
670
+ const { toggleNotification } = useNotification();
599
671
  const { formatAPIError } = useAPIErrorHandler();
600
- const { modifiedData } = useCMEditViewDataManager();
672
+ const [{ query }] = useQueryParams();
673
+ const locale = query.plugins?.i18n?.locale;
601
674
  const response = useGetReleasesForEntryQuery({
602
675
  contentTypeUid,
603
676
  entryId,
@@ -606,7 +679,6 @@ const AddActionToReleaseModal = ({
606
679
  const releases = response.data?.data;
607
680
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
608
681
  const handleSubmit = async (values) => {
609
- const locale = modifiedData.locale;
610
682
  const releaseActionEntry = {
611
683
  contentType: contentTypeUid,
612
684
  id: entryId,
@@ -630,19 +702,19 @@ const AddActionToReleaseModal = ({
630
702
  if ("error" in response2) {
631
703
  if (isAxiosError$1(response2.error)) {
632
704
  toggleNotification({
633
- type: "warning",
705
+ type: "danger",
634
706
  message: formatAPIError(response2.error)
635
707
  });
636
708
  } else {
637
709
  toggleNotification({
638
- type: "warning",
710
+ type: "danger",
639
711
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
640
712
  });
641
713
  }
642
714
  }
643
715
  };
644
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
645
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
716
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
717
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
646
718
  id: "content-releases.content-manager-edit-view.add-to-release",
647
719
  defaultMessage: "Add to release"
648
720
  }) }) }),
@@ -712,16 +784,22 @@ const AddActionToReleaseModal = ({
712
784
  };
713
785
  const CMReleasesContainer = () => {
714
786
  const [isModalOpen, setIsModalOpen] = React.useState(false);
715
- const { formatMessage } = useIntl();
787
+ const { formatMessage, formatDate, formatTime } = useIntl();
788
+ const { id, slug, collectionType } = useParams();
789
+ const isCreatingEntry = id === "create";
716
790
  const {
717
- isCreatingEntry,
718
- allLayoutData: { contentType }
719
- } = useCMEditViewDataManager();
720
- const params = useParams();
721
- const canFetch = params?.id != null && contentType?.uid != null;
791
+ allowedActions: { canCreateAction, canMain, canDeleteAction }
792
+ } = useRBAC(PERMISSIONS);
793
+ const { schema } = unstable_useDocument({
794
+ collectionType,
795
+ model: slug
796
+ });
797
+ const hasDraftAndPublish = schema?.options?.draftAndPublish;
798
+ const contentTypeUid = slug;
799
+ const canFetch = id != null && contentTypeUid != null;
722
800
  const fetchParams = canFetch ? {
723
- contentTypeUid: contentType.uid,
724
- entryId: params.id,
801
+ contentTypeUid,
802
+ entryId: id,
725
803
  hasEntryAttached: true
726
804
  } : skipToken;
727
805
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -729,7 +807,7 @@ const CMReleasesContainer = () => {
729
807
  if (!canFetch) {
730
808
  return null;
731
809
  }
732
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
810
+ if (isCreatingEntry || !hasDraftAndPublish) {
733
811
  return null;
734
812
  }
735
813
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -739,7 +817,10 @@ const CMReleasesContainer = () => {
739
817
  }
740
818
  return `success${shade}`;
741
819
  };
742
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(
820
+ if (!canMain) {
821
+ return null;
822
+ }
823
+ return /* @__PURE__ */ jsxs(
743
824
  Box,
744
825
  {
745
826
  as: "aside",
@@ -796,22 +877,47 @@ const CMReleasesContainer = () => {
796
877
  )
797
878
  }
798
879
  ),
799
- /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
880
+ /* @__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: [
800
881
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
801
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsx(
802
- ReleaseActionMenu.DeleteReleaseActionItem,
882
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
803
883
  {
804
- releaseId: release.id,
805
- actionId: release.action.id
884
+ id: "content-releases.content-manager-edit-view.scheduled.date",
885
+ defaultMessage: "{date} at {time} ({offset})"
886
+ },
887
+ {
888
+ date: formatDate(new Date(release.scheduledAt), {
889
+ day: "2-digit",
890
+ month: "2-digit",
891
+ year: "numeric",
892
+ timeZone: release.timezone
893
+ }),
894
+ time: formatTime(new Date(release.scheduledAt), {
895
+ hourCycle: "h23",
896
+ timeZone: release.timezone
897
+ }),
898
+ offset: getTimezoneOffset(
899
+ release.timezone,
900
+ new Date(release.scheduledAt)
901
+ )
806
902
  }
807
- ) }) })
808
- ] })
903
+ ) }),
904
+ canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
905
+ /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
906
+ /* @__PURE__ */ jsx(
907
+ ReleaseActionMenu.DeleteReleaseActionItem,
908
+ {
909
+ releaseId: release.id,
910
+ actionId: release.action.id
911
+ }
912
+ )
913
+ ] }) : null
914
+ ] }) })
809
915
  ]
810
916
  },
811
917
  release.id
812
918
  );
813
919
  }),
814
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
920
+ canCreateAction ? /* @__PURE__ */ jsx(
815
921
  Button,
816
922
  {
817
923
  justifyContent: "center",
@@ -826,35 +932,41 @@ const CMReleasesContainer = () => {
826
932
  defaultMessage: "Add to release"
827
933
  })
828
934
  }
829
- ) })
935
+ ) : null
830
936
  ] }),
831
937
  isModalOpen && /* @__PURE__ */ jsx(
832
938
  AddActionToReleaseModal,
833
939
  {
834
940
  handleClose: toggleModal,
835
- contentTypeUid: contentType.uid,
836
- entryId: params.id
941
+ contentTypeUid,
942
+ entryId: id
837
943
  }
838
944
  )
839
945
  ]
840
946
  }
841
- ) });
947
+ );
948
+ };
949
+ const prefixPluginTranslations = (trad, pluginId2) => {
950
+ if (!pluginId2) {
951
+ throw new TypeError("pluginId can't be empty");
952
+ }
953
+ return Object.keys(trad).reduce((acc, current) => {
954
+ acc[`${pluginId2}.${current}`] = trad[current];
955
+ return acc;
956
+ }, {});
842
957
  };
843
958
  const admin = {
844
959
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
845
960
  register(app) {
846
961
  if (window.strapi.features.isEnabled("cms-content-releases")) {
847
962
  app.addMenuLink({
848
- to: `/plugins/${pluginId}`,
963
+ to: `plugins/${pluginId}`,
849
964
  icon: PaperPlane,
850
965
  intlLabel: {
851
966
  id: `${pluginId}.plugin.name`,
852
967
  defaultMessage: "Releases"
853
968
  },
854
- async Component() {
855
- const { App } = await import("./App-_Jj3tWts.mjs");
856
- return App;
857
- },
969
+ Component: () => import("./App-X01LBg5V.mjs").then((mod) => ({ default: mod.App })),
858
970
  permissions: PERMISSIONS.main
859
971
  });
860
972
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -865,12 +977,26 @@ const admin = {
865
977
  name: `${pluginId}-link`,
866
978
  Component: CMReleasesContainer
867
979
  });
980
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
981
+ app.addMenuLink({
982
+ to: `/plugins/purchase-content-releases`,
983
+ icon: PaperPlane,
984
+ intlLabel: {
985
+ id: `${pluginId}.plugin.name`,
986
+ defaultMessage: "Releases"
987
+ },
988
+ async Component() {
989
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-Clm0iACO.mjs");
990
+ return PurchaseContentReleases;
991
+ },
992
+ lockIcon: true
993
+ });
868
994
  }
869
995
  },
870
996
  async registerTrads({ locales }) {
871
997
  const importedTrads = await Promise.all(
872
998
  locales.map((locale) => {
873
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-SOqjCdyh.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
999
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-RdapH-9X.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
874
1000
  return {
875
1001
  data: prefixPluginTranslations(data, "content-releases"),
876
1002
  locale
@@ -889,19 +1015,19 @@ const admin = {
889
1015
  export {
890
1016
  PERMISSIONS as P,
891
1017
  ReleaseActionOptions as R,
892
- useUpdateReleaseMutation as a,
893
- useDeleteReleaseMutation as b,
894
- usePublishReleaseMutation as c,
895
- useTypedDispatch as d,
896
- useGetReleaseActionsQuery as e,
897
- useUpdateReleaseActionMutation as f,
898
- ReleaseActionMenu as g,
899
- useGetReleasesQuery as h,
1018
+ useCreateReleaseMutation as a,
1019
+ useGetReleaseQuery as b,
1020
+ useUpdateReleaseMutation as c,
1021
+ useDeleteReleaseMutation as d,
1022
+ usePublishReleaseMutation as e,
1023
+ useGetReleaseActionsQuery as f,
1024
+ getTimezoneOffset as g,
1025
+ useUpdateReleaseActionMutation as h,
900
1026
  isAxiosError as i,
901
- useCreateReleaseMutation as j,
1027
+ ReleaseActionMenu as j,
902
1028
  admin as k,
903
1029
  pluginId as p,
904
1030
  releaseApi as r,
905
- useGetReleaseQuery as u
1031
+ useGetReleasesQuery as u
906
1032
  };
907
- //# sourceMappingURL=index-bsuc8ZwZ.mjs.map
1033
+ //# sourceMappingURL=index-OD9AlD-6.mjs.map