@strapi/content-releases 0.0.0-experimental.e1ede8c55a0e1e22ce20137bf238fc374bd5dd51 → 0.0.0-experimental.e3e48deb89bd0a1b6cc69b698696566fa7854a95

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 (107) hide show
  1. package/dist/_chunks/App-PQlYzNfb.mjs +1337 -0
  2. package/dist/_chunks/App-PQlYzNfb.mjs.map +1 -0
  3. package/dist/_chunks/App-lzeJz92X.js +1360 -0
  4. package/dist/_chunks/App-lzeJz92X.js.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-ngTk74JV.mjs → en-WuuhP6Bn.mjs} +22 -6
  10. package/dist/_chunks/en-WuuhP6Bn.mjs.map +1 -0
  11. package/dist/_chunks/{en-haKSQIo8.js → en-gcJJ5htG.js} +22 -6
  12. package/dist/_chunks/en-gcJJ5htG.js.map +1 -0
  13. package/dist/_chunks/{index-XAQOX_IB.mjs → index--4AgLDzb.mjs} +262 -83
  14. package/dist/_chunks/index--4AgLDzb.mjs.map +1 -0
  15. package/dist/_chunks/{index-EdBmRHRU.js → index-Nf1JfI-m.js} +246 -67
  16. package/dist/_chunks/index-Nf1JfI-m.js.map +1 -0
  17. package/dist/admin/index.js +2 -1
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +3 -2
  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/time.d.ts +1 -0
  39. package/dist/server/index.js +999 -309
  40. package/dist/server/index.js.map +1 -1
  41. package/dist/server/index.mjs +999 -310
  42. package/dist/server/index.mjs.map +1 -1
  43. package/dist/server/src/bootstrap.d.ts +5 -0
  44. package/dist/server/src/bootstrap.d.ts.map +1 -0
  45. package/dist/server/src/constants.d.ts +12 -0
  46. package/dist/server/src/constants.d.ts.map +1 -0
  47. package/dist/server/src/content-types/index.d.ts +99 -0
  48. package/dist/server/src/content-types/index.d.ts.map +1 -0
  49. package/dist/server/src/content-types/release/index.d.ts +48 -0
  50. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  51. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  52. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  53. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  54. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  55. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  56. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  57. package/dist/server/src/controllers/index.d.ts +18 -0
  58. package/dist/server/src/controllers/index.d.ts.map +1 -0
  59. package/dist/server/src/controllers/release-action.d.ts +9 -0
  60. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  61. package/dist/server/src/controllers/release.d.ts +11 -0
  62. package/dist/server/src/controllers/release.d.ts.map +1 -0
  63. package/dist/server/src/controllers/validation/release-action.d.ts +3 -0
  64. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  65. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  66. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  67. package/dist/server/src/destroy.d.ts +5 -0
  68. package/dist/server/src/destroy.d.ts.map +1 -0
  69. package/dist/server/src/index.d.ts +2092 -0
  70. package/dist/server/src/index.d.ts.map +1 -0
  71. package/dist/server/src/migrations/index.d.ts +10 -0
  72. package/dist/server/src/migrations/index.d.ts.map +1 -0
  73. package/dist/server/src/register.d.ts +5 -0
  74. package/dist/server/src/register.d.ts.map +1 -0
  75. package/dist/server/src/routes/index.d.ts +35 -0
  76. package/dist/server/src/routes/index.d.ts.map +1 -0
  77. package/dist/server/src/routes/release-action.d.ts +18 -0
  78. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  79. package/dist/server/src/routes/release.d.ts +18 -0
  80. package/dist/server/src/routes/release.d.ts.map +1 -0
  81. package/dist/server/src/services/index.d.ts +1826 -0
  82. package/dist/server/src/services/index.d.ts.map +1 -0
  83. package/dist/server/src/services/release.d.ts +66 -0
  84. package/dist/server/src/services/release.d.ts.map +1 -0
  85. package/dist/server/src/services/scheduling.d.ts +18 -0
  86. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  87. package/dist/server/src/services/validation.d.ts +14 -0
  88. package/dist/server/src/services/validation.d.ts.map +1 -0
  89. package/dist/server/src/utils/index.d.ts +14 -0
  90. package/dist/server/src/utils/index.d.ts.map +1 -0
  91. package/dist/shared/contracts/release-actions.d.ts +105 -0
  92. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  93. package/dist/shared/contracts/releases.d.ts +166 -0
  94. package/dist/shared/contracts/releases.d.ts.map +1 -0
  95. package/dist/shared/types.d.ts +24 -0
  96. package/dist/shared/types.d.ts.map +1 -0
  97. package/dist/shared/validation-schemas.d.ts +2 -0
  98. package/dist/shared/validation-schemas.d.ts.map +1 -0
  99. package/package.json +19 -22
  100. package/dist/_chunks/App-g2P5kbSm.mjs +0 -945
  101. package/dist/_chunks/App-g2P5kbSm.mjs.map +0 -1
  102. package/dist/_chunks/App-o5_WfqR-.js +0 -967
  103. package/dist/_chunks/App-o5_WfqR-.js.map +0 -1
  104. package/dist/_chunks/en-haKSQIo8.js.map +0 -1
  105. package/dist/_chunks/en-ngTk74JV.mjs.map +0 -1
  106. package/dist/_chunks/index-EdBmRHRU.js.map +0 -1
  107. package/dist/_chunks/index-XAQOX_IB.mjs.map +0 -1
