@strapi/content-releases 0.0.0-experimental.cb311d9fcfbd8e441f790aea232f0a39bdd90e16 → 0.0.0-experimental.cf512c83e81bd5a0243ea6d6fe5f9c71796765f0

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 (138) hide show
  1. package/dist/_chunks/{App-DdxsZcmK.js → App-dLXY5ei3.js} +575 -594
  2. package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
  3. package/dist/_chunks/{App-CZe9wueI.mjs → App-jrh58sXY.mjs} +554 -575
  4. package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +7 -8
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-Be3acS2L.js → PurchaseContentReleases-bpIYXOfu.js} +6 -7
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-CmYoEnA7.js → en-HrREghh3.js} +2 -9
  10. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  11. package/dist/_chunks/{en-D0yVZFqf.mjs → en-ltT1TlKQ.mjs} +2 -9
  12. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  13. package/dist/_chunks/index-CVO0Rqdm.js +1336 -0
  14. package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
  15. package/dist/_chunks/index-PiOGBETy.mjs +1315 -0
  16. package/dist/_chunks/index-PiOGBETy.mjs.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 +646 -809
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +646 -810
  24. package/dist/server/index.mjs.map +1 -1
  25. package/package.json +38 -31
  26. package/dist/_chunks/App-CZe9wueI.mjs.map +0 -1
  27. package/dist/_chunks/App-DdxsZcmK.js.map +0 -1
  28. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  29. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
  30. package/dist/_chunks/ReleasesSettingsPage-CwsExK2M.js +0 -178
  31. package/dist/_chunks/ReleasesSettingsPage-CwsExK2M.js.map +0 -1
  32. package/dist/_chunks/ReleasesSettingsPage-DWc3H14U.mjs +0 -178
  33. package/dist/_chunks/ReleasesSettingsPage-DWc3H14U.mjs.map +0 -1
  34. package/dist/_chunks/en-CmYoEnA7.js.map +0 -1
  35. package/dist/_chunks/en-D0yVZFqf.mjs.map +0 -1
  36. package/dist/_chunks/index-CPq3qdIv.mjs +0 -1334
  37. package/dist/_chunks/index-CPq3qdIv.mjs.map +0 -1
  38. package/dist/_chunks/index-DtQIl4fm.js +0 -1353
  39. package/dist/_chunks/index-DtQIl4fm.js.map +0 -1
  40. package/dist/_chunks/schemas-63pFihNF.mjs +0 -44
  41. package/dist/_chunks/schemas-63pFihNF.mjs.map +0 -1
  42. package/dist/_chunks/schemas-z5zp-_Gd.js +0 -62
  43. package/dist/_chunks/schemas-z5zp-_Gd.js.map +0 -1
  44. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  45. package/dist/admin/src/components/ReleaseAction.d.ts +0 -3
  46. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  47. package/dist/admin/src/components/ReleaseActionModal.d.ts +0 -24
  48. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  49. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -28
  50. package/dist/admin/src/components/ReleaseModal.d.ts +0 -17
  51. package/dist/admin/src/components/ReleasesPanel.d.ts +0 -3
  52. package/dist/admin/src/constants.d.ts +0 -76
  53. package/dist/admin/src/index.d.ts +0 -3
  54. package/dist/admin/src/modules/hooks.d.ts +0 -7
  55. package/dist/admin/src/pages/App.d.ts +0 -1
  56. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  57. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  58. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  59. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +0 -1
  60. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  61. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  62. package/dist/admin/src/pluginId.d.ts +0 -1
  63. package/dist/admin/src/services/release.d.ts +0 -112
  64. package/dist/admin/src/store/hooks.d.ts +0 -7
  65. package/dist/admin/src/utils/api.d.ts +0 -6
  66. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
  67. package/dist/admin/src/utils/time.d.ts +0 -10
  68. package/dist/admin/src/validation/schemas.d.ts +0 -6
  69. package/dist/server/src/bootstrap.d.ts +0 -5
  70. package/dist/server/src/bootstrap.d.ts.map +0 -1
  71. package/dist/server/src/constants.d.ts +0 -21
  72. package/dist/server/src/constants.d.ts.map +0 -1
  73. package/dist/server/src/content-types/index.d.ts +0 -97
  74. package/dist/server/src/content-types/index.d.ts.map +0 -1
  75. package/dist/server/src/content-types/release/index.d.ts +0 -48
  76. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  77. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  78. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  79. package/dist/server/src/content-types/release-action/index.d.ts +0 -48
  80. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  81. package/dist/server/src/content-types/release-action/schema.d.ts +0 -47
  82. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  83. package/dist/server/src/controllers/index.d.ts +0 -25
  84. package/dist/server/src/controllers/index.d.ts.map +0 -1
  85. package/dist/server/src/controllers/release-action.d.ts +0 -10
  86. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  87. package/dist/server/src/controllers/release.d.ts +0 -18
  88. package/dist/server/src/controllers/release.d.ts.map +0 -1
  89. package/dist/server/src/controllers/settings.d.ts +0 -11
  90. package/dist/server/src/controllers/settings.d.ts.map +0 -1
  91. package/dist/server/src/controllers/validation/release-action.d.ts +0 -14
  92. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  93. package/dist/server/src/controllers/validation/release.d.ts +0 -4
  94. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  95. package/dist/server/src/controllers/validation/settings.d.ts +0 -3
  96. package/dist/server/src/controllers/validation/settings.d.ts.map +0 -1
  97. package/dist/server/src/destroy.d.ts +0 -5
  98. package/dist/server/src/destroy.d.ts.map +0 -1
  99. package/dist/server/src/index.d.ts +0 -2113
  100. package/dist/server/src/index.d.ts.map +0 -1
  101. package/dist/server/src/middlewares/documents.d.ts +0 -6
  102. package/dist/server/src/middlewares/documents.d.ts.map +0 -1
  103. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +0 -9
  104. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +0 -1
  105. package/dist/server/src/migrations/index.d.ts +0 -13
  106. package/dist/server/src/migrations/index.d.ts.map +0 -1
  107. package/dist/server/src/register.d.ts +0 -5
  108. package/dist/server/src/register.d.ts.map +0 -1
  109. package/dist/server/src/routes/index.d.ts +0 -51
  110. package/dist/server/src/routes/index.d.ts.map +0 -1
  111. package/dist/server/src/routes/release-action.d.ts +0 -18
  112. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  113. package/dist/server/src/routes/release.d.ts +0 -18
  114. package/dist/server/src/routes/release.d.ts.map +0 -1
  115. package/dist/server/src/routes/settings.d.ts +0 -18
  116. package/dist/server/src/routes/settings.d.ts.map +0 -1
  117. package/dist/server/src/services/index.d.ts +0 -1826
  118. package/dist/server/src/services/index.d.ts.map +0 -1
  119. package/dist/server/src/services/release-action.d.ts +0 -36
  120. package/dist/server/src/services/release-action.d.ts.map +0 -1
  121. package/dist/server/src/services/release.d.ts +0 -31
  122. package/dist/server/src/services/release.d.ts.map +0 -1
  123. package/dist/server/src/services/scheduling.d.ts +0 -18
  124. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  125. package/dist/server/src/services/settings.d.ts +0 -13
  126. package/dist/server/src/services/settings.d.ts.map +0 -1
  127. package/dist/server/src/services/validation.d.ts +0 -18
  128. package/dist/server/src/services/validation.d.ts.map +0 -1
  129. package/dist/server/src/utils/index.d.ts +0 -35
  130. package/dist/server/src/utils/index.d.ts.map +0 -1
  131. package/dist/shared/contracts/release-actions.d.ts +0 -130
  132. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  133. package/dist/shared/contracts/releases.d.ts +0 -184
  134. package/dist/shared/contracts/releases.d.ts.map +0 -1
  135. package/dist/shared/contracts/settings.d.ts +0 -39
  136. package/dist/shared/contracts/settings.d.ts.map +0 -1
  137. package/dist/shared/types.d.ts +0 -24
  138. package/dist/shared/types.d.ts.map +0 -1
