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

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 → App-OP70yd5M.js} +210 -224
  2. package/dist/_chunks/App-OP70yd5M.js.map +1 -0
  3. package/dist/_chunks/{App-X01LBg5V.mjs → App-x6Tjj3HN.mjs} +202 -216
  4. package/dist/_chunks/App-x6Tjj3HN.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +2 -2
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-bpIYXOfu.js} +2 -2
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-faJDuv3q.js → en-3SGjiVyR.js} +10 -2
  10. package/dist/_chunks/en-3SGjiVyR.js.map +1 -0
  11. package/dist/_chunks/{en-RdapH-9X.mjs → en-bpHsnU0n.mjs} +10 -2
  12. package/dist/_chunks/en-bpHsnU0n.mjs.map +1 -0
  13. package/dist/_chunks/{index-OD9AlD-6.mjs → index-1ejXLtzt.mjs} +273 -103
  14. package/dist/_chunks/index-1ejXLtzt.mjs.map +1 -0
  15. package/dist/_chunks/{index-cYWov2wa.js → index-ydocdaZ0.js} +270 -100
  16. package/dist/_chunks/index-ydocdaZ0.js.map +1 -0
  17. package/dist/admin/index.js +15 -1
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +16 -2
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/server/index.js +62 -60
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +62 -61
  24. package/dist/server/index.mjs.map +1 -1
  25. package/package.json +28 -21
  26. package/dist/_chunks/App-1LckaIGY.js.map +0 -1
  27. package/dist/_chunks/App-X01LBg5V.mjs.map +0 -1
  28. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  29. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  30. package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
  31. package/dist/_chunks/en-faJDuv3q.js.map +0 -1
  32. package/dist/_chunks/index-OD9AlD-6.mjs.map +0 -1
  33. package/dist/_chunks/index-cYWov2wa.js.map +0 -1
  34. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  35. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  36. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  37. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  38. package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
  39. package/dist/admin/src/constants.d.ts +0 -58
  40. package/dist/admin/src/index.d.ts +0 -3
  41. package/dist/admin/src/pages/App.d.ts +0 -1
  42. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  43. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  44. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  45. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  46. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  47. package/dist/admin/src/pluginId.d.ts +0 -1
  48. package/dist/admin/src/services/axios.d.ts +0 -29
  49. package/dist/admin/src/services/release.d.ts +0 -369
  50. package/dist/admin/src/store/hooks.d.ts +0 -7
  51. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
  52. package/dist/admin/src/utils/time.d.ts +0 -1
  53. package/dist/server/src/bootstrap.d.ts +0 -5
  54. package/dist/server/src/bootstrap.d.ts.map +0 -1
  55. package/dist/server/src/constants.d.ts +0 -12
  56. package/dist/server/src/constants.d.ts.map +0 -1
  57. package/dist/server/src/content-types/index.d.ts +0 -99
  58. package/dist/server/src/content-types/index.d.ts.map +0 -1
  59. package/dist/server/src/content-types/release/index.d.ts +0 -48
  60. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  61. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  62. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  63. package/dist/server/src/content-types/release-action/index.d.ts +0 -50
  64. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  65. package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
  66. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  67. package/dist/server/src/controllers/index.d.ts +0 -19
  68. package/dist/server/src/controllers/index.d.ts.map +0 -1
  69. package/dist/server/src/controllers/release-action.d.ts +0 -10
  70. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  71. package/dist/server/src/controllers/release.d.ts +0 -11
  72. package/dist/server/src/controllers/release.d.ts.map +0 -1
  73. package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
  74. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  75. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  76. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  77. package/dist/server/src/destroy.d.ts +0 -5
  78. package/dist/server/src/destroy.d.ts.map +0 -1
  79. package/dist/server/src/index.d.ts +0 -2095
  80. package/dist/server/src/index.d.ts.map +0 -1
  81. package/dist/server/src/migrations/index.d.ts +0 -13
  82. package/dist/server/src/migrations/index.d.ts.map +0 -1
  83. package/dist/server/src/register.d.ts +0 -5
  84. package/dist/server/src/register.d.ts.map +0 -1
  85. package/dist/server/src/routes/index.d.ts +0 -35
  86. package/dist/server/src/routes/index.d.ts.map +0 -1
  87. package/dist/server/src/routes/release-action.d.ts +0 -18
  88. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  89. package/dist/server/src/routes/release.d.ts +0 -18
  90. package/dist/server/src/routes/release.d.ts.map +0 -1
  91. package/dist/server/src/services/index.d.ts +0 -1826
  92. package/dist/server/src/services/index.d.ts.map +0 -1
  93. package/dist/server/src/services/release.d.ts +0 -66
  94. package/dist/server/src/services/release.d.ts.map +0 -1
  95. package/dist/server/src/services/scheduling.d.ts +0 -18
  96. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  97. package/dist/server/src/services/validation.d.ts +0 -18
  98. package/dist/server/src/services/validation.d.ts.map +0 -1
  99. package/dist/server/src/utils/index.d.ts +0 -14
  100. package/dist/server/src/utils/index.d.ts.map +0 -1
  101. package/dist/shared/contracts/release-actions.d.ts +0 -131
  102. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  103. package/dist/shared/contracts/releases.d.ts +0 -166
  104. package/dist/shared/contracts/releases.d.ts.map +0 -1
  105. package/dist/shared/types.d.ts +0 -24
  106. package/dist/shared/types.d.ts.map +0 -1
  107. package/dist/shared/validation-schemas.d.ts +0 -2
  108. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -1,49 +1,23 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, useQueryParams, useLicenseLimits, useTracking, useRBAC, Page, Pagination, ConfirmDialog, BackButton, Table, unstable_useDocument } from "@strapi/admin/strapi-admin";
