@strapi/content-releases 0.0.0-experimental.f7b9b47085e387e97f990d8695971b51d7f7149a → 0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011

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-0Er6xxcq.mjs +1358 -0
  2. package/dist/_chunks/App-0Er6xxcq.mjs.map +1 -0
  3. package/dist/_chunks/App-C768ulk4.js +1381 -0
  4. package/dist/_chunks/App-C768ulk4.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-e98d8b57.mjs → en-WuuhP6Bn.mjs} +33 -8
  10. package/dist/_chunks/en-WuuhP6Bn.mjs.map +1 -0
  11. package/dist/_chunks/{en-13576ce2.js → en-gcJJ5htG.js} +33 -8
  12. package/dist/_chunks/en-gcJJ5htG.js.map +1 -0
  13. package/dist/_chunks/{index-66d129ac.js → index-BLSMpbpZ.js} +258 -68
  14. package/dist/_chunks/index-BLSMpbpZ.js.map +1 -0
  15. package/dist/_chunks/{index-937f8179.mjs → index-fJx1up7m.mjs} +273 -83
  16. package/dist/_chunks/index-fJx1up7m.mjs.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 +1008 -298
  40. package/dist/server/index.js.map +1 -1
  41. package/dist/server/index.mjs +1006 -299
  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 +3838 -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 +3572 -0
  82. package/dist/server/src/services/index.d.ts.map +1 -0
  83. package/dist/server/src/services/release.d.ts +1812 -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 +18 -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 +20 -22
  100. package/dist/_chunks/App-a4843fda.mjs +0 -855
  101. package/dist/_chunks/App-a4843fda.mjs.map +0 -1
  102. package/dist/_chunks/App-f2cafd81.js +0 -877
  103. package/dist/_chunks/App-f2cafd81.js.map +0 -1
  104. package/dist/_chunks/en-13576ce2.js.map +0 -1
  105. package/dist/_chunks/en-e98d8b57.mjs.map +0 -1
  106. package/dist/_chunks/index-66d129ac.js.map +0 -1
  107. package/dist/_chunks/index-937f8179.mjs.map +0 -1