@@ -1,54 +1,45 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
3
- import { useLocation, useNavigate, NavLink, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
4
- import { g as getTimezones, p as pluginId, u as useGetReleasesQuery, a as useGetReleaseSettingsQuery, b as useCreateReleaseMutation, P as PERMISSIONS, c as useGetReleaseQuery, d as useUpdateReleaseMutation, e as useDeleteReleaseMutation, f as usePublishReleaseMutation, h as getTimezoneOffset, i as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-CPq3qdIv.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, useStrapiApp, 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-PiOGBETy.mjs";
5
5
  import * as React from "react";
6
- import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
- import { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, Dialog, SimpleMenu, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
- import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
9
- import { EmptyDocuments } from "@strapi/icons/symbols";
10
- import format$1 from "date-fns/format";
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";
8
+ import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
9
+ import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle } from "@strapi/icons";
10
+ import format from "date-fns/format";
11
11
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
12
  import { useIntl } from "react-intl";
13
- import { styled } from "styled-components";
14
- import { intervalToDuration, isPast, formatISO, format } from "date-fns";
13
+ import styled from "styled-components";
14
+ import { formatISO } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
- import { R as RELEASE_SCHEMA } from "./schemas-63pFihNF.mjs";
17
- import { useDispatch } from "react-redux";
18
- import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
19
- const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
20
- const RelativeTime$1 = React.forwardRef(
21
- ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
22
- const { formatRelativeTime, formatDate, formatTime } = useIntl();
23
- const interval = intervalToDuration({
24
- start: timestamp,
25
- end: Date.now()
26
- // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
27
- });
28
- const unit = intervals.find((intervalUnit) => {
29
- return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
30
- });
31
- const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
32
- const customInterval = customIntervals.find(
33
- (custom) => interval[custom.unit] < custom.threshold
34
- );
35
- const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
36
- return /* @__PURE__ */ jsx(
37
- "time",
38
- {
39
- ref: forwardedRef,
40
- dateTime: timestamp.toISOString(),
41
- role: "time",
42
- title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
43
- ...restProps,
44
- children: displayText
45
- }
46
- );
47
- }
48
- );
16
+ import * as yup from "yup";
17
+ import "@reduxjs/toolkit/query";
18
+ import "axios";
19
+ import "@reduxjs/toolkit/query/react";
20
+ import "react-redux";
21
+ const RELEASE_SCHEMA = yup.object().shape({
22
+ name: yup.string().trim().required(),
23
+ scheduledAt: yup.string().nullable(),
24
+ isScheduled: yup.boolean().optional(),
25
+ time: yup.string().when("isScheduled", {
26
+ is: true,
27
+ then: yup.string().trim().required(),
28
+ otherwise: yup.string().nullable()
29
+ }),
30
+ timezone: yup.string().when("isScheduled", {
31
+ is: true,
32
+ then: yup.string().required().nullable(),
33
+ otherwise: yup.string().nullable()
34
+ }),
35
+ date: yup.string().when("isScheduled", {
36
+ is: true,
37
+ then: yup.string().required().nullable(),
38
+ otherwise: yup.string().nullable()
39
+ })
40
+ }).required().noUnknown();
49
41
  const ReleaseModal = ({
50
42
  handleClose,
51
- open,
52
43
  handleSubmit,
53
44
  initialValues,
54
45
  isLoading = false
@@ -72,8 +63,8 @@ const ReleaseModal = ({
72
63
  );
73
64
  return currentTimezone?.value || systemTimezone.value;
74
65
  };
75
- return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
76
- /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
66
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
67
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
77
68
  {
78
69
  id: "content-releases.modal.title",
79
70
  defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
@@ -96,143 +87,133 @@ const ReleaseModal = ({
96
87
  },
97
88
  validationSchema: RELEASE_SCHEMA,
98
89
  validateOnChange: false,
99
- children: ({ values, errors, handleChange, setFieldValue }) => {
100
- return /* @__PURE__ */ jsxs(Form, { children: [
101
- /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
102
- /* @__PURE__ */ jsxs(
103
- Field.Root,
104
- {
105
- name: "name",
106
- error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
107
- required: true,
108
- children: [
109
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
110
- id: "content-releases.modal.form.input.label.release-name",
111
- defaultMessage: "Name"
112
- }) }),
113
- /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
114
- /* @__PURE__ */ jsx(Field.Error, {})
115
- ]
116
- }
117
- ),
118
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
119
- Checkbox,
120
- {
121
- name: "isScheduled",
122
- checked: values.isScheduled,
123
- onCheckedChange: (checked) => {
124
- setFieldValue("isScheduled", checked);
125
- if (!checked) {
90
+ children: ({ values, errors, handleChange, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
91
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
92
+ /* @__PURE__ */ jsx(
93
+ TextInput,
94
+ {
95
+ label: formatMessage({
96
+ id: "content-releases.modal.form.input.label.release-name",
97
+ defaultMessage: "Name"
98
+ }),
99
+ name: "name",
100
+ value: values.name,
101
+ error: errors.name,
102
+ onChange: handleChange,
103
+ required: true
104
+ }
105
+ ),
106
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
107
+ Checkbox,
108
+ {
109
+ name: "isScheduled",
110
+ value: values.isScheduled,
111
+ onChange: (event) => {
112
+ setFieldValue("isScheduled", event.target.checked);
113
+ if (!event.target.checked) {
114
+ setFieldValue("date", null);
115
+ setFieldValue("time", "");
116
+ setFieldValue("timezone", null);
117
+ } else {
118
+ setFieldValue("date", initialValues.date);
119
+ setFieldValue("time", initialValues.time);
120
+ setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
121
+ }
122
+ },
123
+ children: /* @__PURE__ */ jsx(
124
+ Typography,
125
+ {
126
+ textColor: values.isScheduled ? "primary600" : "neutral800",
127
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
128
+ children: formatMessage({
129
+ id: "modal.form.input.label.schedule-release",
130
+ defaultMessage: "Schedule release"
131
+ })
132
+ }
133
+ )
134
+ }
135
+ ) }),
136
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
137
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
138
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
139
+ DatePicker,
140
+ {
141
+ label: formatMessage({
142
+ id: "content-releases.modal.form.input.label.date",
143
+ defaultMessage: "Date"
144
+ }),
145
+ name: "date",
146
+ error: errors.date,
147
+ onChange: (date) => {
148
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
149
+ setFieldValue("date", isoFormatDate);
150
+ },
151
+ clearLabel: formatMessage({
152
+ id: "content-releases.modal.form.input.clearLabel",
153
+ defaultMessage: "Clear"
154
+ }),
155
+ onClear: () => {
126
156
  setFieldValue("date", null);
157
+ },
158
+ selectedDate: values.date || void 0,
159
+ required: true,
160
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
161
+ }
162
+ ) }),
163
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
164
+ TimePicker,
165
+ {
166
+ label: formatMessage({
167
+ id: "content-releases.modal.form.input.label.time",
168
+ defaultMessage: "Time"
169
+ }),
170
+ name: "time",
171
+ error: errors.time,
172
+ onChange: (time) => {
173
+ setFieldValue("time", time);
174
+ },
175
+ clearLabel: formatMessage({
176
+ id: "content-releases.modal.form.input.clearLabel",
177
+ defaultMessage: "Clear"
178
+ }),
179
+ onClear: () => {
127
180
  setFieldValue("time", "");
128
- setFieldValue("timezone", null);
129
- } else {
130
- setFieldValue("date", initialValues.date);
131
- setFieldValue("time", initialValues.time);
132
- setFieldValue(
133
- "timezone",
134
- initialValues.timezone ?? systemTimezone?.value
135
- );
136
- }
137
- },
138
- children: /* @__PURE__ */ jsx(
139
- Typography,
140
- {
141
- textColor: values.isScheduled ? "primary600" : "neutral800",
142
- fontWeight: values.isScheduled ? "semiBold" : "regular",
143
- children: formatMessage({
144
- id: "modal.form.input.label.schedule-release",
145
- defaultMessage: "Schedule release"
146
- })
147
- }
148
- )
149
- }
150
- ) }),
151
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
152
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
153
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
154
- Field.Root,
155
- {
156
- name: "date",
157
- error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
158
- required: true,
159
- children: [
160
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
161
- id: "content-releases.modal.form.input.label.date",
162
- defaultMessage: "Date"
163
- }) }),
164
- /* @__PURE__ */ jsx(
165
- DatePicker,
166
- {
167
- onChange: (date) => {
168
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
169
- setFieldValue("date", isoFormatDate);
170
- },
171
- clearLabel: formatMessage({
172
- id: "content-releases.modal.form.input.clearLabel",
173
- defaultMessage: "Clear"
174
- }),
175
- onClear: () => {
176
- setFieldValue("date", null);
177
- },
178
- value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
179
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
180
- }
181
- ),
182
- /* @__PURE__ */ jsx(Field.Error, {})
183
- ]
184
- }
185
- ) }),
186
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
187
- Field.Root,
188
- {
189
- name: "time",
190
- error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
191
- required: true,
192
- children: [
193
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
194
- id: "content-releases.modal.form.input.label.time",
195
- defaultMessage: "Time"
196
- }) }),
197
- /* @__PURE__ */ jsx(
198
- TimePicker,
199
- {
200
- onChange: (time) => {
201
- setFieldValue("time", time);
202
- },
203
- clearLabel: formatMessage({
204
- id: "content-releases.modal.form.input.clearLabel",
205
- defaultMessage: "Clear"
206
- }),
207
- onClear: () => {
208
- setFieldValue("time", "");
209
- },
210
- value: values.time || void 0
211
- }
212
- ),
213
- /* @__PURE__ */ jsx(Field.Error, {})
214
- ]
215
- }
216
- ) })
217
- ] }),
218
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
219
- ] })
220
- ] }) }),
221
- /* @__PURE__ */ jsxs(Modal.Footer, { children: [
222
- /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
223
- /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
181
+ },
182
+ value: values.time || void 0,
183
+ required: true
184
+ }
185
+ ) })
186
+ ] }),
187
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
188
+ ] })
189
+ ] }) }),
190
+ /* @__PURE__ */ jsx(
191
+ ModalFooter,
192
+ {
193
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
194
+ endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
224
195
  {
225
196
  id: "content-releases.modal.form.button.submit",
226
197
  defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
227
198
  },
228
199
  { isCreatingRelease }
229
200
  ) })