@@ -1,17 +1,18 @@
1
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, prefixPluginTranslations } from "@strapi/helper-plugin";
2
- import { Cross, More, Plus, PaperPlane } from "@strapi/icons";
1
+ import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useQueryParams, prefixPluginTranslations } from "@strapi/helper-plugin";
2
+ import { Cross, Pencil, More, Plus, EmptyDocuments, PaperPlane } from "@strapi/icons";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
5
  import { skipToken } from "@reduxjs/toolkit/query";
6
- import { IconButton, Flex, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
- import { Menu, LinkButton } from "@strapi/design-system/v2";
6
+ import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter, EmptyStateLayout } from "@strapi/design-system";
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";
10
10
  import { useIntl } from "react-intl";
11
- import { useParams, Link } from "react-router-dom";
11
+ 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";
15
16
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
16
17
  const v = glob[path];
17
18
  if (v) {
@@ -258,7 +259,27 @@ const releaseApi = createApi({
258
259
  data: body
259
260
  };
260
261
  },
261
- invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }]
262
+ invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
263
+ async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
264
+ const paramsWithoutActionId = {
265
+ releaseId: params.releaseId,
266
+ ...query
267
+ };
268
+ const patchResult = dispatch(
269
+ releaseApi.util.updateQueryData("getReleaseActions", paramsWithoutActionId, (draft) => {
270
+ const [key, index] = actionPath;
271
+ const action = draft.data[key][index];
272
+ if (action) {
273
+ action.type = body.type;
274
+ }
275
+ })
276
+ );
277
+ try {
278
+ await queryFulfilled;
279
+ } catch {
280
+ patchResult.undo();
281
+ }
282
+ }
262
283
  }),