@@ -13,6 +13,7 @@ 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");
16
17
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
17
18
  function _interopNamespace(e) {
18
19
  if (e && e.__esModule)
@@ -229,22 +230,16 @@ const releaseApi = react.createApi({
229
230
  providesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
230
231
  }),
231
232
  getReleaseActions: build.query({
232
- query({ releaseId, page, pageSize }) {
233
+ query({ releaseId, ...params }) {
233
234
  return {
234
235
  url: `/content-releases/${releaseId}/actions`,
235
236
  method: "GET",
236
237
  config: {
237
- params: {
238
- page,
239
- pageSize
240
- }
238
+ params
241
239
  }
242
240
  };
243
241
  },
244
- providesTags: (result, error, arg) => result ? [
245
- ...result.data.map(({ id }) => ({ type: "ReleaseAction", id })),
246
- { type: "ReleaseAction", id: "LIST" }
247
- ] : [{ type: "ReleaseAction", id: "LIST" }]
242
+ providesTags: [{ type: "ReleaseAction", id: "LIST" }]
248
243
  }),
249
244
  createRelease: build.mutation({
250
245
  query(data) {
@@ -287,9 +282,27 @@ const releaseApi = react.createApi({
287
282
  data: body
288
283
  };
289
284
  },
290
- invalidatesTags: (result, error, arg) => [
291
- { type: "ReleaseAction", id: arg.params.actionId }
292
- ]
285
+ invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
286
+ async onQueryStarted({ body, params, query: query2, actionPath }, { dispatch, queryFulfilled }) {
287
+ const paramsWithoutActionId = {
288
+ releaseId: params.releaseId,
289
+ ...query2
290
+ };
291
+ const patchResult = dispatch(
292
+ releaseApi.util.updateQueryData("getReleaseActions", paramsWithoutActionId, (draft) => {
293
+ const [key, index] = actionPath;
294
+ const action = draft.data[key][index];
295
+ if (action) {
296
+ action.type = body.type;
297
+ }
298
+ })
299
+ );
300
+ try {
301
+ await queryFulfilled;
302
+ } catch {
303
+ patchResult.undo();
304
+ }
305
+ }
293
306
  }),
294
307
  deleteReleaseAction: build.mutation({
295
308
  query({ params }) {
@@ -337,29 +350,59 @@ const {
337
350
  useDeleteReleaseActionMutation,
338
351
  useDeleteReleaseMutation
339
352
  } = releaseApi;
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
+ };
369
+ const useTypedDispatch = reactRedux.useDispatch;
370
+ const useTypedSelector = reactRedux.useSelector;
340
371
  const StyledMenuItem = styled__default.default(v2.Menu.Item)`
341
372
  &:hover {
342
- background: transparent;
373
+ background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
374
+
375
+ svg {
376
+ path {
377
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
378
+ }
379
+ }
380
+
381
+ a {
382
+ color: ${({ theme }) => theme.colors.neutral800};
383
+ }
343
384
  }
344
385
 
345
386
  svg {
346
387
  path {
347
- fill: ${({ theme }) => theme.colors.danger600};
388
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
348
389
  }
349
390
  }
350
391
 
351
- &:hover {
352
- svg {
353
- path {
354
- fill: ${({ theme }) => theme.colors.danger600};
355
- }
356
- }
392
+ a {
393
+ color: ${({ theme }) => theme.colors.neutral800};
394
+ }
395
+
396
+ span,
397
+ a {
398
+ width: 100%;
357
399
  }
358
400
  `;
359
- const StyledCross = styled__default.default(icons.Cross)`
360
- padding: ${({ theme }) => theme.spaces[1]};
401
+ const StyledIconButton = styled__default.default(designSystem.IconButton)`
402
+ /* Setting this style inline with borderColor will not apply the style */
403
+ border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
361
404
  `;
362
- const ReleaseActionMenu = ({ releaseId, actionId }) => {
405
+ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
363
406
  const { formatMessage } = reactIntl.useIntl();
364
407
  const toggleNotification = helperPlugin.useNotification();
365
408
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
@@ -392,13 +435,80 @@ const ReleaseActionMenu = ({ releaseId, actionId }) => {
392
435
  }
393
436
  }
394
437
  };
438
+ 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: [
439
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Cross, width: 3, height: 3 }),
440
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
441
+ id: "content-releases.content-manager-edit-view.remove-from-release",
442
+ defaultMessage: "Remove from release"
443
+ }) })
444
+ ] }) }) });
445
+ };
446
+ const ReleaseActionEntryLinkItem = ({
447
+ contentTypeUid,
448
+ entryId,
449
+ locale
450
+ }) => {
451
+ const { formatMessage } = reactIntl.useIntl();
452
+ const collectionTypePermissions = useTypedSelector(
453
+ (state) => state.rbacProvider.collectionTypesRelatedPermissions
454
+ );
455
+ const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
456
+ const canUpdateEntryForLocale = Boolean(
457
+ !locale || updatePermissions?.find(
458
+ (permission) => permission.properties?.locales?.includes(locale)
459
+ )
460
+ );
461
+ return /* @__PURE__ */ jsxRuntime.jsx(
462
+ helperPlugin.CheckPermissions,
463
+ {
464
+ permissions: [
465
+ {
466
+ action: "plugin::content-manager.explorer.update",
467
+ subject: contentTypeUid
468
+ }
469
+ ],
470
+ children: canUpdateEntryForLocale && /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
471
+ v2.Link,
472
+ {
473
+ as: reactRouterDom.NavLink,
474
+ to: {
475
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
476
+ search: locale && `?plugins[i18n][locale]=${locale}`
477
+ },
478
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, width: 3, height: 3 }),
479
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
480
+ id: "content-releases.content-manager-edit-view.edit-entry",
481
+ defaultMessage: "Edit entry"
482
+ }) })
483
+ }
484
+ ) })
485
+ }
486
+ );
487
+ };
488
+ const EditReleaseItem = ({ releaseId }) => {
489
+ const { formatMessage } = reactIntl.useIntl();
490
+ return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
491
+ v2.Link,
492
+ {
493
+ as: reactRouterDom.NavLink,
494
+ to: `/plugins/content-releases/${releaseId}`,
495
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, width: 3, height: 3 }),
496
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
497
+ id: "content-releases.content-manager-edit-view.edit-release",
498
+ defaultMessage: "Edit release"
499
+ }) })
500
+ }
501
+ ) });
502
+ };
503
+ const Root = ({ children, hasTriggerBorder = false }) => {
504
+ const { formatMessage } = reactIntl.useIntl();
395
505
  return (
396
506
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
397
507
  /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
398
508
  /* @__PURE__ */ jsxRuntime.jsx(
399
509
  v2.Menu.Trigger,
400
510
  {
401
- as: designSystem.IconButton,
511
+ as: hasTriggerBorder ? StyledIconButton : designSystem.IconButton,
402
512
  paddingLeft: 2,
403
513
  paddingRight: 2,
404
514
  "aria-label": formatMessage({
@@ -408,16 +518,16 @@ const ReleaseActionMenu = ({ releaseId, actionId }) => {
408
518
  icon: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {})
409
519
  }
410
520
  ),
411
- /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { color: "danger600", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
412
- /* @__PURE__ */ jsxRuntime.jsx(StyledCross, {}),
413
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
414
- id: "content-releases.content-manager-edit-view.remove-from-release",
415
- defaultMessage: "Remove from release"
416
- }) })
417
- ] }) }) }) })
521
+ /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
418
522
  ] }) })
419
523
  );
420
524
  };
525
+ const ReleaseActionMenu = {
526
+ Root,
527
+ EditReleaseItem,
528
+ DeleteReleaseActionItem,
529
+ ReleaseActionEntryLinkItem
530
+ };
421
531
  const getBorderLeftRadiusValue = (actionType) => {
422
532
  return actionType === "publish" ? 1 : 0;
423
533
  };
@@ -438,19 +548,40 @@ const FieldWrapper = styled__default.default(designSystem.Field)`
438
548
  text-transform: capitalize;
439
549
  }
440
550
 
441
- &:active,
442
551
  &[data-checked='true'] {
443
- color: ${({ theme }) => theme.colors.primary700};
444
- background-color: ${({ theme }) => theme.colors.primary100};
445
- border-color: ${({ theme }) => theme.colors.primary700};
552
+ color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
553
+ background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
554
+ border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
446
555
  }
447
556
 
448
557
  &[data-checked='false'] {
449
558
  border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
450
559
  border-right: ${({ actionType }) => actionType === "publish" && "none"};
451
560
  }
561
+
562
+ &[data-checked='false'][data-disabled='false']:hover {
563
+ color: ${({ theme }) => theme.colors.neutral700};
564
+ background-color: ${({ theme }) => theme.colors.neutral100};
565
+ border-color: ${({ theme }) => theme.colors.neutral200};
566
+
567
+ & > label {
568
+ cursor: pointer;
569
+ }
570
+ }
571
+
572
+ &[data-disabled='true'] {
573
+ color: ${({ theme }) => theme.colors.neutral600};
574
+ background-color: ${({ theme }) => theme.colors.neutral150};
575
+ border-color: ${({ theme }) => theme.colors.neutral300};
576
+ }
452
577
  `;
453
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
578
+ const ActionOption = ({
579
+ selected,
580
+ actionType,
581
+ handleChange,
582
+ name,
583
+ disabled = false
584
+ }) => {
454
585
  return /* @__PURE__ */ jsxRuntime.jsx(
455
586
  FieldWrapper,
456
587
  {
@@ -461,6 +592,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
461
592
  position: "relative",
462
593
  cursor: "pointer",
463
594
  "data-checked": selected === actionType,
595
+ "data-disabled": disabled && selected !== actionType,
464
596
  children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
465
597
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { children: /* @__PURE__ */ jsxRuntime.jsx(
466
598
  designSystem.FieldInput,
@@ -470,7 +602,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
470
602
  name,
471
603
  checked: selected === actionType,
472
604
  onChange: handleChange,
473
- value: actionType
605
+ value: actionType,
606
+ disabled
474
607
  }
475
608
  ) }),
476
609
  actionType
@@ -478,7 +611,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
478
611
  }
479
612
  );
480
613
  };
481
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
614
+ const ReleaseActionOptions = ({
615
+ selected,
616
+ handleChange,
617
+ name,
618
+ disabled = false
619
+ }) => {
482
620
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
483
621
  /* @__PURE__ */ jsxRuntime.jsx(
484
622
  ActionOption,
@@ -486,7 +624,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
486
624
  actionType: "publish",
487
625
  selected,
488
626
  handleChange,
489
- name
627
+ name,
628
+ disabled
490
629
  }
491
630
  ),
492
631
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -495,7 +634,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
495
634
  actionType: "unpublish",
496
635
  selected,
497
636
  handleChange,
498
- name
637
+ name,
638
+ disabled
499
639
  }
500
640
  )
501
641
  ] });
@@ -511,12 +651,13 @@ const INITIAL_VALUES = {
511
651
  const NoReleases = () => {
512
652
  const { formatMessage } = reactIntl.useIntl();
513
653
  return /* @__PURE__ */ jsxRuntime.jsx(
514
- helperPlugin.NoContent,
654
+ designSystem.EmptyStateLayout,
515
655
  {
516
- content: {
656
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.EmptyDocuments, { width: "10rem" }),
657
+ content: formatMessage({
517
658
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
518
659
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
519
- },
660
+ }),
520
661
  action: /* @__PURE__ */ jsxRuntime.jsx(
521
662
  v2.LinkButton,
522
663
  {
@@ -539,9 +680,12 @@ const AddActionToReleaseModal = ({
539
680
  contentTypeUid,
540
681
  entryId
541
682
  }) => {
683
+ const releaseHeaderId = React__namespace.useId();
542
684
  const { formatMessage } = reactIntl.useIntl();
543
685
  const toggleNotification = helperPlugin.useNotification();
544
686
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
687
+ const [{ query: query2 }] = helperPlugin.useQueryParams();
688
+ const locale = query2.plugins?.i18n?.locale;
545
689
  const response = useGetReleasesForEntryQuery({
546
690
  contentTypeUid,
547
691
  entryId,
@@ -552,7 +696,8 @@ const AddActionToReleaseModal = ({
552
696
  const handleSubmit = async (values) => {
553
697
  const releaseActionEntry = {
554
698
  contentType: contentTypeUid,
555
- id: entryId
699
+ id: entryId,
700
+ locale
556
701
  };
557
702
  const response2 = await createReleaseAction({
558
703
  body: { type: values.type, entry: releaseActionEntry },
@@ -583,8 +728,8 @@ const AddActionToReleaseModal = ({
583
728
  }
584
729
  }
585
730
  };
586
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
587
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
731
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
732
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
588
733
  id: "content-releases.content-manager-edit-view.add-to-release",
589
734
  defaultMessage: "Add to release"
590
735
  }) }) }),
@@ -654,16 +799,15 @@ const AddActionToReleaseModal = ({
654
799
  };
655
800
  const CMReleasesContainer = () => {
656
801
  const [isModalOpen, setIsModalOpen] = React__namespace.useState(false);
657
- const { formatMessage } = reactIntl.useIntl();
658
- const {
659
- isCreatingEntry,
660
- allLayoutData: { contentType }
661
- } = helperPlugin.useCMEditViewDataManager();
662
- const params = reactRouterDom.useParams();
663
- const canFetch = params?.id != null && contentType?.uid != null;
802
+ const { formatMessage, formatDate, formatTime } = reactIntl.useIntl();
803
+ const { id, slug } = reactRouterDom.useParams();
804
+ const isCreatingEntry = id === "create";
805
+ const contentTypeUid = slug;
806
+ const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
807
+ const canFetch = id != null && contentTypeUid != null;
664
808
  const fetchParams = canFetch ? {
665
- contentTypeUid: contentType.uid,
666
- entryId: params.id,
809
+ contentTypeUid,
810
+ entryId: id,
667
811
  hasEntryAttached: true
668
812
  } : query.skipToken;
669
813
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -671,7 +815,7 @@ const CMReleasesContainer = () => {
671
815
  if (!canFetch) {
672
816
  return null;
673
817
  }
674
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
818
+ if (isCreatingEntry) {
675
819
  return null;
676
820
  }
677
821
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -738,9 +882,40 @@ const CMReleasesContainer = () => {
738
882
  )
739
883
  }
740
884
  ),
741
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
885
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
742
886
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
743
- /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu, { releaseId: release.id, actionId: release.action.id })
887
+ IsSchedulingEnabled && release.scheduledAt && release.timezone && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
888
+ {
889
+ id: "content-releases.content-manager-edit-view.scheduled.date",
890
+ defaultMessage: "{date} at {time} ({offset})"
891
+ },
892
+ {
893
+ date: formatDate(new Date(release.scheduledAt), {
894
+ day: "2-digit",
895
+ month: "2-digit",
896
+ year: "numeric",
897
+ timeZone: release.timezone
898
+ }),
899
+ time: formatTime(new Date(release.scheduledAt), {
900
+ hourCycle: "h23",
901
+ timeZone: release.timezone
902
+ }),
903
+ offset: getTimezoneOffset(
904
+ release.timezone,
905
+ new Date(release.scheduledAt)
906
+ )
907
+ }
908
+ ) }),
909
+ /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
910
+ /* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
911
+ /* @__PURE__ */ jsxRuntime.jsx(
912
+ ReleaseActionMenu.DeleteReleaseActionItem,
913
+ {
914
+ releaseId: release.id,
915
+ actionId: release.action.id
916
+ }
917
+ )
918
+ ] }) })
744
919
  ] })
745
920
  ]
746
921
  },
@@ -768,8 +943,8 @@ const CMReleasesContainer = () => {
768
943
  AddActionToReleaseModal,
769
944
  {
770
945
  handleClose: toggleModal,
771
- contentTypeUid: contentType.uid,
772
- entryId: params.id
946
+ contentTypeUid,
947
+ entryId: id
773
948
  }
774
949
  )
775
950
  ]
@@ -779,18 +954,15 @@ const CMReleasesContainer = () => {
779
954
  const admin = {
780
955
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
781
956
  register(app) {
782
- if (window.strapi.features.isEnabled("cms-content-releases") && window.strapi.future.isEnabled("contentReleases")) {
957
+ if (window.strapi.features.isEnabled("cms-content-releases")) {
783
958
  app.addMenuLink({
784
- to: `/plugins/${pluginId}`,
959
+ to: `plugins/${pluginId}`,
785
960
  icon: icons.PaperPlane,
786
961
  intlLabel: {
787
962
  id: `${pluginId}.plugin.name`,
788
963
  defaultMessage: "Releases"
789
964
  },
790
- async Component() {
791
- const { App } = await Promise.resolve().then(() => require("./App-f2cafd81.js"));
792
- return App;
793
- },
965
+ Component: () => Promise.resolve().then(() => require("./App-C768ulk4.js")).then((mod) => ({ default: mod.App })),
794
966
  permissions: PERMISSIONS.main
795
967
  });
796
968
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -801,12 +973,26 @@ const admin = {
801
973
  name: `${pluginId}-link`,
802
974
  Component: CMReleasesContainer
803
975
  });
976
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
977
+ app.addMenuLink({
978
+ to: `/plugins/purchase-content-releases`,
979
+ icon: icons.PaperPlane,
980
+ intlLabel: {
981
+ id: `${pluginId}.plugin.name`,
982
+ defaultMessage: "Releases"
983
+ },
984
+ async Component() {
985
+ const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-YhAPgpG9.js"));
986
+ return PurchaseContentReleases;
987
+ },
988
+ lockIcon: true
989
+ });
804
990
  }
805
991
  },
806
992
  async registerTrads({ locales }) {
807
993
  const importedTrads = await Promise.all(
808
994
  locales.map((locale) => {
809
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-13576ce2.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
995
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-gcJJ5htG.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
810
996
  return {
811
997
  data: helperPlugin.prefixPluginTranslations(data, "content-releases"),
812
998
  locale
@@ -823,16 +1009,20 @@ const admin = {
823
1009
  }
824
1010
  };
825
1011
  exports.PERMISSIONS = PERMISSIONS;
1012
+ exports.ReleaseActionMenu = ReleaseActionMenu;
826
1013
  exports.ReleaseActionOptions = ReleaseActionOptions;
827
1014
  exports.admin = admin;
1015
+ exports.getTimezoneOffset = getTimezoneOffset;
828
1016
  exports.isAxiosError = isAxiosError;
829
1017
  exports.pluginId = pluginId;
1018
+ exports.releaseApi = releaseApi;
830
1019
  exports.useCreateReleaseMutation = useCreateReleaseMutation;
831
1020
  exports.useDeleteReleaseMutation = useDeleteReleaseMutation;
832
1021
  exports.useGetReleaseActionsQuery = useGetReleaseActionsQuery;
833
1022
  exports.useGetReleaseQuery = useGetReleaseQuery;
834
1023
  exports.useGetReleasesQuery = useGetReleasesQuery;
835
1024
  exports.usePublishReleaseMutation = usePublishReleaseMutation;
1025
+ exports.useTypedDispatch = useTypedDispatch;
836
1026
  exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
837
1027
  exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
838
- //# sourceMappingURL=index-66d129ac.js.map
1028
+ //# sourceMappingURL=index-BLSMpbpZ.js.map