230
- ] })
231
- ] });
232
- }
201
+ }
202
+ )
203
+ ] })
233
204
  }
234
205
  )
235
- ] }) });
206
+ ] });
207
+ };
208
+ const getTimezones = (selectedDate) => {
209
+ const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
210
+ const utcOffset = getTimezoneOffset(timezone, selectedDate);
211
+ return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
212
+ });
213
+ const systemTimezone = timezoneList.find(
214
+ (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
215
+ );
216
+ return { timezoneList, systemTimezone };
236
217
  };
237
218
  const TimezoneComponent = ({ timezoneOptions }) => {
238
219
  const { values, errors, setFieldValue } = useFormikContext();
@@ -248,44 +229,32 @@ const TimezoneComponent = ({ timezoneOptions }) => {
248
229
  }
249
230
  }
250
231
  }, [setFieldValue, values.date, values.timezone]);
251
- return /* @__PURE__ */ jsxs(
252
- Field.Root,
232
+ return /* @__PURE__ */ jsx(
233
+ Combobox,
253
234
  {
235
+ label: formatMessage({
236
+ id: "content-releases.modal.form.input.label.timezone",
237
+ defaultMessage: "Timezone"
238
+ }),
239
+ autocomplete: { type: "list", filter: "contains" },
254
240
  name: "timezone",
255
- error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
241
+ value: values.timezone || void 0,
242
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
243
+ onChange: (timezone) => {
244
+ setFieldValue("timezone", timezone);
245
+ },
246
+ onTextValueChange: (timezone) => {
247
+ setFieldValue("timezone", timezone);
248
+ },
249
+ onClear: () => {
250
+ setFieldValue("timezone", "");
251
+ },
252
+ error: errors.timezone,
256
253
  required: true,
257
- children: [
258
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
259
- id: "content-releases.modal.form.input.label.timezone",
260
- defaultMessage: "Timezone"
261
- }) }),
262
- /* @__PURE__ */ jsx(
263
- Combobox,
264
- {
265
- autocomplete: { type: "list", filter: "contains" },
266
- value: values.timezone || void 0,
267
- textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
268
- onChange: (timezone) => {
269
- setFieldValue("timezone", timezone);
270
- },
271
- onTextValueChange: (timezone) => {
272
- setFieldValue("timezone", timezone);
273
- },
274
- onClear: () => {
275
- setFieldValue("timezone", "");
276
- },
277
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
278
- }
279
- ),
280
- /* @__PURE__ */ jsx(Field.Error, {})
281
- ]
254
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
282
255
  }
283
256
  );
284
257
  };
285
- const useTypedDispatch = useDispatch;
286
- const isBaseQueryError = (error) => {
287
- return typeof error !== "undefined" && error.name !== void 0;
288
- };
289
258
  const LinkCard = styled(Link)`
290
259
  display: block;
291
260
  `;
@@ -323,7 +292,7 @@ const getBadgeProps = (status) => {
323
292
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
324
293
  const { formatMessage } = useIntl();
325
294
  if (isError) {
326
- return /* @__PURE__ */ jsx(Page.Error, {});
295
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
327
296
  }
328
297
  if (releases?.length === 0) {
329
298
  return /* @__PURE__ */ jsx(
@@ -338,11 +307,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
338
307
  target: sectionTitle
339
308
  }
340
309
  ),
341
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
310
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
342
311
  }