3
- import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
4
- import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, j as ReleaseActionMenu, r as releaseApi } from "./index-OD9AlD-6.mjs";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { RelativeTime as RelativeTime$1, useNotification, useAPIErrorHandler, useQueryParams, useTracking, LoadingIndicatorPage, CheckPermissions, PageSizeURLQuery, PaginationURLQuery, AnErrorOccurred, ConfirmDialog, useRBAC, NoContent, Table, CheckPagePermissions } from "@strapi/helper-plugin";
3
+ import { useLocation, useHistory, useParams, Redirect, Link as Link$2, Switch, Route } from "react-router-dom";
4
+ import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-1ejXLtzt.mjs";
5
5
  import * as React from "react";
6
- import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Alert, Main, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
6
+ import { useLicenseLimits, unstable_useDocument } from "@strapi/admin/strapi-admin";
7
+ import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Alert, Main, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Link as Link$1, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
7
8
  import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
8
- import { Plus, EmptyDocuments, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
9
+ import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle } from "@strapi/icons";
9
10
  import format from "date-fns/format";
10
11
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
11
12
  import { useIntl } from "react-intl";
12
13
  import styled from "styled-components";
13
- import { intervalToDuration, isPast, formatISO, parse } from "date-fns";
14
+ import { formatISO } from "date-fns";
14
15
  import { Formik, Form, useFormikContext } from "formik";
15
16
  import * as yup from "yup";
