@strapi/content-releases 0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d → 0.0.0-experimental.d9f9f725e07a329ca272ecedef7bd85fa74dd661

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 (111) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-CqbuK4M6.js → App-dLXY5ei3.js} +439 -431
  3. package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
  4. package/dist/_chunks/{App-Do-Rnv0A.mjs → App-jrh58sXY.mjs} +416 -409
  5. package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
  6. package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +7 -8
  7. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  8. package/dist/_chunks/{PurchaseContentReleases-Be3acS2L.js → PurchaseContentReleases-bpIYXOfu.js} +6 -7
  9. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  10. package/dist/_chunks/{en-DtFJ5ViE.js → en-HrREghh3.js} +1 -1
  11. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  12. package/dist/_chunks/{en-B9Ur3VsE.mjs → en-ltT1TlKQ.mjs} +1 -1
  13. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  14. package/dist/_chunks/{index-Tedsw4GC.js → index-CVO0Rqdm.js} +504 -197
  15. package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
  16. package/dist/_chunks/{index-D_pgdqQL.mjs → index-PiOGBETy.mjs} +503 -198
  17. package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
  18. package/dist/admin/index.js +15 -1
  19. package/dist/admin/index.js.map +1 -1
  20. package/dist/admin/index.mjs +16 -2
  21. package/dist/admin/index.mjs.map +1 -1
  22. package/dist/server/index.js +86 -83
  23. package/dist/server/index.js.map +1 -1
  24. package/dist/server/index.mjs +86 -84
  25. package/dist/server/index.mjs.map +1 -1
  26. package/package.json +36 -29
  27. package/dist/_chunks/App-CqbuK4M6.js.map +0 -1
  28. package/dist/_chunks/App-Do-Rnv0A.mjs.map +0 -1
  29. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  30. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
  31. package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
  32. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  33. package/dist/_chunks/index-D_pgdqQL.mjs.map +0 -1
  34. package/dist/_chunks/index-Tedsw4GC.js.map +0 -1
  35. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -22
  36. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  37. package/dist/admin/src/components/ReleaseAction.d.ts +0 -3
  38. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  39. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  40. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  41. package/dist/admin/src/components/ReleaseModal.d.ts +0 -17
  42. package/dist/admin/src/constants.d.ts +0 -58
  43. package/dist/admin/src/index.d.ts +0 -3
  44. package/dist/admin/src/pages/App.d.ts +0 -1
  45. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  46. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  47. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  48. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  49. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  50. package/dist/admin/src/pluginId.d.ts +0 -1
  51. package/dist/admin/src/services/release.d.ts +0 -105
  52. package/dist/admin/src/store/hooks.d.ts +0 -7
  53. package/dist/admin/src/utils/api.d.ts +0 -6
  54. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
  55. package/dist/admin/src/utils/time.d.ts +0 -1
  56. package/dist/server/src/bootstrap.d.ts +0 -5
  57. package/dist/server/src/bootstrap.d.ts.map +0 -1
  58. package/dist/server/src/constants.d.ts +0 -12
  59. package/dist/server/src/constants.d.ts.map +0 -1
  60. package/dist/server/src/content-types/index.d.ts +0 -99
  61. package/dist/server/src/content-types/index.d.ts.map +0 -1
  62. package/dist/server/src/content-types/release/index.d.ts +0 -48
  63. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  64. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  65. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  66. package/dist/server/src/content-types/release-action/index.d.ts +0 -50
  67. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  68. package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
  69. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  70. package/dist/server/src/controllers/index.d.ts +0 -20
  71. package/dist/server/src/controllers/index.d.ts.map +0 -1
  72. package/dist/server/src/controllers/release-action.d.ts +0 -10
  73. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  74. package/dist/server/src/controllers/release.d.ts +0 -12
  75. package/dist/server/src/controllers/release.d.ts.map +0 -1
  76. package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
  77. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  78. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  79. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  80. package/dist/server/src/destroy.d.ts +0 -5
  81. package/dist/server/src/destroy.d.ts.map +0 -1
  82. package/dist/server/src/index.d.ts +0 -2096
  83. package/dist/server/src/index.d.ts.map +0 -1
  84. package/dist/server/src/migrations/index.d.ts +0 -13
  85. package/dist/server/src/migrations/index.d.ts.map +0 -1
  86. package/dist/server/src/register.d.ts +0 -5
  87. package/dist/server/src/register.d.ts.map +0 -1
  88. package/dist/server/src/routes/index.d.ts +0 -35
  89. package/dist/server/src/routes/index.d.ts.map +0 -1
  90. package/dist/server/src/routes/release-action.d.ts +0 -18
  91. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  92. package/dist/server/src/routes/release.d.ts +0 -18
  93. package/dist/server/src/routes/release.d.ts.map +0 -1
  94. package/dist/server/src/services/index.d.ts +0 -1826
  95. package/dist/server/src/services/index.d.ts.map +0 -1
  96. package/dist/server/src/services/release.d.ts +0 -66
  97. package/dist/server/src/services/release.d.ts.map +0 -1
  98. package/dist/server/src/services/scheduling.d.ts +0 -18
  99. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  100. package/dist/server/src/services/validation.d.ts +0 -18
  101. package/dist/server/src/services/validation.d.ts.map +0 -1
  102. package/dist/server/src/utils/index.d.ts +0 -14
  103. package/dist/server/src/utils/index.d.ts.map +0 -1
  104. package/dist/shared/contracts/release-actions.d.ts +0 -131
  105. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  106. package/dist/shared/contracts/releases.d.ts +0 -182
  107. package/dist/shared/contracts/releases.d.ts.map +0 -1
  108. package/dist/shared/types.d.ts +0 -24
  109. package/dist/shared/types.d.ts.map +0 -1
  110. package/dist/shared/validation-schemas.d.ts +0 -2
  111. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -1,51 +1,23 @@
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 getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, i as ReleaseActionMenu, r as releaseApi } from "./index-D_pgdqQL.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, Menu, Dialog, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
- import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
9
- import { EmptyDocuments } from "@strapi/icons/symbols";
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
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 } from "date-fns";
13
+ import styled from "styled-components";
14
+ import { formatISO } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
16
  import * as yup from "yup";
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
- );
17
+ import "@reduxjs/toolkit/query";
18
+ import "axios";
19
+ import "@reduxjs/toolkit/query/react";
20
+ import "react-redux";
49
21
  const RELEASE_SCHEMA = yup.object().shape({
50
22
  name: yup.string().trim().required(),
51
23
  scheduledAt: yup.string().nullable(),
@@ -68,7 +40,6 @@ const RELEASE_SCHEMA = yup.object().shape({
68
40
  }).required().noUnknown();
69
41
  const ReleaseModal = ({
70
42
  handleClose,
71
- open,
72
43
  handleSubmit,
73
44
  initialValues,
74
45
  isLoading = false
@@ -92,8 +63,8 @@ const ReleaseModal = ({
92
63
  );
93
64
  return currentTimezone?.value || systemTimezone.value;
94
65
  };
95
- return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
96
- /* @__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(
97
68
  {
98
69
  id: "content-releases.modal.title",
99
70
  defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
@@ -116,119 +87,123 @@ const ReleaseModal = ({
116
87
  },
117
88
  validationSchema: RELEASE_SCHEMA,
118
89
  validateOnChange: false,
119
- children: ({ values, errors, handleChange, setFieldValue }) => {
120
- return /* @__PURE__ */ jsxs(Form, { children: [
121
- /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
122
- /* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
123
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
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({
124
96
  id: "content-releases.modal.form.input.label.release-name",
125
97
  defaultMessage: "Name"
126
- }) }),
127
- /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
128
- /* @__PURE__ */ jsx(Field.Error, {})
129
- ] }),
130
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
131
- Checkbox,
132
- {
133
- name: "isScheduled",
134
- checked: values.isScheduled,
135
- onCheckedChange: (checked) => {
136
- setFieldValue("isScheduled", checked);
137
- if (!checked) {
138
- setFieldValue("date", null);
139
- setFieldValue("time", "");
140
- setFieldValue("timezone", null);
141
- } else {
142
- setFieldValue("date", initialValues.date);
143
- setFieldValue("time", initialValues.time);
144
- setFieldValue(
145
- "timezone",
146
- initialValues.timezone ?? systemTimezone?.value
147
- );
148
- }
149
- },
150
- children: /* @__PURE__ */ jsx(
151
- Typography,
152
- {
153
- textColor: values.isScheduled ? "primary600" : "neutral800",
154
- fontWeight: values.isScheduled ? "semiBold" : "regular",
155
- children: formatMessage({
156
- id: "modal.form.input.label.schedule-release",
157
- defaultMessage: "Schedule release"
158
- })
159
- }
160
- )
161
- }
162
- ) }),
163
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
164
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
165
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
166
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
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({
167
142
  id: "content-releases.modal.form.input.label.date",
168
143
  defaultMessage: "Date"
169
- }) }),
170
- /* @__PURE__ */ jsx(
171
- DatePicker,
172
- {
173
- onChange: (date) => {
174
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
175
- setFieldValue("date", isoFormatDate);
176
- },
177
- clearLabel: formatMessage({
178
- id: "content-releases.modal.form.input.clearLabel",
179
- defaultMessage: "Clear"
180
- }),
181
- onClear: () => {
182
- setFieldValue("date", null);
183
- },
184
- value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
185
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
186
- }
187
- ),
188
- /* @__PURE__ */ jsx(Field.Error, {})
189
- ] }) }),
190
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
191
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
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: () => {
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({
192
167
  id: "content-releases.modal.form.input.label.time",
193
168
  defaultMessage: "Time"
194
- }) }),
195
- /* @__PURE__ */ jsx(
196
- TimePicker,
197
- {
198
- onChange: (time) => {
199
- setFieldValue("time", time);
200
- },
201
- clearLabel: formatMessage({
202
- id: "content-releases.modal.form.input.clearLabel",
203
- defaultMessage: "Clear"
204
- }),
205
- onClear: () => {
206
- setFieldValue("time", "");
207
- },
208
- value: values.time || void 0
209
- }
210
- ),
211
- /* @__PURE__ */ jsx(Field.Error, {})
212
- ] }) })
213
- ] }),
214
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
215
- ] })
216
- ] }) }),
217
- /* @__PURE__ */ jsxs(Modal.Footer, { children: [
218
- /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
219
- /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
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: () => {
180
+ setFieldValue("time", "");
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(
220
195
  {
221
196
  id: "content-releases.modal.form.button.submit",
222
197
  defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
223
198
  },
224
199
  { isCreatingRelease }
225
200
  ) })
226
- ] })
227
- ] });
228
- }
201
+ }
202
+ )
203
+ ] })
229
204
  }