343
312
  );
344
313
  }
345
- return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
314
+ return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
346
315
  Flex,
347
316
  {
348
317
  direction: "column",
@@ -357,7 +326,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
357
326
  gap: 4,
358
327
  children: [
359
328
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
360
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
329
+ /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
361
330
  /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
362
331
  id: "content-releases.pages.Releases.not-scheduled",
363
332
  defaultMessage: "Not scheduled"
@@ -378,35 +347,33 @@ const StyledAlert = styled(Alert)`
378
347
  `;
379
348
  const INITIAL_FORM_VALUES = {
380
349
  name: "",
381
- date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
350
+ date: null,
382
351
  time: "",
383
352
  isScheduled: true,
384
353
  scheduledAt: null,
385
354
  timezone: null
386
355
  };
387
356
  const ReleasesPage = () => {
357
+ const tabRef = React.useRef(null);
388
358
  const location = useLocation();
389
359
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
390
- const { toggleNotification } = useNotification();
360
+ const toggleNotification = useNotification();
391
361
  const { formatMessage } = useIntl();
392
- const navigate = useNavigate();
362
+ const { push, replace } = useHistory();
393
363
  const { formatAPIError } = useAPIErrorHandler();
394
364
  const [{ query }, setQuery] = useQueryParams();
395
365
  const response = useGetReleasesQuery(query);
396
- const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
397
366
  const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
398
367
  const { getFeature } = useLicenseLimits();
399
368
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
400
369
  const { trackUsage } = useTracking();
401
- const {
402
- allowedActions: { canCreate }
403
- } = useRBAC(PERMISSIONS);
404
- const { isLoading: isLoadingReleases, isSuccess, isError } = response;
370
+ const { isLoading, isSuccess, isError } = response;
405
371
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
372
+ const activeTabIndex = ["pending", "done"].indexOf(activeTab);
406
373
  React.useEffect(() => {
407
374
  if (location?.state?.errors) {
408
375
  toggleNotification({
409
- type: "danger",
376
+ type: "warning",
410
377
  title: formatMessage({
411
378
  id: "content-releases.pages.Releases.notification.error.title",
412
379
  defaultMessage: "Your request could not be processed."
@@ -416,25 +383,30 @@ const ReleasesPage = () => {
416
383
  defaultMessage: "Please try again or open another release."
417
384
  })
418
385
  });
419
- navigate("", { replace: true, state: null });
386
+ replace({ state: null });
387
+ }
388
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
389
+ React.useEffect(() => {
390
+ if (tabRef.current) {
391
+ tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
420
392
  }
421
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
393
+ }, [activeTabIndex]);
422
394
  const toggleAddReleaseModal = () => {
423
395
  setReleaseModalShown((prev) => !prev);
424
396
  };
425
- if (isLoadingReleases || isLoadingSettings) {
426
- return /* @__PURE__ */ jsx(Page.Loading, {});
397
+ if (isLoading) {
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;
430
- const handleTabChange = (tabValue) => {
402
+ const handleTabChange = (index) => {
431
403
  setQuery({
432
404
  ...query,
433
405
  page: 1,
434
406
  pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
435
407
  filters: {
436
408
  releasedAt: {
437
- $notNull: tabValue !== "pending"
409
+ $notNull: index === 0 ? false : true
438
410
  }
439
411
  }
440
412
  });
@@ -454,22 +426,22 @@ const ReleasesPage = () => {
454
426
  })
455
427
  });
456
428
  trackUsage("didCreateRelease");
457
- navigate(response2.data.data.id.toString());
458
- } else if (isFetchError(response2.error)) {
429
+ push(`/plugins/content-releases/${response2.data.data.id}`);
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
  }
469
441
  };
470
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
442
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
471
443
  /* @__PURE__ */ jsx(
472
- Layouts.Header,
444
+ HeaderLayout,
473
445
  {
474
446
  title: formatMessage({
475
447
  id: "content-releases.pages.Releases.title",
@@ -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,10 +462,10 @@ const ReleasesPage = () => {
490
462
  defaultMessage: "New release"
491
463
  })
492
464
  }
493
- ) : null
465
+ ) })
494
466
  }
495
467
  ),
496
- /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
468
+ /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
497
469
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
498
470
  StyledAlert,
499
471
  {
@@ -518,17 +490,21 @@ const ReleasesPage = () => {
518
490
  })
519
491
  }
520
492
  ),
521
- /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
522
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
523
- /* @__PURE__ */ jsxs(
524
- Tabs.List,
525
- {
526
- "aria-label": formatMessage({
527
- id: "content-releases.pages.Releases.tab-group.label",
528
- defaultMessage: "Releases list"
529
- }),
530
- children: [
531
- /* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
493
+ /* @__PURE__ */ jsxs(
494
+ TabGroup,
495
+ {
496
+ label: formatMessage({
497
+ id: "content-releases.pages.Releases.tab-group.label",
498
+ defaultMessage: "Releases list"
499
+ }),
500
+ variant: "simple",
501
+ initialSelectedTabIndex: activeTabIndex,
502
+ onTabChange: handleTabChange,
503
+ ref: tabRef,
504
+ children: [
505
+ /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
506
+ /* @__PURE__ */ jsxs(Tabs, { children: [
507
+ /* @__PURE__ */ jsx(Tab, { children: formatMessage(
532
508
  {
533
509
  id: "content-releases.pages.Releases.tab.pending",
534
510
  defaultMessage: "Pending ({count})"
@@ -537,55 +513,59 @@ const ReleasesPage = () => {
537
513
  count: totalPendingReleases
538
514
  }
539
515
  ) }),
540
- /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
516
+ /* @__PURE__ */ jsx(Tab, { children: formatMessage({
541
517
  id: "content-releases.pages.Releases.tab.done",
542
518
  defaultMessage: "Done"
543
519
  }) })
544
- ]
545
- }
546
- ),
547
- /* @__PURE__ */ jsx(Divider, {})
548
- ] }),
549
- /* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
550
- ReleasesGrid,
520
+ ] }),
521
+ /* @__PURE__ */ jsx(Divider, {})
522
+ ] }),
523
+ /* @__PURE__ */ jsxs(TabPanels, { children: [
524
+ /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
525
+ ReleasesGrid,
526
+ {
527
+ sectionTitle: "pending",
528
+ releases: response?.currentData?.data,
529
+ isError
530
+ }
531
+ ) }),
532
+ /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
533
+ ReleasesGrid,
534
+ {
535
+ sectionTitle: "done",
536
+ releases: response?.currentData?.data,
537
+ isError
538
+ }
539
+ ) })
540
+ ] })
541
+ ]
542
+ }
543
+ ),
544
+ response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
545
+ /* @__PURE__ */ jsx(
546
+ PageSizeURLQuery,
551
547
  {
552
- sectionTitle: "pending",
553
- releases: response?.currentData?.data,
554
- isError
548
+ options: ["8", "16", "32", "64"],
549
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
555
550
  }
556
- ) }),
557
- /* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
558
- ReleasesGrid,
551
+ ),
552
+ /* @__PURE__ */ jsx(
553
+ PaginationURLQuery,
559
554
  {
560
- sectionTitle: "done",
561
- releases: response?.currentData?.data,
562
- isError
555
+ pagination: {
556
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
557
+ }
563
558
  }
564
- ) })
565
- ] }),
566
- /* @__PURE__ */ jsxs(
567
- Pagination.Root,
568
- {
569
- ...response?.currentData?.meta?.pagination,
570
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
571
- children: [
572
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
573
- /* @__PURE__ */ jsx(Pagination.Links, {})
574
- ]
575
- }
576
- )
559
+ )
560
+ ] }) : null
577
561
  ] }) }),