16
- import { useDispatch } from "react-redux";
17
- const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
18
- const RelativeTime = React.forwardRef(
19
- ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
20
- const { formatRelativeTime, formatDate, formatTime } = useIntl();
21
- const interval = intervalToDuration({
22
- start: timestamp,
23
- end: Date.now()
24
- // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
25
- });
26
- const unit = intervals.find((intervalUnit) => {
27
- return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
28
- });
29
- const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
30
- const customInterval = customIntervals.find(
31
- (custom) => interval[custom.unit] < custom.threshold
32
- );
33
- const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
34
- return /* @__PURE__ */ jsx(
35
- "time",
36
- {
37
- ref: forwardedRef,
38
- dateTime: timestamp.toISOString(),
39
- role: "time",
40
- title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
41
- ...restProps,
42
- children: displayText
43
- }
44
- );
45
- }
46
- );
17
+ import "@reduxjs/toolkit/query";
18
+ import "axios";
19
+ import "@reduxjs/toolkit/query/react";
20
+ import "react-redux";
47
21
  const RELEASE_SCHEMA = yup.object().shape({
48
22
  name: yup.string().trim().required(),
49
23
  scheduledAt: yup.string().nullable(),
@@ -80,9 +54,8 @@ const ReleaseModal = ({
80
54
  const { date, time, timezone } = values;
81
55
  if (!date || !time || !timezone)
82
56
  return null;
83
- const formattedDate = parse(time, "HH:mm", new Date(date));
84
57
  const timezoneWithoutOffset = timezone.split("&")[1];
85
- return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
58
+ return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
86
59
  };
87
60
  const getTimezoneWithOffset = () => {
88
61
  const currentTimezone = timezoneList.find(
@@ -282,12 +255,14 @@ const TimezoneComponent = ({ timezoneOptions }) => {
282
255
  }
283
256
  );
284
257
  };
285
- const useTypedDispatch = useDispatch;
286
258
  const LinkCard = styled(Link)`
287
259
  display: block;
288
260
  `;
289
- const CapitalizeRelativeTime = styled(RelativeTime)`
290
- text-transform: capitalize;
261
+ const RelativeTime = styled(RelativeTime$1)`
262
+ display: inline-block;
263
+ &::first-letter {
264
+ text-transform: uppercase;
265
+ }
291
266
  `;
292
267
  const getBadgeProps = (status) => {
293
268
  let color;
@@ -317,7 +292,7 @@ const getBadgeProps = (status) => {
317
292
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
318
293
  const { formatMessage } = useIntl();
319
294
  if (isError) {
320
- return /* @__PURE__ */ jsx(Page.Error, {});
295
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
321
296
  }
322
297
  if (releases?.length === 0) {
323
298
  return /* @__PURE__ */ jsx(
@@ -352,7 +327,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
352
327
  children: [
353
328
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
354
329
  /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
355
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
330
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
356
331
  id: "content-releases.pages.Releases.not-scheduled",
357
332
  defaultMessage: "Not scheduled"
358
333
  }) })
@@ -382,9 +357,9 @@ const ReleasesPage = () => {
382
357
  const tabRef = React.useRef(null);
383
358
  const location = useLocation();
384
359
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
385
- const { toggleNotification } = useNotification();
360
+ const toggleNotification = useNotification();
386
361
  const { formatMessage } = useIntl();
387
- const navigate = useNavigate();
362
+ const { push, replace } = useHistory();
388
363
  const { formatAPIError } = useAPIErrorHandler();
389
364
  const [{ query }, setQuery] = useQueryParams();
390
365
  const response = useGetReleasesQuery(query);
@@ -392,16 +367,13 @@ const ReleasesPage = () => {
392
367
  const { getFeature } = useLicenseLimits();
393
368
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
394
369
  const { trackUsage } = useTracking();
395
- const {
396
- allowedActions: { canCreate }
397
- } = useRBAC(PERMISSIONS);
398
370
  const { isLoading, isSuccess, isError } = response;
399
371
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
400
372
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
401
373
  React.useEffect(() => {
402
374
  if (location?.state?.errors) {
403
375
  toggleNotification({
404
- type: "danger",
376
+ type: "warning",
405
377
  title: formatMessage({
406
378
  id: "content-releases.pages.Releases.notification.error.title",
407
379
  defaultMessage: "Your request could not be processed."
@@ -411,9 +383,9 @@ const ReleasesPage = () => {
411
383
  defaultMessage: "Please try again or open another release."
412
384
  })
413
385
  });
414
- navigate("", { replace: true, state: null });
386
+ replace({ state: null });
415
387
  }
416
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
388
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
417
389
  React.useEffect(() => {
418
390
  if (tabRef.current) {
419
391
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -423,7 +395,7 @@ const ReleasesPage = () => {
423
395
  setReleaseModalShown((prev) => !prev);
424
396
  };
425
397
  if (isLoading) {
426
- return /* @__PURE__ */ jsx(Page.Loading, {});
398
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
427
399
  }
428
400
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
429
401
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -454,15 +426,15 @@ const ReleasesPage = () => {
454
426
  })
455
427
  });
456
428
  trackUsage("didCreateRelease");
457
- navigate(response2.data.data.id.toString());
429
+ push(`/plugins/content-releases/${response2.data.data.id}`);
458
430
  } else if (isAxiosError(response2.error)) {
459
431
  toggleNotification({
460
- type: "danger",
432
+ type: "warning",
461
433
  message: formatAPIError(response2.error)
462
434
  });
463
435
  } else {
464
436
  toggleNotification({
465
- type: "danger",
437
+ type: "warning",
466
438
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
467
439
  });
468
440
  }
@@ -479,7 +451,7 @@ const ReleasesPage = () => {
479
451
  id: "content-releases.pages.Releases.header-subtitle",
480
452
  defaultMessage: "Create and manage content updates"
481
453
  }),
482
- primaryAction: canCreate ? /* @__PURE__ */ jsx(
454
+ primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
483
455
  Button,
484
456
  {
485
457
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -490,7 +462,7 @@ const ReleasesPage = () => {
490
462
  defaultMessage: "New release"
491
463
  })
492
464
  }
493
- ) : null
465
+ ) })
494
466
  }
495
467
  ),
496
468
  /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -569,17 +541,23 @@ const ReleasesPage = () => {
569
541
  ]
570
542
  }
571
543
  ),
572
- /* @__PURE__ */ jsxs(
573
- Pagination.Root,
574
- {
575
- ...response?.currentData?.meta?.pagination,
576
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
577
- children: [
578
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
579
- /* @__PURE__ */ jsx(Pagination.Links, {})
580
- ]
581
- }
582
- )
544
+ response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
545
+ /* @__PURE__ */ jsx(
546
+ PageSizeURLQuery,
547
+ {
548
+ options: ["8", "16", "32", "64"],
549
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
550
+ }
551
+ ),
552
+ /* @__PURE__ */ jsx(
553
+ PaginationURLQuery,
554
+ {
555
+ pagination: {
556
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
557
+ }
558
+ }
559
+ )
560
+ ] }) : null
583
561
  ] }) }),
584
562
  releaseModalShown && /* @__PURE__ */ jsx(
585
563
  ReleaseModal,
@@ -627,18 +605,14 @@ const TrashIcon = styled(Trash)`
627
605
  const TypographyMaxWidth = styled(Typography)`
628
606
  max-width: 300px;
629
607
  `;
630
- const EntryValidationText = ({ action, schema, entry }) => {
608
+ const EntryValidationText = ({ action, schema, components, entry }) => {
631
609
  const { formatMessage } = useIntl();
632
- const { validate } = unstable_useDocument(
633
- {
634
- collectionType: schema?.kind ?? "",
635
- model: schema?.uid ?? ""
636
- },
637
- {
638
- skip: !schema
639
- }
640
- );
641
- const errors = validate(entry) ?? {};
610
+ const { validate } = unstable_useDocument();
611
+ const { errors } = validate(entry, {
612
+ contentType: schema,
613
+ components,
614
+ isCreatingEntry: false
615
+ });
642
616
  if (Object.keys(errors).length > 0) {
643
617
  const validationErrorsMessages = Object.entries(errors).map(
644
618
  ([key, value]) => formatMessage(
@@ -686,22 +660,18 @@ const ReleaseDetailsLayout = ({
686
660
  isLoading: isLoadingDetails,
687
661
  isError,
688
662
  error
689
- } = useGetReleaseQuery(
690
- { id: releaseId },
691
- {
692
- skip: !releaseId
693
- }
694
- );
663
+ } = useGetReleaseQuery({ id: releaseId });
695
664
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
696
- const { toggleNotification } = useNotification();
665
+ const toggleNotification = useNotification();
697
666
  const { formatAPIError } = useAPIErrorHandler();
698
- const { allowedActions } = useRBAC(PERMISSIONS);
699
- const { canUpdate, canDelete, canPublish } = allowedActions;
667
+ const {
668
+ allowedActions: { canUpdate, canDelete }
669
+ } = useRBAC(PERMISSIONS);
700
670
  const dispatch = useTypedDispatch();
701
671
  const { trackUsage } = useTracking();
702
672
  const release = data?.data;
703
- const handlePublishRelease = (id) => async () => {
704
- const response = await publishRelease({ id });
673
+ const handlePublishRelease = async () => {
674
+ const response = await publishRelease({ id: releaseId });
705
675
  if ("data" in response) {
706
676
  toggleNotification({
707
677
  type: "success",
@@ -718,12 +688,12 @@ const ReleaseDetailsLayout = ({
718
688
  });
719
689
  } else if (isAxiosError(response.error)) {
720
690
  toggleNotification({
721
- type: "danger",
691
+ type: "warning",
722
692
  message: formatAPIError(response.error)
723
693
  });
724
694
  } else {
725
695
  toggleNotification({
726
- type: "danger",
696
+ type: "warning",
727
697
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
728
698
  });
729
699
  }
@@ -749,19 +719,21 @@ const ReleaseDetailsLayout = ({
749
719
  return release.createdBy.email;
750
720
  };
751
721
  if (isLoadingDetails) {
752
- return /* @__PURE__ */ jsx(Page.Loading, {});
722
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
753
723
  }
754
724
  if (isError || !release) {
755
725
  return /* @__PURE__ */ jsx(
756
- Navigate,
726
+ Redirect,
757
727
  {
758
- to: "..",
759
- state: {
760
- errors: [
761
- {
762
- code: error?.code
763
- }
764
- ]
728
+ to: {
729
+ pathname: "/plugins/content-releases",
730
+ state: {
731
+ errors: [
732
+ {
733
+ code: error?.code
734
+ }
735
+ ]
736
+ }
765
737
  }
766
738
  }
767
739
  );
@@ -805,7 +777,10 @@ const ReleaseDetailsLayout = ({
805
777
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
806
778
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
807
779
  ] }),
808
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
780
+ navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
781
+ id: "global.back",
782
+ defaultMessage: "Back"
783
+ }) }),
809
784
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
810
785
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
811
786
  /* @__PURE__ */ jsx(
@@ -871,7 +846,7 @@ const ReleaseDetailsLayout = ({
871
846
  defaultMessage: "Created"
872
847
  }) }),
873
848
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
874
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
849
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
875
850
  formatMessage(
876
851
  {
877
852
  id: "content-releases.header.actions.created.description",
@@ -889,12 +864,12 @@ const ReleaseDetailsLayout = ({
889
864
  id: "content-releases.header.actions.refresh",
890
865
  defaultMessage: "Refresh"
891
866
  }) }),
892
- canPublish ? /* @__PURE__ */ jsx(
867
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
893
868
  Button,
894
869
  {
895
870
  size: "S",
896
871
  variant: "default",
897
- onClick: handlePublishRelease(release.id.toString()),
872
+ onClick: handlePublishRelease,
898
873
  loading: isPublishing,
899
874
  disabled: release.actions.meta.count === 0,
900
875
  children: formatMessage({
@@ -902,7 +877,7 @@ const ReleaseDetailsLayout = ({
902
877
  defaultMessage: "Publish"
903
878
  })
904
879
  }
905
- ) : null
880
+ ) })
906
881
  ] })
907
882
  }
908
883
  ),
@@ -928,10 +903,11 @@ const getGroupByOptionLabel = (value) => {
928
903
  defaultMessage: "Content-Types"
929
904
  };
930
905
  };
931
- const ReleaseDetailsBody = ({ releaseId }) => {
906
+ const ReleaseDetailsBody = () => {
932
907
  const { formatMessage } = useIntl();
908
+ const { releaseId } = useParams();
933
909
  const [{ query }, setQuery] = useQueryParams();
934
- const { toggleNotification } = useNotification();
910
+ const toggleNotification = useNotification();
935
911
  const { formatAPIError } = useAPIErrorHandler();
936
912
  const {
937
913
  data: releaseData,
@@ -972,19 +948,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
972
948
  if ("error" in response) {
973
949
  if (isAxiosError(response.error)) {
974
950
  toggleNotification({
975
- type: "danger",
951
+ type: "warning",
976
952
  message: formatAPIError(response.error)
977
953
  });
978
954
  } else {
979
955
  toggleNotification({
980
- type: "danger",
956
+ type: "warning",
981
957
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
982
958
  });
983
959
  }
984
960
  }
985
961
  };
986
962
  if (isLoading || isReleaseLoading) {
987
- return /* @__PURE__ */ jsx(Page.Loading, {});
963
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
988
964
  }
989
965
  const releaseActions = data?.data;
990
966
  const releaseMeta = data?.meta;
@@ -1003,26 +979,32 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1003
979
  });
1004
980
  }
1005
981
  return /* @__PURE__ */ jsx(
1006
- Navigate,
982
+ Redirect,
1007
983
  {
1008
- to: "..",
1009
- state: {
1010
- errors: errorsArray
984
+ to: {
985
+ pathname: "/plugins/content-releases",
986
+ state: {
987
+ errors: errorsArray
988
+ }
1011
989
  }
1012
990
  }
1013
991
  );
1014
992
  }
1015
993
  if (isError || !releaseActions) {
1016
- return /* @__PURE__ */ jsx(Page.Error, {});
994
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1017
995
  }
1018
996
  if (Object.keys(releaseActions).length === 0) {
1019
997
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1020
- EmptyStateLayout,
998
+ NoContent,
1021
999
  {
1000
+ content: {
1001
+ id: "content-releases.pages.Details.tab.emptyEntries",
1002
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1003
+ },
1022
1004
  action: /* @__PURE__ */ jsx(
1023
1005
  LinkButton,
1024
1006
  {
1025
- as: Link$1,
1007
+ as: Link$2,
1026
1008
  to: {
1027
1009
  pathname: "/content-manager"
1028
1010
  },
@@ -1033,64 +1015,18 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1033
1015
  defaultMessage: "Open the Content Manager"
1034
1016
  })
1035
1017
  }
1036
- ),
1037
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
1038
- content: formatMessage({
1039
- id: "content-releases.pages.Details.tab.emptyEntries",
1040
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1041
- })
1018
+ )
1042
1019
  }