230
205
  )
231
- ] }) });
206
+ ] });
232
207
  };
233
208
  const getTimezones = (selectedDate) => {
234
209
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
@@ -254,35 +229,31 @@ const TimezoneComponent = ({ timezoneOptions }) => {
254
229
  }
255
230
  }
256
231
  }, [setFieldValue, values.date, values.timezone]);
257
- return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, 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
- ] });
282
- };
283
- const useTypedDispatch = useDispatch;
284
- const isBaseQueryError = (error) => {
285
- return typeof error !== "undefined" && error.name !== void 0;
232
+ return /* @__PURE__ */ jsx(
233
+ Combobox,
234
+ {
235
+ label: formatMessage({
236
+ id: "content-releases.modal.form.input.label.timezone",
237
+ defaultMessage: "Timezone"
238
+ }),
239
+ autocomplete: { type: "list", filter: "contains" },
240
+ name: "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,
253
+ required: true,
254
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
255
+ }
256
+ );
286
257
  };
287
258
  const LinkCard = styled(Link)`
288
259
  display: block;
@@ -321,7 +292,7 @@ const getBadgeProps = (status) => {
321
292
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
322
293
  const { formatMessage } = useIntl();
323
294
  if (isError) {
324
- return /* @__PURE__ */ jsx(Page.Error, {});
295
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
325
296
  }
326
297
  if (releases?.length === 0) {
327
298
  return /* @__PURE__ */ jsx(
@@ -336,11 +307,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
336
307
  target: sectionTitle
337
308
  }
338
309
  ),
339
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
310
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
340
311
  }
341
312
  );
342
313
  }
343
- 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(
344
315
  Flex,
345
316
  {
346
317
  direction: "column",
@@ -355,7 +326,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
355
326
  gap: 4,
356
327
  children: [
357
328
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
358
- /* @__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 }),
359
330
  /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
360
331
  id: "content-releases.pages.Releases.not-scheduled",
361
332
  defaultMessage: "Not scheduled"
@@ -376,18 +347,19 @@ const StyledAlert = styled(Alert)`
376
347
  `;
377
348
  const INITIAL_FORM_VALUES = {
378
349
  name: "",
379
- date: void 0,
350
+ date: null,
380
351
  time: "",
381
352
  isScheduled: true,
382
353
  scheduledAt: null,
383
354
  timezone: null
384
355
  };
385
356
  const ReleasesPage = () => {
357
+ const tabRef = React.useRef(null);
386
358
  const location = useLocation();
387
359
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
388
- const { toggleNotification } = useNotification();
360
+ const toggleNotification = useNotification();
389
361
  const { formatMessage } = useIntl();
390
- const navigate = useNavigate();
362
+ const { push, replace } = useHistory();
391
363
  const { formatAPIError } = useAPIErrorHandler();
392
364
  const [{ query }, setQuery] = useQueryParams();
393
365
  const response = useGetReleasesQuery(query);
@@ -395,15 +367,13 @@ const ReleasesPage = () => {
395
367
  const { getFeature } = useLicenseLimits();
396
368
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
397
369
  const { trackUsage } = useTracking();
398
- const {
399
- allowedActions: { canCreate }
400
- } = useRBAC(PERMISSIONS);
401
370
  const { isLoading, isSuccess, isError } = response;
402
371
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
372
+ const activeTabIndex = ["pending", "done"].indexOf(activeTab);
403
373
  React.useEffect(() => {
404
374
  if (location?.state?.errors) {
405
375
  toggleNotification({
406
- type: "danger",
376
+ type: "warning",
407
377
  title: formatMessage({
408
378
  id: "content-releases.pages.Releases.notification.error.title",
409
379
  defaultMessage: "Your request could not be processed."
@@ -413,25 +383,30 @@ const ReleasesPage = () => {
413
383
  defaultMessage: "Please try again or open another release."
414
384
  })
415
385
  });
416
- 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);
417
392
  }
418
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
393
+ }, [activeTabIndex]);
419
394
  const toggleAddReleaseModal = () => {
420
395
  setReleaseModalShown((prev) => !prev);
421
396
  };
422
397
  if (isLoading) {
423
- return /* @__PURE__ */ jsx(Page.Loading, {});
398
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
424
399
  }
425
400
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
426
401
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
427
- const handleTabChange = (tabValue) => {
402
+ const handleTabChange = (index) => {
428
403
  setQuery({
429
404
  ...query,
430
405
  page: 1,
431
406
  pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
432
407
  filters: {
433
408
  releasedAt: {
434
- $notNull: tabValue === "pending"
409
+ $notNull: index === 0 ? false : true
435
410
  }
436
411
  }
437
412
  });
@@ -451,22 +426,22 @@ const ReleasesPage = () => {
451
426
  })
452
427
  });
453
428
  trackUsage("didCreateRelease");
454
- navigate(response2.data.data.id.toString());
455
- } else if (isFetchError(response2.error)) {
429
+ push(`/plugins/content-releases/${response2.data.data.id}`);
430
+ } else if (isAxiosError(response2.error)) {
456
431
  toggleNotification({
457
- type: "danger",
432
+ type: "warning",
458
433
  message: formatAPIError(response2.error)
459
434
  });
460
435
  } else {
461
436
  toggleNotification({
462
- type: "danger",
437
+ type: "warning",
463
438
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
464
439
  });
465
440
  }
466
441
  };
467
442
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
468
443
  /* @__PURE__ */ jsx(
469
- Layouts.Header,
444
+ HeaderLayout,
470
445
  {
471
446
  title: formatMessage({
472
447
  id: "content-releases.pages.Releases.title",
@@ -476,7 +451,7 @@ const ReleasesPage = () => {
476
451
  id: "content-releases.pages.Releases.header-subtitle",
477
452
  defaultMessage: "Create and manage content updates"
478
453
  }),
479
- primaryAction: canCreate ? /* @__PURE__ */ jsx(
454
+ primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
480
455
  Button,
481
456
  {
482
457
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -487,10 +462,10 @@ const ReleasesPage = () => {
487
462
  defaultMessage: "New release"
488
463
  })
489
464
  }
490
- ) : null
465
+ ) })
491
466
  }
492
467
  ),
493
- /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
468
+ /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
494
469
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
495
470
  StyledAlert,
496
471
  {
@@ -515,17 +490,21 @@ const ReleasesPage = () => {
515
490
  })
516
491
  }
517
492
  ),
518
- /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
519
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
520
- /* @__PURE__ */ jsxs(
521
- Tabs.List,
522
- {
523
- "aria-label": formatMessage({
524
- id: "content-releases.pages.Releases.tab-group.label",
525
- defaultMessage: "Releases list"
526
- }),
527
- children: [
528
- /* @__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(
529
508
  {
530
509
  id: "content-releases.pages.Releases.tab.pending",
531
510
  defaultMessage: "Pending ({count})"
@@ -534,48 +513,55 @@ const ReleasesPage = () => {
534
513
  count: totalPendingReleases
535
514
  }
536
515
  ) }),
537
- /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
516
+ /* @__PURE__ */ jsx(Tab, { children: formatMessage({
538
517
  id: "content-releases.pages.Releases.tab.done",
539
518
  defaultMessage: "Done"
540
519
  }) })
541
- ]
542
- }
543
- ),
544
- /* @__PURE__ */ jsx(Divider, {})
545
- ] }),
546
- /* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
547
- 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,
548
547
  {
549
- sectionTitle: "pending",
550
- releases: response?.currentData?.data,
551
- isError
548
+ options: ["8", "16", "32", "64"],
549
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
552
550
  }
553
- ) }),
554
- /* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
555
- ReleasesGrid,
551
+ ),
552
+ /* @__PURE__ */ jsx(
553
+ PaginationURLQuery,
556
554
  {
557
- sectionTitle: "done",
558
- releases: response?.currentData?.data,
559
- isError
555
+ pagination: {
556
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
557
+ }
560
558
  }
561
- ) })
562
- ] }),
563
- /* @__PURE__ */ jsxs(
564
- Pagination.Root,
565
- {
566
- ...response?.currentData?.meta?.pagination,
567
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
568
- children: [
569
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
570
- /* @__PURE__ */ jsx(Pagination.Links, {})
571
- ]
572
- }
573
- )
559
+ )
560
+ ] }) : null
574
561
  ] }) }),
575
- /* @__PURE__ */ jsx(
562
+ releaseModalShown && /* @__PURE__ */ jsx(
576
563
  ReleaseModal,
577
564
  {
578
- open: releaseModalShown,
579
565
  handleClose: toggleAddReleaseModal,
580
566
  handleSubmit: handleAddRelease,
581
567
  isLoading: isSubmittingForm,
@@ -599,7 +585,7 @@ const StyledMenuItem = styled(Menu.Item)`
599
585
  }