578
- /* @__PURE__ */ jsx(
562
+ releaseModalShown && /* @__PURE__ */ jsx(
579
563
  ReleaseModal,
580
564
  {
581
- open: releaseModalShown,
582
565
  handleClose: toggleAddReleaseModal,
583
566
  handleSubmit: handleAddRelease,
584
567
  isLoading: isSubmittingForm,
585
- initialValues: {
586
- ...INITIAL_FORM_VALUES,
587
- timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
588
- }
568
+ initialValues: INITIAL_FORM_VALUES
589
569
  }
590
570
  )
591
571
  ] });
@@ -596,7 +576,7 @@ const ReleaseInfoWrapper = styled(Flex)`
596
576
  border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
597
577
  border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
598
578
  `;
599
- const StyledMenuItem = styled(MenuItem)`
579
+ const StyledMenuItem = styled(Menu.Item)`
600
580
  svg path {
601
581
  fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
602
582
  }
@@ -605,7 +585,7 @@ const StyledMenuItem = styled(MenuItem)`
605
585
  }
606
586
 
607
587
  &:hover {
608
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
588
+ background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
609
589
  }
610
590
  `;
611
591
  const PencilIcon = styled(Pencil)`
@@ -625,75 +605,40 @@ const TrashIcon = styled(Trash)`
625
605
  const TypographyMaxWidth = styled(Typography)`
626
606
  max-width: 300px;
627
607
  `;
628
- const EntryValidationText = ({ action, schema, entry, status }) => {
608
+ const EntryValidationText = ({ action, schema, components, entry }) => {
629
609
  const { formatMessage } = useIntl();
630
- const { validate, isLoading } = unstable_useDocument(
631
- {
632
- collectionType: schema?.kind ?? "",
633
- model: schema?.uid ?? ""
634
- },
635
- {
636
- // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request
637
- skip: true
638
- }
639
- );
640
- if (isLoading) {
641
- return null;
610
+ const { validate } = unstable_useDocument();
611
+ const { errors } = validate(entry, {
612
+ contentType: schema,
613
+ components,
614
+ isCreatingEntry: false
615
+ });
616
+ if (Object.keys(errors).length > 0) {
617
+ const validationErrorsMessages = Object.entries(errors).map(
618
+ ([key, value]) => formatMessage(
619
+ { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
620
+ { field: key }
621
+ )
622
+ ).join(" ");
623
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
624
+ /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
625
+ /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
626
+ ] });
642
627
  }
643
- const errors = validate(entry) ?? {};
644
- if (action === "publish") {
645
- if (Object.keys(errors).length > 0) {
646
- const validationErrorsMessages = Object.entries(errors).map(
647
- ([key, value]) => formatMessage(
648
- // @ts-expect-error – TODO: fix this will better checks
649
- { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
650
- { field: key }
651
- )
652
- ).join(" ");
653
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
654
- /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
655
- /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(
656
- TypographyMaxWidth,
657
- {
658
- textColor: "danger600",
659
- variant: "omega",
660
- fontWeight: "semiBold",
661
- ellipsis: true,
662
- children: validationErrorsMessages
663
- }
664
- ) })
665
- ] });
666
- }
667
- if (status === "draft") {
668
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
669
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
670
- /* @__PURE__ */ jsx(Typography, { children: formatMessage({
671
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
672
- defaultMessage: "Ready to publish"
673
- }) })
674
- ] });
675
- }
676
- if (status === "modified") {
677
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
678
- /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
679
- /* @__PURE__ */ jsx(Typography, { children: formatMessage({
680
- id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
681
- defaultMessage: "Ready to publish changes"
682
- }) })
683
- ] });
684
- }
685
- if (status === "published") {
686
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
687
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
688
- /* @__PURE__ */ jsx(Typography, { children: formatMessage({
689
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
690
- defaultMessage: "Already published"
691
- }) })
692
- ] });
693
- }
628
+ if (action == "publish") {
629
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
630
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
631
+ entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
632
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
633
+ defaultMessage: "Already published"
634
+ }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
635
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
636
+ defaultMessage: "Ready to publish"
637
+ }) })
638
+ ] });
694
639
  }
695
640
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
696
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
641
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
697
642
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
698
643
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
699
644
  defaultMessage: "Already unpublished"