1043
1020
  ) });
1044
1021
  }
1045
- const groupByLabel = formatMessage({
1046
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1047
- defaultMessage: "Group by"
1048
- });
1049
- const headers = [
1050
- {
1051
- label: formatMessage({
1052
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1053
- defaultMessage: "name"
1054
- }),
1055
- name: "name"
1056
- },
1057
- {
1058
- label: formatMessage({
1059
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1060
- defaultMessage: "locale"
1061
- }),
1062
- name: "locale"
1063
- },
1064
- {
1065
- label: formatMessage({
1066
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1067
- defaultMessage: "content-type"
1068
- }),
1069
- name: "content-type"
1070
- },
1071
- {
1072
- label: formatMessage({
1073
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1074
- defaultMessage: "action"
1075
- }),
1076
- name: "action"
1077
- },
1078
- ...!release.releasedAt ? [
1079
- {
1080
- label: formatMessage({
1081
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1082
- defaultMessage: "status"
1083
- }),
1084
- name: "status"
1085
- }
1086
- ] : []
1087
- ];
1088
1022
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1089
1023
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1090
1024
  SingleSelect,
1091
1025
  {
1092
- placeholder: groupByLabel,
1093
- "aria-label": groupByLabel,
1026
+ "aria-label": formatMessage({
1027
+ id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1028
+ defaultMessage: "Group by"
1029
+ }),
1094
1030
  customizeContent: (value) => formatMessage(
1095
1031
  {
1096
1032
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1114,11 +1050,68 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1114
1050
  ...item,
1115
1051
  id: Number(item.entry.id)
1116
1052
  })),