600
586
 
601
587
  &:hover {
602
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
588
+ background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
603
589
  }
604
590
  `;
605
591
  const PencilIcon = styled(Pencil)`
@@ -619,34 +605,29 @@ const TrashIcon = styled(Trash)`
619
605
  const TypographyMaxWidth = styled(Typography)`
620
606
  max-width: 300px;
621
607
  `;
622
- const EntryValidationText = ({ action, schema, entry }) => {
608
+ const EntryValidationText = ({ action, schema, components, entry }) => {
623
609
  const { formatMessage } = useIntl();
624
- const { validate } = unstable_useDocument(
625
- {
626
- collectionType: schema?.kind ?? "",
627
- model: schema?.uid ?? ""
628
- },
629
- {
630
- skip: !schema
631
- }
632
- );
633
- const errors = validate(entry) ?? {};
610
+ const { validate } = unstable_useDocument();
611
+ const { errors } = validate(entry, {
612
+ contentType: schema,
613
+ components,
614
+ isCreatingEntry: false
615
+ });
634
616
  if (Object.keys(errors).length > 0) {
635
617
  const validationErrorsMessages = Object.entries(errors).map(
636
618
  ([key, value]) => formatMessage(
637
- // @ts-expect-error – TODO: fix this will better checks
638
619
  { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
639
620
  { field: key }
640
621
  )
641
622
  ).join(" ");
642
623
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
643
- /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
624
+ /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
644
625
  /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
645
626
  ] });
646
627
  }
647
628
  if (action == "publish") {
648
629
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
649
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
630
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
650
631
  entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
651
632
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
652
633
  defaultMessage: "Already published"
@@ -657,7 +638,7 @@ const EntryValidationText = ({ action, schema, entry }) => {
657
638
  ] });
658
639
  }
659
640
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
660
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
641
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
661
642
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
662
643
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
663
644
  defaultMessage: "Already unpublished"
@@ -677,23 +658,20 @@ const ReleaseDetailsLayout = ({
677
658
  const {
678
659
  data,
679
660
  isLoading: isLoadingDetails,
661
+ isError,
680
662
  error
681
- } = useGetReleaseQuery(
682
- { id: releaseId },
683
- {
684
- skip: !releaseId
685
- }
686
- );
663
+ } = useGetReleaseQuery({ id: releaseId });
687
664
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
688
- const { toggleNotification } = useNotification();
665
+ const toggleNotification = useNotification();
689
666
  const { formatAPIError } = useAPIErrorHandler();
690
- const { allowedActions } = useRBAC(PERMISSIONS);
691
- const { canUpdate, canDelete, canPublish } = allowedActions;
667
+ const {
668
+ allowedActions: { canUpdate, canDelete }
669
+ } = useRBAC(PERMISSIONS);
692
670
  const dispatch = useTypedDispatch();
693
671
  const { trackUsage } = useTracking();
694
672
  const release = data?.data;
695
- const handlePublishRelease = (id) => async () => {
696
- const response = await publishRelease({ id });
673
+ const handlePublishRelease = async () => {
674
+ const response = await publishRelease({ id: releaseId });
697
675
  if ("data" in response) {
698
676
  toggleNotification({
699
677
  type: "success",
@@ -708,14 +686,14 @@ const ReleaseDetailsLayout = ({
708
686
  totalPublishedEntries,
709
687
  totalUnpublishedEntries
710
688
  });
711
- } else if (isFetchError(response.error)) {
689
+ } else if (isAxiosError(response.error)) {
712
690
  toggleNotification({
713
- type: "danger",
691
+ type: "warning",
714
692
  message: formatAPIError(response.error)
715
693
  });
716
694
  } else {
717
695
  toggleNotification({
718
- type: "danger",
696
+ type: "warning",
719
697
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
720
698
  });
721
699
  }
@@ -741,20 +719,21 @@ const ReleaseDetailsLayout = ({
741
719
  return release.createdBy.email;
742
720
  };
743
721
  if (isLoadingDetails) {
744
- return /* @__PURE__ */ jsx(Page.Loading, {});
722
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
745
723
  }
746
- if (isBaseQueryError(error) && "code" in error || !release) {
724
+ if (isError || !release) {
747
725
  return /* @__PURE__ */ jsx(
748
- Navigate,
726
+ Redirect,
749
727
  {
750
- to: "..",
751
- state: {
752
- errors: [
753
- {
754
- // @ts-expect-error – TODO: fix this weird error flow
755
- code: error?.code
756
- }
757
- ]
728
+ to: {
729
+ pathname: "/plugins/content-releases",
730
+ state: {
731
+ errors: [
732
+ {
733
+ code: error?.code
734
+ }
735
+ ]
736
+ }
758
737
  }
759
738
  }
760
739
  );
@@ -791,30 +770,34 @@ const ReleaseDetailsLayout = ({
791
770
  ) : "";
792
771
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
793
772
  /* @__PURE__ */ jsx(
794
- Layouts.Header,
773
+ HeaderLayout,
795
774
  {
796
775
  title: release.name,
797
776
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
798
777
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
799
778
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
800
779
  ] }),
801
- 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
+ }) }),
802
784
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
803
785
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
804
786
  /* @__PURE__ */ jsx(
805
787
  Menu.Trigger,
806
788
  {
789
+ as: IconButton,
807
790
  paddingLeft: 2,
808
791
  paddingRight: 2,
809
792
  "aria-label": formatMessage({
810
793
  id: "content-releases.header.actions.open-release-actions",
811
794
  defaultMessage: "Release edit and delete menu"
812
795
  }),
813
- variant: "tertiary",
814
- children: /* @__PURE__ */ jsx(More, {})
796
+ icon: /* @__PURE__ */ jsx(More, {}),
797
+ variant: "tertiary"
815
798
  }
816
799
  ),
817
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
800
+ /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
818
801
  /* @__PURE__ */ jsxs(
819
802
  Flex,
820
803
  {
@@ -836,7 +819,7 @@ const ReleaseDetailsLayout = ({
836
819
  {
837
820
  disabled: !canDelete,
838
821
  onSelect: toggleWarningSubmit,
839
- $variant: "danger",
822
+ variant: "danger",
840
823
  children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
841
824
  /* @__PURE__ */ jsx(TrashIcon, {}),
842
825
  /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
@@ -881,12 +864,12 @@ const ReleaseDetailsLayout = ({
881
864
  id: "content-releases.header.actions.refresh",
882
865
  defaultMessage: "Refresh"
883
866
  }) }),
884
- canPublish ? /* @__PURE__ */ jsx(
867
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
885
868
  Button,
886
869
  {
887
870
  size: "S",
888
871
  variant: "default",
889
- onClick: handlePublishRelease(release.id.toString()),
872
+ onClick: handlePublishRelease,
890
873
  loading: isPublishing,
891
874
  disabled: release.actions.meta.count === 0,
892
875
  children: formatMessage({
@@ -894,7 +877,7 @@ const ReleaseDetailsLayout = ({
894
877
  defaultMessage: "Publish"
895
878
  })
896
879
  }
897
- ) : null
880
+ ) })
898
881
  ] })
899
882
  }
900
883
  ),
@@ -921,30 +904,44 @@ const getGroupByOptionLabel = (value) => {
921
904
  defaultMessage: "Content-Types"
922
905
  };
923
906
  };
924
- 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 = () => {
925
923
  const { formatMessage } = useIntl();
924
+ const { releaseId } = useParams();
926
925
  const [{ query }, setQuery] = useQueryParams();
927
- const { toggleNotification } = useNotification();
926
+ const toggleNotification = useNotification();
928
927
  const { formatAPIError } = useAPIErrorHandler();
929
928
  const {
930
929
  data: releaseData,
931
930
  isLoading: isReleaseLoading,
931
+ isError: isReleaseError,
932
932
  error: releaseError
933
933
  } = useGetReleaseQuery({ id: releaseId });
934
934
  const {
935
935
  allowedActions: { canUpdate }
936
936
  } = useRBAC(PERMISSIONS);
937
- const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
938
- const { hasI18nEnabled } = runHookWaterfall(
937
+ const { runHookWaterfall } = useStrapiApp();
938
+ const {
939
+ displayedHeaders,
940
+ hasI18nEnabled
941
+ } = runHookWaterfall(
939
942
  "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
940
943
  {
941
- displayedHeaders: {
942
- label: formatMessage({
943
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
944
- defaultMessage: "locale"
945
- }),
946
- name: "locale"
947
- },
944
+ displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
948
945
  hasI18nEnabled: false
949
946
  }
950
947
  );
@@ -976,59 +973,65 @@ const ReleaseDetailsBody = ({ releaseId }) => {
976
973
  // We are passing the action path to found the position in the cache of the action for optimistic updates
977
974
  });
978
975
  if ("error" in response) {
979
- if (isFetchError(response.error)) {
976
+ if (isAxiosError(response.error)) {
980
977
  toggleNotification({
981
- type: "danger",
978
+ type: "warning",
982
979
  message: formatAPIError(response.error)
983
980
  });
984
981
  } else {
985
982
  toggleNotification({
986
- type: "danger",
983
+ type: "warning",
987
984
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
988
985
  });
989
986
  }
990
987
  }
991
988
  };
992
989
  if (isLoading || isReleaseLoading) {
993
- return /* @__PURE__ */ jsx(Page.Loading, {});
990
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
994
991
  }
995
992
  const releaseActions = data?.data;
996
993
  const releaseMeta = data?.meta;
997
994
  const contentTypes = releaseMeta?.contentTypes || {};
998
995
  const components = releaseMeta?.components || {};
999
- if (isBaseQueryError(releaseError) || !release) {
996
+ if (isReleaseError || !release) {
1000
997
  const errorsArray = [];
1001
- if (releaseError && "code" in releaseError) {
998
+ if (releaseError) {
1002
999
  errorsArray.push({
1003
1000
  code: releaseError.code
1004
1001
  });
1005
1002
  }
1006
- if (releaseActionsError && "code" in releaseActionsError) {
1003
+ if (releaseActionsError) {
1007
1004
  errorsArray.push({
1008
1005
  code: releaseActionsError.code
1009
1006
  });
1010
1007
  }
1011
1008
  return /* @__PURE__ */ jsx(
1012
- Navigate,
1009
+ Redirect,
1013
1010
  {
1014
- to: "..",
1015
- state: {
1016
- errors: errorsArray
1011
+ to: {
1012
+ pathname: "/plugins/content-releases",
1013
+ state: {
1014
+ errors: errorsArray
1015
+ }
1017
1016
  }
1018
1017
  }
1019
1018
  );
1020
1019
  }
1021
1020
  if (isError || !releaseActions) {
1022
- return /* @__PURE__ */ jsx(Page.Error, {});
1021
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1023
1022
  }
1024
1023
  if (Object.keys(releaseActions).length === 0) {
1025
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1026
- EmptyStateLayout,
1024
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1025
+ NoContent,
1027
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
+ },
1028
1031
  action: /* @__PURE__ */ jsx(
1029
1032
  LinkButton,
1030
1033
  {
1031
- tag: Link$1,
1034
+ as: Link$2,
1032
1035
  to: {
1033
1036
  pathname: "/content-manager"
1034
1037
  },
@@ -1039,59 +1042,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1039
1042
  defaultMessage: "Open the Content Manager"
1040
1043
  })
1041
1044
  }
1042
- ),
1043
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1044
- content: formatMessage({
1045
- id: "content-releases.pages.Details.tab.emptyEntries",
1046
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1047
- })
1045
+ )
1048
1046
  }
1049
1047
  ) });
1050
1048
  }
1051
- const groupByLabel = formatMessage({
1052
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1053
- defaultMessage: "Group by"
1054
- });
1055
- const headers = [
1056
- // ...displayedHeaders,
1057
- {
1058
- label: formatMessage({
1059
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1060
- defaultMessage: "name"
1061
- }),
1062
- name: "name"
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
1049
  const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1089
- 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: [
1090
1051
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1091
1052
  SingleSelect,
1092
1053
  {
1093
- placeholder: groupByLabel,
1094
- "aria-label": groupByLabel,
1054
+ "aria-label": formatMessage({
1055
+ id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1056
+ defaultMessage: "Group by"
1057
+ }),
1095
1058
  customizeContent: (value) => formatMessage(
1096
1059
  {
1097
1060
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1115,11 +1078,55 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1115
1078
  ...item,
1116
1079
  id: Number(item.entry.id)
1117
1080
  })),
1118
- headers,
1119
- isLoading: isLoading || isFetching,
1081
+ colCount: releaseActions[key].length,
1082
+ isLoading,
1083
+ isFetching,
1120
1084
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1121
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1122
- /* @__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, {}),
1123
1130
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1124
1131
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1125
1132
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1177,39 +1184,34 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1177
1184
  }
1178
1185
  )
1179
1186
  ] }, `releases-group-${key}`)),
1180
- /* @__PURE__ */ jsxs(
1181
- Pagination.Root,
1182
- {
1183
- ...releaseMeta?.pagination,
1184
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1185
- children: [
1186
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1187
- /* @__PURE__ */ jsx(Pagination.Links, {})
1188
- ]
1189
- }
1190
- )
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
+ ] })
1191
1198
  ] }) });
1192
1199
  };
1193
1200
  const ReleaseDetailsPage = () => {
1194
1201
  const { formatMessage } = useIntl();
1195
1202
  const { releaseId } = useParams();
1196
- const { toggleNotification } = useNotification();
1203
+ const toggleNotification = useNotification();
1197
1204
  const { formatAPIError } = useAPIErrorHandler();
1198
- const navigate = useNavigate();
1205
+ const { replace } = useHistory();
1199
1206
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1200
1207
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1201
1208
  const {
1202
1209
  isLoading: isLoadingDetails,
1203
1210
  data,
1204
1211
  isSuccess: isSuccessDetails
1205
- } = useGetReleaseQuery(
1206
- { id: releaseId },
1207
- {
1208
- skip: !releaseId
1209
- }
1210
- );
1212
+ } = useGetReleaseQuery({ id: releaseId });
1211
1213
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1212
- const [deleteRelease] = useDeleteReleaseMutation();
1214
+ const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1213
1215
  const toggleEditReleaseModal = () => {
1214
1216
  setReleaseModalShown((prev) => !prev);
1215
1217
  };
@@ -1220,18 +1222,15 @@ const ReleaseDetailsPage = () => {
1220
1222
  {
1221
1223
  toggleEditReleaseModal,
1222
1224
  toggleWarningSubmit,
1223
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1225
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1224
1226
  }
1225
1227
  );
1226
1228
  }
1227
- if (!releaseId) {
1228
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1229
- }
1230
1229
  const releaseData = isSuccessDetails && data?.data || null;
1231
1230
  const title = releaseData?.name || "";
1232
1231
  const timezone = releaseData?.timezone ?? null;
1233
1232
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1234
- const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
1233
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1235
1234
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1236
1235
  const handleEditRelease = async (values) => {
1237
1236
  const response = await updateRelease({
@@ -1249,14 +1248,14 @@ const ReleaseDetailsPage = () => {
1249
1248
  })
1250
1249
  });
1251
1250
  toggleEditReleaseModal();
1252
- } else if (isFetchError(response.error)) {
1251
+ } else if (isAxiosError(response.error)) {
1253
1252
  toggleNotification({
1254
- type: "danger",
1253
+ type: "warning",
1255
1254
  message: formatAPIError(response.error)
1256
1255
  });
1257
1256
  } else {
1258
1257
  toggleNotification({
1259
- type: "danger",
1258
+ type: "warning",
1260
1259
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1261
1260
  });
1262
1261
  }
@@ -1266,15 +1265,15 @@ const ReleaseDetailsPage = () => {
1266
1265
  id: releaseId
1267
1266
  });
1268
1267
  if ("data" in response) {
1269
- navigate("..");
1270
- } else if (isFetchError(response.error)) {
1268
+ replace("/plugins/content-releases");
1269
+ } else if (isAxiosError(response.error)) {
1271
1270
  toggleNotification({
1272
- type: "danger",
1271
+ type: "warning",
1273
1272
  message: formatAPIError(response.error)
1274
1273
  });
1275
1274
  } else {
1276
1275
  toggleNotification({
1277
- type: "danger",
1276
+ type: "warning",
1278
1277
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1279
1278
  });
1280
1279
  }
@@ -1285,11 +1284,10 @@ const ReleaseDetailsPage = () => {
1285
1284
  toggleEditReleaseModal,
1286
1285
  toggleWarningSubmit,
1287
1286
  children: [
1288
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1289
- /* @__PURE__ */ jsx(
1287
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1288
+ releaseModalShown && /* @__PURE__ */ jsx(
1290
1289
  ReleaseModal,
1291
1290
  {
1292
- open: releaseModalShown,
1293
1291
  handleClose: toggleEditReleaseModal,
1294
1292
  handleSubmit: handleEditRelease,
1295
1293
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1303,21 +1301,30 @@ const ReleaseDetailsPage = () => {
1303
1301
  }
1304
1302
  }
1305
1303
  ),
1306
- /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1307
- id: "content-releases.dialog.confirmation-message",
1308
- defaultMessage: "Are you sure you want to delete this release?"
1309
- }) }) })
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
+ )
1310
1317
  ]
1311
1318
  }
1312
1319
  );
1313
1320
  };
1314
1321
  const App = () => {
1315
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1316
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1317
- /* @__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 })
1318
1325
  ] }) });
1319
1326
  };
1320
1327
  export {
1321
1328
  App
1322
1329
  };
1323
- //# sourceMappingURL=App-Do-Rnv0A.mjs.map
1330
+ //# sourceMappingURL=App-jrh58sXY.mjs.map