@@ -713,23 +658,20 @@ const ReleaseDetailsLayout = ({
713
658
  const {
714
659
  data,
715
660
  isLoading: isLoadingDetails,
661
+ isError,
716
662
  error
717
- } = useGetReleaseQuery(
718
- { id: releaseId },
719
- {
720
- skip: !releaseId
721
- }
722
- );
663
+ } = useGetReleaseQuery({ id: releaseId });
723
664
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
724
- const { toggleNotification } = useNotification();
665
+ const toggleNotification = useNotification();
725
666
  const { formatAPIError } = useAPIErrorHandler();
726
- const { allowedActions } = useRBAC(PERMISSIONS);
727
- const { canUpdate, canDelete, canPublish } = allowedActions;
667
+ const {
668
+ allowedActions: { canUpdate, canDelete }
669
+ } = useRBAC(PERMISSIONS);
728
670
  const dispatch = useTypedDispatch();
729
671
  const { trackUsage } = useTracking();
730
672
  const release = data?.data;
731
- const handlePublishRelease = (id) => async () => {
732
- const response = await publishRelease({ id });
673
+ const handlePublishRelease = async () => {
674
+ const response = await publishRelease({ id: releaseId });
733
675
  if ("data" in response) {
734
676
  toggleNotification({
735
677
  type: "success",
@@ -744,14 +686,14 @@ const ReleaseDetailsLayout = ({
744
686
  totalPublishedEntries,
745
687
  totalUnpublishedEntries
746
688
  });
747
- } else if (isFetchError(response.error)) {
689
+ } else if (isAxiosError(response.error)) {
748
690
  toggleNotification({
749
- type: "danger",
691
+ type: "warning",
750
692
  message: formatAPIError(response.error)
751
693
  });
752
694
  } else {
753
695
  toggleNotification({
754
- type: "danger",
696
+ type: "warning",
755
697
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
756
698
  });
757
699
  }
@@ -777,20 +719,21 @@ const ReleaseDetailsLayout = ({
777
719
  return release.createdBy.email;
778
720
  };
779
721
  if (isLoadingDetails) {
780
- return /* @__PURE__ */ jsx(Page.Loading, {});
722
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
781
723
  }
782
- if (isBaseQueryError(error) && "code" in error || !release) {
724
+ if (isError || !release) {
783
725
  return /* @__PURE__ */ jsx(
784
- Navigate,
726
+ Redirect,
785
727
  {
786
- to: "..",
787
- state: {
788
- errors: [
789
- {
790
- // @ts-expect-error – TODO: fix this weird error flow
791
- code: error?.code
792
- }
793
- ]
728
+ to: {
729
+ pathname: "/plugins/content-releases",
730
+ state: {
731
+ errors: [
732
+ {
733
+ code: error?.code
734
+ }
735
+ ]
736
+ }
794
737
  }
795
738
  }
796
739
  );
@@ -827,90 +770,106 @@ const ReleaseDetailsLayout = ({
827
770
  ) : "";
828
771
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
829
772
  /* @__PURE__ */ jsx(
830
- Layouts.Header,
773
+ HeaderLayout,
831
774
  {
832
775
  title: release.name,
833
776
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
834
777
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
835
778
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
836
779
  ] }),
837
- 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
+ }) }),
838
784
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
839
- /* @__PURE__ */ jsxs(
840
- SimpleMenu,
841
- {
842
- label: /* @__PURE__ */ jsx(More, {}),
843
- variant: "tertiary",
844
- endIcon: null,
845
- paddingLeft: "7px",
846
- paddingRight: "7px",
847
- "aria-label": formatMessage({
848
- id: "content-releases.header.actions.open-release-actions",
849
- defaultMessage: "Release edit and delete menu"
850
- }),
851
- popoverPlacement: "bottom-end",
852
- children: [
853
- /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
854
- /* @__PURE__ */ jsx(PencilIcon, {}),
855
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
856
- id: "content-releases.header.actions.edit",
857
- defaultMessage: "Edit"
858
- }) })
859
- ] }) }),
860
- /* @__PURE__ */ jsx(
861
- StyledMenuItem,
862
- {
863
- disabled: !canDelete,
864
- onSelect: toggleWarningSubmit,
865
- $variant: "danger",
866
- children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
867
- /* @__PURE__ */ jsx(TrashIcon, {}),
868
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
869
- id: "content-releases.header.actions.delete",
870
- defaultMessage: "Delete"
785
+ /* @__PURE__ */ jsxs(Menu.Root, { children: [
786
+ /* @__PURE__ */ jsx(
787
+ Menu.Trigger,
788
+ {
789
+ as: IconButton,
790
+ paddingLeft: 2,
791
+ paddingRight: 2,
792
+ "aria-label": formatMessage({
793
+ id: "content-releases.header.actions.open-release-actions",
794
+ defaultMessage: "Release edit and delete menu"
795
+ }),
796
+ icon: /* @__PURE__ */ jsx(More, {}),
797
+ variant: "tertiary"
798
+ }
799
+ ),
800
+ /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
801
+ /* @__PURE__ */ jsxs(
802
+ Flex,
803
+ {
804
+ alignItems: "center",
805
+ justifyContent: "center",
806
+ direction: "column",
807
+ padding: 1,
808
+ width: "100%",
809
+ children: [
810
+ /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
811
+ /* @__PURE__ */ jsx(PencilIcon, {}),
812
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
813
+ id: "content-releases.header.actions.edit",
814
+ defaultMessage: "Edit"
871
815
  }) })
816
+ ] }) }),
817
+ /* @__PURE__ */ jsx(
818
+ StyledMenuItem,
819
+ {
820
+ disabled: !canDelete,
821
+ onSelect: toggleWarningSubmit,
822
+ variant: "danger",
823
+ children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
824
+ /* @__PURE__ */ jsx(TrashIcon, {}),
825
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
826
+ id: "content-releases.header.actions.delete",
827
+ defaultMessage: "Delete"
828
+ }) })
829
+ ] })
830
+ }
831
+ )
832
+ ]
833
+ }
834
+ ),
835
+ /* @__PURE__ */ jsxs(
836
+ ReleaseInfoWrapper,
837
+ {
838
+ direction: "column",
839
+ justifyContent: "center",
840
+ alignItems: "flex-start",
841
+ gap: 1,
842
+ padding: 5,
843
+ children: [
844
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
845
+ id: "content-releases.header.actions.created",
846
+ defaultMessage: "Created"
847
+ }) }),
848
+ /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
849
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
850
+ formatMessage(
851
+ {
852
+ id: "content-releases.header.actions.created.description",
853
+ defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
854
+ },
855
+ { createdBy: getCreatedByUser(), hasCreatedByUser }
856
+ )
872
857
  ] })
873
- }
874
- ),
875
- /* @__PURE__ */ jsxs(
876
- ReleaseInfoWrapper,
877
- {
878
- direction: "column",
879
- justifyContent: "center",
880
- alignItems: "flex-start",
881
- gap: 1,
882
- padding: 5,
883
- children: [
884
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
885
- id: "content-releases.header.actions.created",
886
- defaultMessage: "Created"
887
- }) }),
888
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
889
- /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
890
- formatMessage(
891
- {
892
- id: "content-releases.header.actions.created.description",
893
- defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
894
- },
895
- { createdBy: getCreatedByUser(), hasCreatedByUser }
896
- )
897
- ] })
898
- ]
899
- }
900
- )
901
- ]
902
- }
903
- ),
858
+ ]
859
+ }
860
+ )
861
+ ] })
862
+ ] }),
904
863
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
905
864
  id: "content-releases.header.actions.refresh",
906
865
  defaultMessage: "Refresh"
907
866
  }) }),
908
- canPublish ? /* @__PURE__ */ jsx(
867
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
909
868
  Button,
910
869
  {
911
870
  size: "S",
912
871
  variant: "default",
913
- onClick: handlePublishRelease(release.id.toString()),
872
+ onClick: handlePublishRelease,
914
873
  loading: isPublishing,
915
874
  disabled: release.actions.meta.count === 0,
916
875
  children: formatMessage({
@@ -918,7 +877,7 @@ const ReleaseDetailsLayout = ({
918
877
  defaultMessage: "Publish"
919
878
  })
920
879
  }
921
- ) : null
880
+ ) })
922
881
  ] })
923
882
  }
924
883
  ),
@@ -945,32 +904,47 @@ const getGroupByOptionLabel = (value) => {
945
904
  defaultMessage: "Content-Types"
946
905
  };
947
906
  };
948
- const ReleaseDetailsBody = ({ releaseId }) => {
907
+ const DEFAULT_RELEASE_DETAILS_HEADER = [
908
+ {
909
+ key: "__name__",
910
+ fieldSchema: { type: "string" },
911
+ metadatas: {
912
+ label: {
913
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
914
+ defaultMessage: "name"
915
+ },
916
+ searchable: false,
917
+ sortable: false
918
+ },
919
+ name: "name"
920
+ }
921
+ ];
922
+ const ReleaseDetailsBody = () => {
949
923
  const { formatMessage } = useIntl();
924
+ const { releaseId } = useParams();
950
925
  const [{ query }, setQuery] = useQueryParams();
951
- const { toggleNotification } = useNotification();
926
+ const toggleNotification = useNotification();
952
927
  const { formatAPIError } = useAPIErrorHandler();
953
928
  const {
954
929
  data: releaseData,
955
930
  isLoading: isReleaseLoading,
931
+ isError: isReleaseError,
956
932
  error: releaseError
957
933
  } = useGetReleaseQuery({ id: releaseId });
958
934
  const {
959
935
  allowedActions: { canUpdate }
960
936
  } = useRBAC(PERMISSIONS);
961
- const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
962
- const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
963
- displayedHeaders: [
964
- {
965
- label: {
966
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
967
- defaultMessage: "name"
968
- },
969
- name: "name"
970
- }
971
- ],
972
- hasI18nEnabled: false
973
- });
937
+ const { runHookWaterfall } = useStrapiApp();
938
+ const {
939
+ displayedHeaders,
940
+ hasI18nEnabled
941
+ } = runHookWaterfall(
942
+ "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
943
+ {
944
+ displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
945
+ hasI18nEnabled: false
946
+ }
947
+ );
974
948
  const release = releaseData?.data;