1117
- headers,
1118
- isLoading: isLoading || isFetching,
1053
+ colCount: releaseActions[key].length,
1054
+ isLoading,
1055
+ isFetching,
1119
1056
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1120
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1121
- /* @__PURE__ */ jsx(Table.Loading, {}),
1057
+ /* @__PURE__ */ jsxs(Table.Head, { children: [
1058
+ /* @__PURE__ */ jsx(
1059
+ Table.HeaderCell,
1060
+ {
1061
+ fieldSchemaType: "string",
1062
+ label: formatMessage({
1063
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1064
+ defaultMessage: "name"
1065
+ }),
1066
+ name: "name"
1067
+ }
1068
+ ),
1069
+ /* @__PURE__ */ jsx(
1070
+ Table.HeaderCell,
1071
+ {
1072
+ fieldSchemaType: "string",
1073
+ label: formatMessage({
1074
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1075
+ defaultMessage: "locale"
1076
+ }),
1077
+ name: "locale"
1078
+ }
1079
+ ),
1080
+ /* @__PURE__ */ jsx(
1081
+ Table.HeaderCell,
1082
+ {
1083
+ fieldSchemaType: "string",
1084
+ label: formatMessage({
1085
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1086
+ defaultMessage: "content-type"
1087
+ }),
1088
+ name: "content-type"
1089
+ }
1090
+ ),
1091
+ /* @__PURE__ */ jsx(
1092
+ Table.HeaderCell,
1093
+ {
1094
+ fieldSchemaType: "string",
1095
+ label: formatMessage({
1096
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1097
+ defaultMessage: "action"
1098
+ }),
1099
+ name: "action"
1100
+ }
1101
+ ),
1102
+ !release.releasedAt && /* @__PURE__ */ jsx(
1103
+ Table.HeaderCell,
1104
+ {
1105
+ fieldSchemaType: "string",
1106
+ label: formatMessage({
1107
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1108
+ defaultMessage: "status"
1109
+ }),
1110
+ name: "status"
1111
+ }
1112
+ )
1113
+ ] }),
1114
+ /* @__PURE__ */ jsx(Table.LoadingBody, {}),
1122
1115
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1123
1116
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1124
1117
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1176,39 +1169,34 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1176
1169
  }
