@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
@@ -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) {
@@ -206,22 +207,16 @@ const releaseApi = createApi({
206
207
  providesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
207
208
  }),
208
209
  getReleaseActions: build.query({
209
- query({ releaseId, page, pageSize }) {
210
+ query({ releaseId, ...params }) {
210
211
  return {
211
212
  url: `/content-releases/${releaseId}/actions`,
212
213
  method: "GET",
213
214
  config: {
214
- params: {
215
- page,
216
- pageSize
217
- }
215
+ params
218
216
  }
219
217
  };
220
218
  },
221
- providesTags: (result, error, arg) => result ? [
222
- ...result.data.map(({ id }) => ({ type: "ReleaseAction", id })),
223
- { type: "ReleaseAction", id: "LIST" }
224
- ] : [{ type: "ReleaseAction", id: "LIST" }]
219
+ providesTags: [{ type: "ReleaseAction", id: "LIST" }]
225
220
  }),
226
221
  createRelease: build.mutation({
227
222
  query(data) {
@@ -264,9 +259,27 @@ const releaseApi = createApi({
264
259
  data: body
265
260
  };
266
261
  },
267
- invalidatesTags: (result, error, arg) => [
268
- { type: "ReleaseAction", id: arg.params.actionId }
269
- ]
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
+ }
270
283
  }),
271
284
  deleteReleaseAction: build.mutation({
272
285
  query({ params }) {
@@ -314,29 +327,59 @@ const {
314
327
  useDeleteReleaseActionMutation,
315
328
  useDeleteReleaseMutation
316
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;
317
348
  const StyledMenuItem = styled(Menu.Item)`
318
349
  &:hover {
319
- background: transparent;
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
+ }
320
361
  }
321
362
 
322
363
  svg {
323
364
  path {
324
- fill: ${({ theme }) => theme.colors.danger600};
365
+ fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
325
366
  }
326
367
  }
327
368
 
328
- &:hover {
329
- svg {
330
- path {
331
- fill: ${({ theme }) => theme.colors.danger600};
332
- }
333
- }
369
+ a {
370
+ color: ${({ theme }) => theme.colors.neutral800};
371
+ }
372
+
373
+ span,
374
+ a {
375
+ width: 100%;
334
376
  }
335
377
  `;
336
- const StyledCross = styled(Cross)`
337
- padding: ${({ theme }) => theme.spaces[1]};
378
+ const StyledIconButton = styled(IconButton)`
379
+ /* Setting this style inline with borderColor will not apply the style */
380
+ border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
338
381
  `;
339
- const ReleaseActionMenu = ({ releaseId, actionId }) => {
382
+ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
340
383
  const { formatMessage } = useIntl();
341
384
  const toggleNotification = useNotification();
342
385
  const { formatAPIError } = useAPIErrorHandler();
@@ -369,13 +412,80 @@ const ReleaseActionMenu = ({ releaseId, actionId }) => {
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: [
375
485
  /* @__PURE__ */ jsx(
376
486
  Menu.Trigger,
377
487
  {
378
- as: IconButton,
488
+ as: hasTriggerBorder ? StyledIconButton : IconButton,
379
489
  paddingLeft: 2,
380
490
  paddingRight: 2,
381
491
  "aria-label": formatMessage({
@@ -385,16 +495,16 @@ const ReleaseActionMenu = ({ releaseId, actionId }) => {
385
495
  icon: /* @__PURE__ */ jsx(More, {})
386
496
  }
387
497
  ),
388
- /* @__PURE__ */ jsx(Menu.Content, { top: 1, children: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { color: "danger600", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
389
- /* @__PURE__ */ jsx(StyledCross, {}),
390
- /* @__PURE__ */ jsx(Typography, { 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,9 +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();
664
+ const [{ query }] = useQueryParams();
665
+ const locale = query.plugins?.i18n?.locale;
522
666
  const response = useGetReleasesForEntryQuery({
523
667
  contentTypeUid,
524
668
  entryId,
@@ -529,7 +673,8 @@ const AddActionToReleaseModal = ({
529
673
  const handleSubmit = async (values) => {
530
674
  const releaseActionEntry = {
531
675
  contentType: contentTypeUid,
532
- id: entryId
676
+ id: entryId,
677
+ locale
533
678
  };
534
679
  const response2 = await createReleaseAction({
535
680
  body: { type: values.type, entry: releaseActionEntry },
@@ -560,8 +705,8 @@ const AddActionToReleaseModal = ({
560
705
  }
561
706
  }
562
707
  };
563
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
564
- /* @__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({
565
710
  id: "content-releases.content-manager-edit-view.add-to-release",
566
711
  defaultMessage: "Add to release"
567
712
  }) }) }),
@@ -631,16 +776,15 @@ const AddActionToReleaseModal = ({
631
776
  };
632
777
  const CMReleasesContainer = () => {
633
778
  const [isModalOpen, setIsModalOpen] = React.useState(false);
634
- const { formatMessage } = useIntl();
635
- const {
636
- isCreatingEntry,
637
- allLayoutData: { contentType }
638
- } = useCMEditViewDataManager();
639
- const params = useParams();
640
- 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;
641
785
  const fetchParams = canFetch ? {
642
- contentTypeUid: contentType.uid,
643
- entryId: params.id,
786
+ contentTypeUid,
787
+ entryId: id,
644
788
  hasEntryAttached: true
645
789
  } : skipToken;
646
790
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -648,7 +792,7 @@ const CMReleasesContainer = () => {
648
792
  if (!canFetch) {
649
793
  return null;
650
794
  }
651
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
795
+ if (isCreatingEntry) {
652
796
  return null;
653
797
  }
654
798
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -715,9 +859,40 @@ const CMReleasesContainer = () => {
715
859
  )
716
860
  }
717
861
  ),
718
- /* @__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: [
719
863
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
720
- /* @__PURE__ */ jsx(ReleaseActionMenu, { releaseId: release.id, actionId: release.action.id })
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
+ },
869
+ {
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
+ )
884
+ }
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
+ ] }) })
721
896
  ] })
722
897
  ]
723
898
  },
@@ -745,8 +920,8 @@ const CMReleasesContainer = () => {
745
920
  AddActionToReleaseModal,
746
921
  {
747
922
  handleClose: toggleModal,
748
- contentTypeUid: contentType.uid,
749
- entryId: params.id
923
+ contentTypeUid,
924
+ entryId: id
750
925
  }
751
926
  )
752
927
  ]
@@ -756,18 +931,15 @@ const CMReleasesContainer = () => {
756
931
  const admin = {
757
932
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
758
933
  register(app) {
759
- if (window.strapi.features.isEnabled("cms-content-releases") && window.strapi.future.isEnabled("contentReleases")) {
934
+ if (window.strapi.features.isEnabled("cms-content-releases")) {
760
935
  app.addMenuLink({
761
- to: `/plugins/${pluginId}`,
936
+ to: `plugins/${pluginId}`,
762
937
  icon: PaperPlane,
763
938
  intlLabel: {
764
939
  id: `${pluginId}.plugin.name`,
765
940
  defaultMessage: "Releases"
766
941
  },
767
- async Component() {
768
- const { App } = await import("./App-a4843fda.mjs");
769
- return App;
770
- },
942
+ Component: () => import("./App-0Er6xxcq.mjs").then((mod) => ({ default: mod.App })),
771
943
  permissions: PERMISSIONS.main
772
944
  });
773
945
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -778,12 +950,26 @@ const admin = {
778
950
  name: `${pluginId}-link`,
779
951
  Component: CMReleasesContainer
780
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
+ });
781
967
  }
782
968
  },
783
969
  async registerTrads({ locales }) {
784
970
  const importedTrads = await Promise.all(
785
971
  locales.map((locale) => {
786
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-e98d8b57.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 }) => {
787
973
  return {
788
974
  data: prefixPluginTranslations(data, "content-releases"),
789
975
  locale
@@ -802,16 +988,20 @@ const admin = {
802
988
  export {
803
989
  PERMISSIONS as P,
804
990
  ReleaseActionOptions as R,
805
- useUpdateReleaseMutation as a,
806
- useDeleteReleaseMutation as b,
807
- usePublishReleaseMutation as c,
808
- useGetReleaseActionsQuery as d,
809
- useUpdateReleaseActionMutation as e,
810
- useGetReleasesQuery as f,
811
- useCreateReleaseMutation as g,
812
- admin 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,
813
999
  isAxiosError as i,
1000
+ useUpdateReleaseActionMutation as j,
1001
+ ReleaseActionMenu as k,
1002
+ admin as l,
814
1003
  pluginId as p,
815
- useGetReleaseQuery as u
1004
+ releaseApi as r,
1005
+ useGetReleasesQuery as u
816
1006
  };
817
- //# sourceMappingURL=index-937f8179.mjs.map
1007
+ //# sourceMappingURL=index-fJx1up7m.mjs.map