263
284
  deleteReleaseAction: build.mutation({
264
285
  query({ params }) {
@@ -306,37 +327,59 @@ const {
306
327
  useDeleteReleaseActionMutation,
307
328
  useDeleteReleaseMutation
308
329
  } = releaseApi;
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
+ };
346
+ const useTypedDispatch = useDispatch;
347
+ const useTypedSelector = useSelector;
309
348
  const StyledMenuItem = styled(Menu.Item)`
310
349
  &:hover {
311
- background: ${({ theme }) => theme.colors.danger100};
350
+ background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
351
+
352
+ svg {
353
+ path {
354
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
355
+ }
356
+ }
357
+
358
+ a {
359
+ color: ${({ theme }) => theme.colors.neutral800};
360
+ }
312
361
  }
313
362
 
314
363
  svg {
315
364
  path {
316
- fill: ${({ theme }) => theme.colors.danger600};
365
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
317
366
  }
318
367
  }
319
368
 
320
- &:hover {
321
- svg {
322
- path {
323
- fill: ${({ theme }) => theme.colors.danger600};
324
- }
325
- }
369
+ a {
370
+ color: ${({ theme }) => theme.colors.neutral800};
371
+ }
372
+
373
+ span,
374
+ a {
375
+ width: 100%;
326
376
  }
327
- `;
328
- const StyledCross = styled(Cross)`
329
- padding: ${({ theme }) => theme.spaces[1]};
330
377
  `;
331
378
  const StyledIconButton = styled(IconButton)`
332
379
  /* Setting this style inline with borderColor will not apply the style */
333
380
  border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
334
381
  `;
335
- const ReleaseActionMenu = ({
336
- releaseId,
337
- actionId,
338
- hasTriggerBorder = false
339
- }) => {
382
+ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
340
383
  const { formatMessage } = useIntl();
341
384
  const toggleNotification = useNotification();
342
385
  const { formatAPIError } = useAPIErrorHandler();
@@ -369,6 +412,73 @@ const ReleaseActionMenu = ({
369
412
  }
370
413
  }
371
414
  };
415
+ return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
416
+ /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
417
+ /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
418
+ id: "content-releases.content-manager-edit-view.remove-from-release",
419
+ defaultMessage: "Remove from release"
420
+ }) })
421
+ ] }) }) });
422
+ };
423
+ const ReleaseActionEntryLinkItem = ({
424
+ contentTypeUid,
425
+ entryId,
426
+ locale
427
+ }) => {
428
+ const { formatMessage } = useIntl();
429
+ const collectionTypePermissions = useTypedSelector(
430
+ (state) => state.rbacProvider.collectionTypesRelatedPermissions
431
+ );
432
+ const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
433
+ const canUpdateEntryForLocale = Boolean(
434
+ !locale || updatePermissions?.find(
435
+ (permission) => permission.properties?.locales?.includes(locale)
436
+ )
437
+ );
438
+ return /* @__PURE__ */ jsx(
439
+ CheckPermissions,
440
+ {
441
+ permissions: [
442
+ {
443
+ action: "plugin::content-manager.explorer.update",
444
+ subject: contentTypeUid
445
+ }
446
+ ],
447
+ children: canUpdateEntryForLocale && /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
448
+ Link,
449
+ {
450
+ as: NavLink,
451
+ to: {
452
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
453
+ search: locale && `?plugins[i18n][locale]=${locale}`
454
+ },
455
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
456
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
457
+ id: "content-releases.content-manager-edit-view.edit-entry",
458
+ defaultMessage: "Edit entry"
459
+ }) })
460
+ }
461
+ ) })
462
+ }
463
+ );
464
+ };
465
+ const EditReleaseItem = ({ releaseId }) => {
466
+ const { formatMessage } = useIntl();
467
+ return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
468
+ Link,
469
+ {
470
+ as: NavLink,
471
+ to: `/plugins/content-releases/${releaseId}`,
472
+ startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
473
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
474
+ id: "content-releases.content-manager-edit-view.edit-release",
475
+ defaultMessage: "Edit release"
476
+ }) })
477
+ }
478
+ ) });
479
+ };
480
+ const Root = ({ children, hasTriggerBorder = false }) => {
481
+ const { formatMessage } = useIntl();
372
482
  return (
373
483
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
374
484
  /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
@@ -385,16 +495,16 @@ const ReleaseActionMenu = ({
385
495
  icon: /* @__PURE__ */ jsx(More, {})
386
496
  }
387
497
  ),
388
- /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
389
- /* @__PURE__ */ jsx(StyledCross, {}),
390
- /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
391
- id: "content-releases.content-manager-edit-view.remove-from-release",
392
- defaultMessage: "Remove from release"
393
- }) })
394
- ] }) }) }) })
498
+ /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
395
499
  ] }) })
396
500
  );
397
501
  };