975
949
  const selectedGroupBy = query?.groupBy || "contentType";
976
950
  const {
@@ -999,59 +973,65 @@ const ReleaseDetailsBody = ({ releaseId }) => {
999
973
  // We are passing the action path to found the position in the cache of the action for optimistic updates
1000
974
  });
1001
975
  if ("error" in response) {
1002
- if (isFetchError(response.error)) {
976
+ if (isAxiosError(response.error)) {
1003
977
  toggleNotification({
1004
- type: "danger",
978
+ type: "warning",
1005
979
  message: formatAPIError(response.error)
1006
980
  });
1007
981
  } else {
1008
982
  toggleNotification({
1009
- type: "danger",
983
+ type: "warning",
1010
984
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1011
985
  });
1012
986
  }
1013
987
  }
1014
988
  };
1015
989
  if (isLoading || isReleaseLoading) {
1016
- return /* @__PURE__ */ jsx(Page.Loading, {});
990
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
1017
991
  }
1018
992
  const releaseActions = data?.data;
1019
993
  const releaseMeta = data?.meta;
1020
994
  const contentTypes = releaseMeta?.contentTypes || {};
1021
995
  const components = releaseMeta?.components || {};
1022
- if (isBaseQueryError(releaseError) || !release) {
996
+ if (isReleaseError || !release) {
1023
997
  const errorsArray = [];
1024
- if (releaseError && "code" in releaseError) {
998
+ if (releaseError) {
1025
999
  errorsArray.push({
1026
1000
  code: releaseError.code
1027
1001
  });
1028
1002
  }
1029
- if (releaseActionsError && "code" in releaseActionsError) {
1003
+ if (releaseActionsError) {
1030
1004
  errorsArray.push({
1031
1005
  code: releaseActionsError.code
1032
1006
  });
1033
1007
  }
1034
1008
  return /* @__PURE__ */ jsx(
1035
- Navigate,
1009
+ Redirect,
1036
1010
  {
1037
- to: "..",
1038
- state: {
1039
- errors: errorsArray
1011
+ to: {
1012
+ pathname: "/plugins/content-releases",
1013
+ state: {
1014
+ errors: errorsArray
1015
+ }
1040
1016
  }
1041
1017
  }
1042
1018
  );
1043
1019
  }
1044
1020
  if (isError || !releaseActions) {
1045
- return /* @__PURE__ */ jsx(Page.Error, {});
1021
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1046
1022
  }
1047
1023
  if (Object.keys(releaseActions).length === 0) {
1048
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1049
- EmptyStateLayout,
1024
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1025
+ NoContent,
1050
1026
  {
1027
+ content: {
1028
+ id: "content-releases.pages.Details.tab.emptyEntries",
1029
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1030
+ },
1051
1031
  action: /* @__PURE__ */ jsx(
1052
1032
  LinkButton,
1053
1033
  {
1054
- tag: Link$1,
1034
+ as: Link$2,
1055
1035
  to: {
1056
1036
  pathname: "/content-manager"
1057
1037
  },
@@ -1062,52 +1042,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1062
1042
  defaultMessage: "Open the Content Manager"
1063
1043
  })
1064
1044
  }
1065
- ),
1066
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1067
- content: formatMessage({
1068
- id: "content-releases.pages.Details.tab.emptyEntries",
1069
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1070
- })
1045
+ )
1071
1046
  }
1072
1047
  ) });
1073
1048
  }
1074
- const groupByLabel = formatMessage({
1075
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1076
- defaultMessage: "Group by"
1077
- });
1078
- const headers = [
1079
- ...displayedHeaders,
1080
- {
1081
- label: {
1082
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1083
- defaultMessage: "content-type"
1084
- },
1085
- name: "content-type"
1086
- },
1087
- {
1088
- label: {
1089
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1090
- defaultMessage: "action"
1091
- },
1092
- name: "action"
1093
- },
1094
- ...!release.releasedAt ? [
1095
- {
1096
- label: {
1097
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1098
- defaultMessage: "status"
1099
- },
1100
- name: "status"
1101
- }
1102
- ] : []
1103
- ];
1104
1049
  const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1105
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1050
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1106
1051
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1107
1052
  SingleSelect,
1108
1053
  {
1109
- placeholder: groupByLabel,
1110
- "aria-label": groupByLabel,
1054
+ "aria-label": formatMessage({
1055
+ id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1056
+ defaultMessage: "Group by"
1057
+ }),
1111
1058
  customizeContent: (value) => formatMessage(
1112
1059
  {
1113
1060
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1131,13 +1078,57 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1131
1078
  ...item,
1132
1079
  id: Number(item.entry.id)
1133
1080
  })),
1134
- headers,
1135
- isLoading: isLoading || isFetching,
1081
+ colCount: releaseActions[key].length,
1082
+ isLoading,
1083
+ isFetching,
1136
1084
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1137
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1138
- /* @__PURE__ */ jsx(Table.Loading, {}),
1085
+ /* @__PURE__ */ jsxs(Table.Head, { children: [
1086
+ displayedHeaders.map(({ key: key2, fieldSchema, metadatas, name }) => /* @__PURE__ */ jsx(
1087
+ Table.HeaderCell,
1088
+ {
1089
+ fieldSchemaType: fieldSchema.type,
1090
+ label: formatMessage(metadatas.label),
1091
+ name
1092
+ },
1093
+ key2
1094
+ )),
1095
+ /* @__PURE__ */ jsx(
1096
+ Table.HeaderCell,
1097
+ {
1098
+ fieldSchemaType: "string",
1099
+ label: formatMessage({
1100
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1101
+ defaultMessage: "content-type"
1102
+ }),
1103
+ name: "content-type"
1104
+ }
1105
+ ),
1106
+ /* @__PURE__ */ jsx(
1107
+ Table.HeaderCell,
1108
+ {
1109
+ fieldSchemaType: "string",
1110
+ label: formatMessage({
1111
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1112
+ defaultMessage: "action"
1113
+ }),
1114
+ name: "action"
1115
+ }
1116
+ ),
1117
+ !release.releasedAt && /* @__PURE__ */ jsx(
1118
+ Table.HeaderCell,
1119
+ {
1120
+ fieldSchemaType: "string",
1121
+ label: formatMessage({
1122
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1123
+ defaultMessage: "status"
1124
+ }),
1125
+ name: "status"
1126
+ }
1127
+ )
1128
+ ] }),
1129
+ /* @__PURE__ */ jsx(Table.LoadingBody, {}),
1139
1130
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1140
- ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1131
+ ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1141
1132
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1142
1133
  hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1143