1177
1170
  )
1178
1171
  ] }, `releases-group-${key}`)),
1179
- /* @__PURE__ */ jsxs(
1180
- Pagination.Root,
1181
- {
1182
- ...releaseMeta?.pagination,
1183
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1184
- children: [
1185
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1186
- /* @__PURE__ */ jsx(Pagination.Links, {})
1187
- ]
1188
- }
1189
- )
1172
+ /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1173
+ /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1174
+ /* @__PURE__ */ jsx(
1175
+ PaginationURLQuery,
1176
+ {
1177
+ pagination: {
1178
+ pageCount: releaseMeta?.pagination?.pageCount || 0
1179
+ }
1180
+ }
1181
+ )
1182
+ ] })
1190
1183
  ] }) });
1191
1184
  };
1192
1185
  const ReleaseDetailsPage = () => {
1193
1186
  const { formatMessage } = useIntl();
1194
1187
  const { releaseId } = useParams();
1195
- const { toggleNotification } = useNotification();
1188
+ const toggleNotification = useNotification();
1196
1189
  const { formatAPIError } = useAPIErrorHandler();
1197
- const navigate = useNavigate();
1190
+ const { replace } = useHistory();
1198
1191
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1199
1192
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1200
1193
  const {
1201
1194
  isLoading: isLoadingDetails,
1202
1195
  data,
1203
1196
  isSuccess: isSuccessDetails
1204
- } = useGetReleaseQuery(
1205
- { id: releaseId },
1206
- {
1207
- skip: !releaseId
1208
- }
1209
- );
1197
+ } = useGetReleaseQuery({ id: releaseId });
1210
1198
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1211
- const [deleteRelease] = useDeleteReleaseMutation();
1199
+ const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1212
1200
  const toggleEditReleaseModal = () => {
1213
1201
  setReleaseModalShown((prev) => !prev);
1214
1202
  };