502
+ const ReleaseActionMenu = {
503
+ Root,
504
+ EditReleaseItem,
505
+ DeleteReleaseActionItem,
506
+ ReleaseActionEntryLinkItem
507
+ };
398
508
  const getBorderLeftRadiusValue = (actionType) => {
399
509
  return actionType === "publish" ? 1 : 0;
400
510
  };
@@ -415,19 +525,40 @@ const FieldWrapper = styled(Field)`
415
525
  text-transform: capitalize;
416
526
  }
417
527
 
418
- &:active,
419
528
  &[data-checked='true'] {
420
- color: ${({ theme }) => theme.colors.primary700};
421
- background-color: ${({ theme }) => theme.colors.primary100};
422
- border-color: ${({ theme }) => theme.colors.primary700};
529
+ color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
530
+ background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
531
+ border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
423
532
  }
424
533
 
425
534
  &[data-checked='false'] {
426
535
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
427
536
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
428
537
  }
538
+
539
+ &[data-checked='false'][data-disabled='false']:hover {
540
+ color: ${({ theme }) => theme.colors.neutral700};
541
+ background-color: ${({ theme }) => theme.colors.neutral100};
542
+ border-color: ${({ theme }) => theme.colors.neutral200};
543
+
544
+ & > label {
545
+ cursor: pointer;
546
+ }
547
+ }
548
+
549
+ &[data-disabled='true'] {
550
+ color: ${({ theme }) => theme.colors.neutral600};
551
+ background-color: ${({ theme }) => theme.colors.neutral150};
552
+ border-color: ${({ theme }) => theme.colors.neutral300};
553
+ }
429
554
  `;
430
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
555
+ const ActionOption = ({
556
+ selected,
557
+ actionType,
558
+ handleChange,
559
+ name,
560
+ disabled = false
561
+ }) => {
431
562
  return /* @__PURE__ */ jsx(
432
563
  FieldWrapper,
433
564
  {
@@ -438,6 +569,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
438
569
  position: "relative",
439
570
  cursor: "pointer",
440
571
  "data-checked": selected === actionType,
572
+ "data-disabled": disabled && selected !== actionType,
441
573
  children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
442
574
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
443
575
  FieldInput,
@@ -447,7 +579,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
447
579
  name,
448
580
  checked: selected === actionType,
449
581
  onChange: handleChange,
450
- value: actionType
582
+ value: actionType,
583
+ disabled
451
584
  }
452
585
  ) }),
453
586
  actionType
@@ -455,7 +588,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
455
588
  }
456
589
  );
457
590
  };
458
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
591
+ const ReleaseActionOptions = ({
592
+ selected,
593
+ handleChange,
594
+ name,
595
+ disabled = false
596
+ }) => {
459
597
  return /* @__PURE__ */ jsxs(Flex, { children: [
460
598
  /* @__PURE__ */ jsx(
461
599
  ActionOption,
@@ -463,7 +601,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
463
601
  actionType: "publish",
464
602
  selected,
465
603
  handleChange,
466
- name
604
+ name,
605
+ disabled
467
606
  }
468
607
  ),
469
608
  /* @__PURE__ */ jsx(
@@ -472,7 +611,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
472
611
  actionType: "unpublish",
473
612
  selected,
474
613
  handleChange,
475
- name
614
+ name,
615
+ disabled
476
616
  }
477
617
  )
478
618
  ] });