1134
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
@@ -1166,8 +1157,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1166
1157
  action: type,
1167
1158
  schema: contentTypes?.[contentType.uid],
1168
1159
  components,
1169
- entry,
1170
- status
1160
+ entry
1171
1161
  }
1172
1162
  ) }),
1173
1163
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1175,7 +1165,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1175
1165
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1176
1166
  {
1177
1167
  contentTypeUid: contentType.uid,
1178
- documentId: entry.documentId,
1168
+ entryId: entry.id,
1179
1169
  locale: locale?.code
1180
1170
  }
1181
1171
  ),
@@ -1194,73 +1184,54 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1194
1184
  }
1195
1185
  )
1196
1186
  ] }, `releases-group-${key}`)),
1197
- /* @__PURE__ */ jsxs(
1198
- Pagination.Root,
1199
- {
1200
- ...releaseMeta?.pagination,
1201
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1202
- children: [
1203
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1204
- /* @__PURE__ */ jsx(Pagination.Links, {})
1205
- ]
1206
- }
1207
- )
1187
+ /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1188
+ /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1189
+ /* @__PURE__ */ jsx(
1190
+ PaginationURLQuery,
1191
+ {
1192
+ pagination: {
1193
+ pageCount: releaseMeta?.pagination?.pageCount || 0
1194
+ }
1195
+ }
1196
+ )
1197
+ ] })
1208
1198
  ] }) });
1209
1199
  };
1210
1200
  const ReleaseDetailsPage = () => {
1211
1201
  const { formatMessage } = useIntl();
1212
1202
  const { releaseId } = useParams();
1213
- const { toggleNotification } = useNotification();
1203
+ const toggleNotification = useNotification();
1214
1204
  const { formatAPIError } = useAPIErrorHandler();
1215
- const navigate = useNavigate();
1205
+ const { replace } = useHistory();
1216
1206
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1217
1207
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1218
1208
  const {
1219
1209
  isLoading: isLoadingDetails,
1220
1210
  data,
1221
1211
  isSuccess: isSuccessDetails
1222
- } = useGetReleaseQuery(
1223
- { id: releaseId },
1224
- {
1225
- skip: !releaseId
1226
- }
1227
- );
1228
- const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1212
+ } = useGetReleaseQuery({ id: releaseId });
1229
1213
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1230
- const [deleteRelease] = useDeleteReleaseMutation();
1214
+ const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1231
1215
  const toggleEditReleaseModal = () => {
1232
1216
  setReleaseModalShown((prev) => !prev);
1233
1217
  };
1234
- const getTimezoneValue = () => {
1235
- if (releaseData?.timezone) {
1236
- return releaseData.timezone;
1237
- } else {
1238
- if (dataTimezone?.data.defaultTimezone) {
1239
- return dataTimezone.data.defaultTimezone;
1240
- }
1241
- return null;
1242
- }
1243
- };
1244
1218
  const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1245
- if (isLoadingDetails || isLoadingTimezone) {
1219
+ if (isLoadingDetails) {
1246
1220
  return /* @__PURE__ */ jsx(
1247
1221
  ReleaseDetailsLayout,
1248
1222
  {
1249
1223
  toggleEditReleaseModal,
1250
1224
  toggleWarningSubmit,
1251
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1225
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1252
1226
  }
1253
1227
  );
1254
1228
  }
1255
- if (!releaseId) {
1256
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1257
- }
1258
1229
  const releaseData = isSuccessDetails && data?.data || null;
1259
1230
  const title = releaseData?.name || "";
1260
- const timezone = getTimezoneValue();
1231
+ const timezone = releaseData?.timezone ?? null;
1261
1232
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1262
- const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1263
- const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1233
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1234
+ const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1264
1235
  const handleEditRelease = async (values) => {
1265
1236
  const response = await updateRelease({
1266
1237
  id: releaseId,
@@ -1277,14 +1248,14 @@ const ReleaseDetailsPage = () => {
1277
1248
  })
1278
1249
  });
1279
1250
  toggleEditReleaseModal();
1280
- } else if (isFetchError(response.error)) {
1251
+ } else if (isAxiosError(response.error)) {
1281
1252
  toggleNotification({
1282
- type: "danger",
1253
+ type: "warning",
1283
1254
  message: formatAPIError(response.error)
1284
1255
  });
1285
1256
  } else {
1286
1257
  toggleNotification({
1287
- type: "danger",
1258
+ type: "warning",
1288
1259
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1289
1260
  });
1290
1261
  }
@@ -1294,15 +1265,15 @@ const ReleaseDetailsPage = () => {
1294
1265
  id: releaseId
1295
1266
  });
1296
1267
  if ("data" in response) {
1297
- navigate("..");
1298
- } else if (isFetchError(response.error)) {
1268
+ replace("/plugins/content-releases");
1269
+ } else if (isAxiosError(response.error)) {
1299
1270
  toggleNotification({
1300
- type: "danger",
1271
+ type: "warning",
1301
1272
  message: formatAPIError(response.error)
1302
1273
  });
1303
1274
  } else {
1304
1275
  toggleNotification({
1305
- type: "danger",
1276
+ type: "warning",
1306
1277
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1307
1278
  });
1308
1279
  }
@@ -1313,11 +1284,10 @@ const ReleaseDetailsPage = () => {
1313
1284
  toggleEditReleaseModal,
1314
1285
  toggleWarningSubmit,
1315
1286
  children: [
1316
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1317
- /* @__PURE__ */ jsx(
1287
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1288
+ releaseModalShown && /* @__PURE__ */ jsx(
1318
1289
  ReleaseModal,
1319
1290
  {
1320
- open: releaseModalShown,
1321
1291
  handleClose: toggleEditReleaseModal,
1322
1292
  handleSubmit: handleEditRelease,
1323
1293
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1331,21 +1301,30 @@ const ReleaseDetailsPage = () => {
1331
1301
  }
1332
1302
  }
1333
1303
  ),
1334
- /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1335
- id: "content-releases.dialog.confirmation-message",
1336
- defaultMessage: "Are you sure you want to delete this release?"
1337
- }) }) })
1304
+ /* @__PURE__ */ jsx(
1305
+ ConfirmDialog,
1306
+ {
1307
+ bodyText: {
1308
+ id: "content-releases.dialog.confirmation-message",
1309
+ defaultMessage: "Are you sure you want to delete this release?"
1310
+ },
1311
+ isOpen: showWarningSubmit,
1312
+ isConfirmButtonLoading: isDeletingRelease,
1313
+ onToggleDialog: toggleWarningSubmit,
1314
+ onConfirm: handleDeleteRelease
1315
+ }
1316
+ )
1338
1317
  ]
1339
1318
  }
1340
1319
  );
1341
1320
  };
1342
1321
  const App = () => {
1343
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1344
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1345
- /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1322
+ return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1323
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1324
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1346
1325
  ] }) });
1347
1326
  };
1348
1327
  export {
1349
1328
  App
1350
1329
  };
1351
- //# sourceMappingURL=App-CZe9wueI.mjs.map
1330
+ //# sourceMappingURL=App-jrh58sXY.mjs.map