@@ -1219,18 +1207,15 @@ const ReleaseDetailsPage = () => {
1219
1207
  {
1220
1208
  toggleEditReleaseModal,
1221
1209
  toggleWarningSubmit,
1222
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1210
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1223
1211
  }
1224
1212
  );
1225
1213
  }
1226
- if (!releaseId) {
1227
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1228
- }
1229
1214
  const releaseData = isSuccessDetails && data?.data || null;
1230
1215
  const title = releaseData?.name || "";
1231
1216
  const timezone = releaseData?.timezone ?? null;
1232
1217
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1233
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
1218
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1234
1219
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1235
1220
  const handleEditRelease = async (values) => {
1236
1221
  const response = await updateRelease({
@@ -1247,33 +1232,33 @@ const ReleaseDetailsPage = () => {
1247
1232
  defaultMessage: "Release updated."
1248
1233
  })
1249
1234
  });
1235
+ toggleEditReleaseModal();
1250
1236
  } else if (isAxiosError(response.error)) {
1251
1237
  toggleNotification({
1252
- type: "danger",
1238
+ type: "warning",
1253
1239
  message: formatAPIError(response.error)
1254
1240
  });
1255
1241
  } else {
1256
1242
  toggleNotification({
1257
- type: "danger",
1243
+ type: "warning",
1258
1244
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1259
1245
  });
1260
1246
  }