@@ -488,19 +628,20 @@ const INITIAL_VALUES = {
488
628
  const NoReleases = () => {
489
629
  const { formatMessage } = useIntl();
490
630
  return /* @__PURE__ */ jsx(
491
- NoContent,
631
+ EmptyStateLayout,
492
632
  {
493
- content: {
633
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
634
+ content: formatMessage({
494
635
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
495
636
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
496
- },
637
+ }),
497
638
  action: /* @__PURE__ */ jsx(
498
639
  LinkButton,
499
640
  {
500
641
  to: {
501
642
  pathname: "/plugins/content-releases"
502
643
  },
503
- as: Link,
644
+ as: Link$1,
504
645
  variant: "secondary",
505
646
  children: formatMessage({
506
647
  id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
@@ -516,10 +657,12 @@ const AddActionToReleaseModal = ({
516
657
  contentTypeUid,
517
658
  entryId
518
659
  }) => {
660
+ const releaseHeaderId = React.useId();
519
661
  const { formatMessage } = useIntl();
520
662
  const toggleNotification = useNotification();
521
663
  const { formatAPIError } = useAPIErrorHandler();
522
- const { modifiedData } = useCMEditViewDataManager();
664
+ const [{ query }] = useQueryParams();
665
+ const locale = query.plugins?.i18n?.locale;
523
666
  const response = useGetReleasesForEntryQuery({
524
667
  contentTypeUid,
525
668
  entryId,
@@ -528,7 +671,6 @@ const AddActionToReleaseModal = ({
528
671
  const releases = response.data?.data;
529
672
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
530
673
  const handleSubmit = async (values) => {
531
- const locale = modifiedData.locale;
532
674
  const releaseActionEntry = {
533
675
  contentType: contentTypeUid,
534
676
  id: entryId,
@@ -563,8 +705,8 @@ const AddActionToReleaseModal = ({
563
705
  }
564
706
  }
565
707
  };
566
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
567
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
708
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
709
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
568
710
  id: "content-releases.content-manager-edit-view.add-to-release",
569
711
  defaultMessage: "Add to release"
570
712
  }) }) }),
@@ -634,16 +776,15 @@ const AddActionToReleaseModal = ({
634
776
  };
635
777
  const CMReleasesContainer = () => {
636
778
  const [isModalOpen, setIsModalOpen] = React.useState(false);
637
- const { formatMessage } = useIntl();
638
- const {
639
- isCreatingEntry,
640
- allLayoutData: { contentType }
641
- } = useCMEditViewDataManager();
642
- const params = useParams();
643
- const canFetch = params?.id != null && contentType?.uid != null;
779
+ const { formatMessage, formatDate, formatTime } = useIntl();
780
+ const { id, slug } = useParams();
781
+ const isCreatingEntry = id === "create";
782
+ const contentTypeUid = slug;
783
+ const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
784
+ const canFetch = id != null && contentTypeUid != null;
644
785
  const fetchParams = canFetch ? {
645
- contentTypeUid: contentType.uid,
646
- entryId: params.id,
786
+ contentTypeUid,
787
+ entryId: id,
647
788
  hasEntryAttached: true
648
789
  } : skipToken;
649
790
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -651,7 +792,7 @@ const CMReleasesContainer = () => {
651
792
  if (!canFetch) {
652
793
  return null;
653
794
  }
654
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
795
+ if (isCreatingEntry) {
655
796
  return null;
656
797
  }
657
798
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -718,16 +859,40 @@ const CMReleasesContainer = () => {
718
859
  )
719
860
  }
720
861
  ),
721
- /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
862
+ /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
722
863
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
723
- /* @__PURE__ */ jsx(
724
- ReleaseActionMenu,
864
+ IsSchedulingEnabled && release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
865
+ {
866
+ id: "content-releases.content-manager-edit-view.scheduled.date",
867
+ defaultMessage: "{date} at {time} ({offset})"
868
+ },
725
869
  {
726
- releaseId: release.id,
727
- actionId: release.action.id,
728
- hasTriggerBorder: true
870
+ date: formatDate(new Date(release.scheduledAt), {
871
+ day: "2-digit",
872
+ month: "2-digit",
873
+ year: "numeric",
874
+ timeZone: release.timezone
875
+ }),
876
+ time: formatTime(new Date(release.scheduledAt), {
877
+ hourCycle: "h23",
878
+ timeZone: release.timezone
879
+ }),
880
+ offset: getTimezoneOffset(
881
+ release.timezone,
882
+ new Date(release.scheduledAt)
883
+ )
729
884
  }
730
- )
885
+ ) }),
886
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
887
+ /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
888
+ /* @__PURE__ */ jsx(
889
+ ReleaseActionMenu.DeleteReleaseActionItem,
890
+ {
891
+ releaseId: release.id,
892
+ actionId: release.action.id
893
+ }
894
+ )
895
+ ] }) })
731
896
  ] })
732
897
  ]
733
898
  },
@@ -755,8 +920,8 @@ const CMReleasesContainer = () => {
755
920
  AddActionToReleaseModal,
756
921
  {
757
922
  handleClose: toggleModal,
758
- contentTypeUid: contentType.uid,
759
- entryId: params.id
923
+ contentTypeUid,
924
+ entryId: id
760
925
  }
761
926
  )
762
927
  ]
@@ -766,18 +931,15 @@ const CMReleasesContainer = () => {
766
931
  const admin = {
767
932
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
768
933
  register(app) {
769
- if (window.strapi.features.isEnabled("cms-content-releases") && window.strapi.future.isEnabled("contentReleases")) {
934
+ if (window.strapi.features.isEnabled("cms-content-releases")) {
770
935
  app.addMenuLink({
771
- to: `/plugins/${pluginId}`,
936
+ to: `plugins/${pluginId}`,
772
937
  icon: PaperPlane,
773
938
  intlLabel: {
774
939
  id: `${pluginId}.plugin.name`,
775
940
  defaultMessage: "Releases"
776
941
  },
777
- async Component() {
778
- const { App } = await import("./App-g2P5kbSm.mjs");
779
- return App;
780
- },
942
+ Component: () => import("./App-PQlYzNfb.mjs").then((mod) => ({ default: mod.App })),
781
943
  permissions: PERMISSIONS.main
782
944
  });
783
945
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -788,12 +950,26 @@ const admin = {
788
950
  name: `${pluginId}-link`,
789
951
  Component: CMReleasesContainer
790
952
  });
953
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
954
+ app.addMenuLink({
955
+ to: `/plugins/purchase-content-releases`,
956
+ icon: PaperPlane,
957
+ intlLabel: {
958
+ id: `${pluginId}.plugin.name`,
959
+ defaultMessage: "Releases"
960
+ },
961
+ async Component() {
962
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-Clm0iACO.mjs");
963
+ return PurchaseContentReleases;
964
+ },
965
+ lockIcon: true
966
+ });
791
967
  }
792
968
  },
793
969
  async registerTrads({ locales }) {
794
970
  const importedTrads = await Promise.all(
795
971
  locales.map((locale) => {
796
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-ngTk74JV.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
972
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-WuuhP6Bn.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
797
973
  return {
798
974
  data: prefixPluginTranslations(data, "content-releases"),
799
975
  locale
@@ -812,17 +988,20 @@ const admin = {
812
988
  export {
813
989
  PERMISSIONS as P,
814
990
  ReleaseActionOptions as R,
815
- useUpdateReleaseMutation as a,
816
- useDeleteReleaseMutation as b,
817
- usePublishReleaseMutation as c,
818
- useGetReleaseActionsQuery as d,
819
- useUpdateReleaseActionMutation as e,
820
- ReleaseActionMenu as f,
821
- useGetReleasesQuery as g,
822
- useCreateReleaseMutation as h,
991
+ useCreateReleaseMutation as a,
992
+ useGetReleaseQuery as b,
993
+ useUpdateReleaseMutation as c,
994
+ useDeleteReleaseMutation as d,
995
+ usePublishReleaseMutation as e,
996
+ useTypedDispatch as f,
997
+ getTimezoneOffset as g,
998
+ useGetReleaseActionsQuery as h,
823
999
  isAxiosError as i,
824
- admin as j,
1000
+ useUpdateReleaseActionMutation as j,
1001
+ ReleaseActionMenu as k,
1002
+ admin as l,
825
1003
  pluginId as p,
826
- useGetReleaseQuery as u
1004
+ releaseApi as r,
1005
+ useGetReleasesQuery as u
827
1006
  };
828
- //# sourceMappingURL=index-XAQOX_IB.mjs.map
1007
+ //# sourceMappingURL=index--4AgLDzb.mjs.map