1261
- toggleEditReleaseModal();
1262
1247
  };
1263
1248
  const handleDeleteRelease = async () => {
1264
1249
  const response = await deleteRelease({
1265
1250
  id: releaseId
1266
1251
  });
1267
1252
  if ("data" in response) {
1268
- navigate("..");
1253
+ replace("/plugins/content-releases");
1269
1254
  } else if (isAxiosError(response.error)) {
1270
1255
  toggleNotification({
1271
- type: "danger",
1256
+ type: "warning",
1272
1257
  message: formatAPIError(response.error)
1273
1258
  });
1274
1259
  } else {
1275
1260
  toggleNotification({
1276
- type: "danger",
1261
+ type: "warning",
1277
1262
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1278
1263
  });
1279
1264
  }
@@ -1284,7 +1269,7 @@ const ReleaseDetailsPage = () => {
1284
1269
  toggleEditReleaseModal,
1285
1270
  toggleWarningSubmit,
1286
1271
  children: [
1287
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1272
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1288
1273
  releaseModalShown && /* @__PURE__ */ jsx(
1289
1274
  ReleaseModal,
1290
1275
  {
@@ -1304,13 +1289,14 @@ const ReleaseDetailsPage = () => {
1304
1289
  /* @__PURE__ */ jsx(
1305
1290
  ConfirmDialog,
1306
1291
  {
1307
- isOpen: showWarningSubmit,
1308
- onClose: toggleWarningSubmit,
1309
- onConfirm: handleDeleteRelease,
1310
- children: formatMessage({
1292
+ bodyText: {
1311
1293
  id: "content-releases.dialog.confirmation-message",
1312
1294
  defaultMessage: "Are you sure you want to delete this release?"
1313
- })
1295
+ },
1296
+ isOpen: showWarningSubmit,
1297
+ isConfirmButtonLoading: isDeletingRelease,
1298
+ onToggleDialog: toggleWarningSubmit,
1299
+ onConfirm: handleDeleteRelease
1314
1300
  }
1315
1301
  )
1316
1302
  ]
@@ -1318,12 +1304,12 @@ const ReleaseDetailsPage = () => {
1318
1304
  );
1319
1305
  };
1320
1306
  const App = () => {
1321
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1322
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1323
- /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1307
+ return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1308
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1309
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1324
1310
  ] }) });
1325
1311
  };
1326
1312
  export {
1327
1313
  App
1328
1314
  };
1329
- //# sourceMappingURL=App-X01LBg5V.mjs.map
1315
+ //# sourceMappingURL=App-x6Tjj3HN.mjs.map