@strapi/content-releases 0.0.0-experimental.f75e3c6d67cc47c64ab37479efdbb7b43be50b78 → 0.0.0-experimental.f77206734629a2b88793a7a8abca40388843c656

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 (110) hide show
  1. package/dist/_chunks/{App-DUmziQ17.js → App-HjWtUYmc.js} +388 -401
  2. package/dist/_chunks/App-HjWtUYmc.js.map +1 -0
  3. package/dist/_chunks/{App-D_6Y9N2F.mjs → App-gu1aiP6i.mjs} +364 -378
  4. package/dist/_chunks/App-gu1aiP6i.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-DtFJ5ViE.js → en-HrREghh3.js} +1 -1
  10. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  11. package/dist/_chunks/{en-B9Ur3VsE.mjs → en-ltT1TlKQ.mjs} +1 -1
  12. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  13. package/dist/_chunks/{index-C5Hc767q.js → index-ZNwxYN8H.js} +475 -177
  14. package/dist/_chunks/index-ZNwxYN8H.js.map +1 -0
  15. package/dist/_chunks/{index-BomF0-yY.mjs → index-mvj9PSKd.mjs} +476 -180
  16. package/dist/_chunks/index-mvj9PSKd.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 +86 -83
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +86 -84
  24. package/dist/server/index.mjs.map +1 -1
  25. package/package.json +36 -29
  26. package/dist/_chunks/App-DUmziQ17.js.map +0 -1
  27. package/dist/_chunks/App-D_6Y9N2F.mjs.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/en-B9Ur3VsE.mjs.map +0 -1
  31. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  32. package/dist/_chunks/index-BomF0-yY.mjs.map +0 -1
  33. package/dist/_chunks/index-C5Hc767q.js.map +0 -1
  34. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -22
  35. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  36. package/dist/admin/src/components/ReleaseAction.d.ts +0 -3
  37. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  38. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  39. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  40. package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
  41. package/dist/admin/src/constants.d.ts +0 -58
  42. package/dist/admin/src/index.d.ts +0 -3
  43. package/dist/admin/src/pages/App.d.ts +0 -1
  44. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  45. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  46. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  47. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  48. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  49. package/dist/admin/src/pluginId.d.ts +0 -1
  50. package/dist/admin/src/services/release.d.ts +0 -105
  51. package/dist/admin/src/store/hooks.d.ts +0 -7
  52. package/dist/admin/src/utils/api.d.ts +0 -6
  53. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
  54. package/dist/admin/src/utils/time.d.ts +0 -1
  55. package/dist/server/src/bootstrap.d.ts +0 -5
  56. package/dist/server/src/bootstrap.d.ts.map +0 -1
  57. package/dist/server/src/constants.d.ts +0 -12
  58. package/dist/server/src/constants.d.ts.map +0 -1
  59. package/dist/server/src/content-types/index.d.ts +0 -99
  60. package/dist/server/src/content-types/index.d.ts.map +0 -1
  61. package/dist/server/src/content-types/release/index.d.ts +0 -48
  62. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  63. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  64. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  65. package/dist/server/src/content-types/release-action/index.d.ts +0 -50
  66. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  67. package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
  68. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  69. package/dist/server/src/controllers/index.d.ts +0 -20
  70. package/dist/server/src/controllers/index.d.ts.map +0 -1
  71. package/dist/server/src/controllers/release-action.d.ts +0 -10
  72. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  73. package/dist/server/src/controllers/release.d.ts +0 -12
  74. package/dist/server/src/controllers/release.d.ts.map +0 -1
  75. package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
  76. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  77. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  78. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  79. package/dist/server/src/destroy.d.ts +0 -5
  80. package/dist/server/src/destroy.d.ts.map +0 -1
  81. package/dist/server/src/index.d.ts +0 -2096
  82. package/dist/server/src/index.d.ts.map +0 -1
  83. package/dist/server/src/migrations/index.d.ts +0 -13
  84. package/dist/server/src/migrations/index.d.ts.map +0 -1
  85. package/dist/server/src/register.d.ts +0 -5
  86. package/dist/server/src/register.d.ts.map +0 -1
  87. package/dist/server/src/routes/index.d.ts +0 -35
  88. package/dist/server/src/routes/index.d.ts.map +0 -1
  89. package/dist/server/src/routes/release-action.d.ts +0 -18
  90. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  91. package/dist/server/src/routes/release.d.ts +0 -18
  92. package/dist/server/src/routes/release.d.ts.map +0 -1
  93. package/dist/server/src/services/index.d.ts +0 -1826
  94. package/dist/server/src/services/index.d.ts.map +0 -1
  95. package/dist/server/src/services/release.d.ts +0 -66
  96. package/dist/server/src/services/release.d.ts.map +0 -1
  97. package/dist/server/src/services/scheduling.d.ts +0 -18
  98. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  99. package/dist/server/src/services/validation.d.ts +0 -18
  100. package/dist/server/src/services/validation.d.ts.map +0 -1
  101. package/dist/server/src/utils/index.d.ts +0 -14
  102. package/dist/server/src/utils/index.d.ts.map +0 -1
  103. package/dist/shared/contracts/release-actions.d.ts +0 -131
  104. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  105. package/dist/shared/contracts/releases.d.ts +0 -182
  106. package/dist/shared/contracts/releases.d.ts.map +0 -1
  107. package/dist/shared/types.d.ts +0 -24
  108. package/dist/shared/types.d.ts.map +0 -1
  109. package/dist/shared/validation-schemas.d.ts +0 -2
  110. 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-BomF0-yY.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-mvj9PSKd.mjs";
5
5
  import * as React from "react";
6
- import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
- import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, Field, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Link, Alert, Main, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Menu, 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(),
@@ -115,119 +87,120 @@ const ReleaseModal = ({
115
87
  },
116
88
  validationSchema: RELEASE_SCHEMA,
117
89
  validateOnChange: false,
118
- children: ({ values, errors, handleChange, setFieldValue }) => {
119
- return /* @__PURE__ */ jsxs(Form, { children: [
120
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
121
- /* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
122
- /* @__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({
123
96
  id: "content-releases.modal.form.input.label.release-name",
124
97
  defaultMessage: "Name"
125
- }) }),
126
- /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
127
- /* @__PURE__ */ jsx(Field.Error, {})
128
- ] }),
129
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
130
- Checkbox,
131
- {
132
- name: "isScheduled",
133
- value: values.isScheduled,
134
- onChange: (event) => {
135
- setFieldValue("isScheduled", event.target.checked);
136
- if (!event.target.checked) {
137
- setFieldValue("date", null);
138
- setFieldValue("time", "");
139
- setFieldValue("timezone", null);
140
- } else {
141
- setFieldValue("date", initialValues.date);
142
- setFieldValue("time", initialValues.time);
143
- setFieldValue(
144
- "timezone",
145
- initialValues.timezone ?? systemTimezone?.value
146
- );
147
- }
148
- },
149
- children: /* @__PURE__ */ jsx(
150
- Typography,
151
- {
152
- textColor: values.isScheduled ? "primary600" : "neutral800",
153
- fontWeight: values.isScheduled ? "semiBold" : "regular",
154
- children: formatMessage({
155
- id: "modal.form.input.label.schedule-release",
156
- defaultMessage: "Schedule release"
157
- })
158
- }
159
- )
160
- }
161
- ) }),
162
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
163
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
164
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
165
- /* @__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({
166
142
  id: "content-releases.modal.form.input.label.date",
167
143
  defaultMessage: "Date"
168
- }) }),
169
- /* @__PURE__ */ jsx(
170
- DatePicker,
171
- {
172
- onChange: (date) => {
173
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
174
- setFieldValue("date", isoFormatDate);
175
- },
176
- clearLabel: formatMessage({
177
- id: "content-releases.modal.form.input.clearLabel",
178
- defaultMessage: "Clear"
179
- }),
180
- onClear: () => {
181
- setFieldValue("date", null);
182
- },
183
- value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
184
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
185
- }
186
- ),
187
- /* @__PURE__ */ jsx(Field.Error, {})
188
- ] }) }),
189
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
190
- /* @__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({
191
167
  id: "content-releases.modal.form.input.label.time",
192
168
  defaultMessage: "Time"
193
- }) }),
194
- /* @__PURE__ */ jsx(
195
- TimePicker,
196
- {
197
- onChange: (time) => {
198
- setFieldValue("time", time);
199
- },
200
- clearLabel: formatMessage({
201
- id: "content-releases.modal.form.input.clearLabel",
202
- defaultMessage: "Clear"
203
- }),
204
- onClear: () => {
205
- setFieldValue("time", "");
206
- },
207
- value: values.time || void 0
208
- }
209
- ),
210
- /* @__PURE__ */ jsx(Field.Error, {})
211
- ] }) })
212
- ] }),
213
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
214
- ] })
215
- ] }) }),
216
- /* @__PURE__ */ jsx(
217
- ModalFooter,
218
- {
219
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
220
- endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
221
- {
222
- id: "content-releases.modal.form.button.submit",
223
- defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
224
- },
225
- { isCreatingRelease }
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
+ }
226
185
  ) })
227
- }
228
- )
229
- ] });
230
- }
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(
195
+ {
196
+ id: "content-releases.modal.form.button.submit",
197
+ defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
198
+ },
199
+ { isCreatingRelease }
200
+ ) })
201
+ }
202
+ )
203
+ ] })
231
204
  }
232
205
  )
233
206
  ] });
@@ -256,35 +229,31 @@ const TimezoneComponent = ({ timezoneOptions }) => {
256
229
  }
257
230
  }
258
231
  }, [setFieldValue, values.date, values.timezone]);
259
- return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, children: [
260
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
261
- id: "content-releases.modal.form.input.label.timezone",
262
- defaultMessage: "Timezone"
263
- }) }),
264
- /* @__PURE__ */ jsx(
265
- Combobox,
266
- {
267
- autocomplete: { type: "list", filter: "contains" },
268
- value: values.timezone || void 0,
269
- textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
270
- onChange: (timezone) => {
271
- setFieldValue("timezone", timezone);
272
- },
273
- onTextValueChange: (timezone) => {
274
- setFieldValue("timezone", timezone);
275
- },
276
- onClear: () => {
277
- setFieldValue("timezone", "");
278
- },
279
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
280
- }
281
- ),
282
- /* @__PURE__ */ jsx(Field.Error, {})
283
- ] });
284
- };
285
- const useTypedDispatch = useDispatch;
286
- const isBaseQueryError = (error) => {
287
- 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
+ );
288
257
  };
289
258
  const LinkCard = styled(Link)`
290
259
  display: block;
@@ -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, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { 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, { 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,7 +347,7 @@ const StyledAlert = styled(Alert)`
378
347
  `;
379
348
  const INITIAL_FORM_VALUES = {
380
349
  name: "",
381
- date: void 0,
350
+ date: null,
382
351
  time: "",
383
352
  isScheduled: true,
384
353
  scheduledAt: null,
@@ -388,9 +357,9 @@ const ReleasesPage = () => {
388
357
  const tabRef = React.useRef(null);
389
358
  const location = useLocation();
390
359
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
391
- const { toggleNotification } = useNotification();
360
+ const toggleNotification = useNotification();
392
361
  const { formatMessage } = useIntl();
393
- const navigate = useNavigate();
362
+ const { push, replace } = useHistory();
394
363
  const { formatAPIError } = useAPIErrorHandler();
395
364
  const [{ query }, setQuery] = useQueryParams();
396
365
  const response = useGetReleasesQuery(query);
@@ -398,16 +367,13 @@ const ReleasesPage = () => {
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
370
  const { isLoading, isSuccess, isError } = response;
405
371
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
406
372
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
407
373
  React.useEffect(() => {
408
374
  if (location?.state?.errors) {
409
375
  toggleNotification({
410
- type: "danger",
376
+ type: "warning",
411
377
  title: formatMessage({
412
378
  id: "content-releases.pages.Releases.notification.error.title",
413
379
  defaultMessage: "Your request could not be processed."
@@ -417,9 +383,9 @@ const ReleasesPage = () => {
417
383
  defaultMessage: "Please try again or open another release."
418
384
  })
419
385
  });
420
- navigate("", { replace: true, state: null });
386
+ replace({ state: null });
421
387
  }
422
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
388
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
423
389
  React.useEffect(() => {
424
390
  if (tabRef.current) {
425
391
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -429,7 +395,7 @@ const ReleasesPage = () => {
429
395
  setReleaseModalShown((prev) => !prev);
430
396
  };
431
397
  if (isLoading) {
432
- return /* @__PURE__ */ jsx(Page.Loading, {});
398
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
433
399
  }
434
400
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
435
401
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -460,22 +426,22 @@ const ReleasesPage = () => {
460
426
  })
461
427
  });
462
428
  trackUsage("didCreateRelease");
463
- navigate(response2.data.data.id.toString());
464
- } else if (isFetchError(response2.error)) {
429
+ push(`/plugins/content-releases/${response2.data.data.id}`);
430
+ } else if (isAxiosError(response2.error)) {
465
431
  toggleNotification({
466
- type: "danger",
432
+ type: "warning",
467
433
  message: formatAPIError(response2.error)
468
434
  });
469
435
  } else {
470
436
  toggleNotification({
471
- type: "danger",
437
+ type: "warning",
472
438
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
473
439
  });
474
440
  }
475
441
  };
476
442
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
477
443
  /* @__PURE__ */ jsx(
478
- Layouts.Header,
444
+ HeaderLayout,
479
445
  {
480
446
  title: formatMessage({
481
447
  id: "content-releases.pages.Releases.title",
@@ -485,7 +451,7 @@ const ReleasesPage = () => {
485
451
  id: "content-releases.pages.Releases.header-subtitle",
486
452
  defaultMessage: "Create and manage content updates"
487
453
  }),
488
- primaryAction: canCreate ? /* @__PURE__ */ jsx(
454
+ primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
489
455
  Button,
490
456
  {
491
457
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -496,10 +462,10 @@ const ReleasesPage = () => {
496
462
  defaultMessage: "New release"
497
463
  })
498
464
  }
499
- ) : null
465
+ ) })
500
466
  }
501
467
  ),
502
- /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
468
+ /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
503
469
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
504
470
  StyledAlert,
505
471
  {
@@ -575,17 +541,23 @@ const ReleasesPage = () => {
575
541
  ]
576
542
  }
577
543
  ),
578
- /* @__PURE__ */ jsxs(
579
- Pagination.Root,
580
- {
581
- ...response?.currentData?.meta?.pagination,
582
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
583
- children: [
584
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
585
- /* @__PURE__ */ jsx(Pagination.Links, {})
586
- ]
587
- }
588
- )
544
+ response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
545
+ /* @__PURE__ */ jsx(
546
+ PageSizeURLQuery,
547
+ {
548
+ options: ["8", "16", "32", "64"],
549
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
550
+ }
551
+ ),
552
+ /* @__PURE__ */ jsx(
553
+ PaginationURLQuery,
554
+ {
555
+ pagination: {
556
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
557
+ }
558
+ }
559
+ )
560
+ ] }) : null
589
561
  ] }) }),
590
562
  releaseModalShown && /* @__PURE__ */ jsx(
591
563
  ReleaseModal,
@@ -613,7 +585,7 @@ const StyledMenuItem = styled(Menu.Item)`
613
585
  }
614
586
 
615
587
  &:hover {
616
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
588
+ background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
617
589
  }
618
590
  `;
619
591
  const PencilIcon = styled(Pencil)`
@@ -633,34 +605,29 @@ const TrashIcon = styled(Trash)`
633
605
  const TypographyMaxWidth = styled(Typography)`
634
606
  max-width: 300px;
635
607
  `;
636
- const EntryValidationText = ({ action, schema, entry }) => {
608
+ const EntryValidationText = ({ action, schema, components, entry }) => {
637
609
  const { formatMessage } = useIntl();
638
- const { validate } = unstable_useDocument(
639
- {
640
- collectionType: schema?.kind ?? "",
641
- model: schema?.uid ?? ""
642
- },
643
- {
644
- skip: !schema
645
- }
646
- );
647
- const errors = validate(entry) ?? {};
610
+ const { validate } = unstable_useDocument();
611
+ const { errors } = validate(entry, {
612
+ contentType: schema,
613
+ components,
614
+ isCreatingEntry: false
615
+ });
648
616
  if (Object.keys(errors).length > 0) {
649
617
  const validationErrorsMessages = Object.entries(errors).map(
650
618
  ([key, value]) => formatMessage(
651
- // @ts-expect-error – TODO: fix this will better checks
652
619
  { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
653
620
  { field: key }
654
621
  )
655
622
  ).join(" ");
656
623
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
657
- /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
624
+ /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
658
625
  /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
659
626
  ] });
660
627
  }
661
628
  if (action == "publish") {
662
629
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
663
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
630
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
664
631
  entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
665
632
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
666
633
  defaultMessage: "Already published"
@@ -671,7 +638,7 @@ const EntryValidationText = ({ action, schema, entry }) => {
671
638
  ] });
672
639
  }
673
640
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
674
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
641
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
675
642
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
676
643
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
677
644
  defaultMessage: "Already unpublished"
@@ -691,23 +658,20 @@ const ReleaseDetailsLayout = ({
691
658
  const {
692
659
  data,
693
660
  isLoading: isLoadingDetails,
661
+ isError,
694
662
  error
695
- } = useGetReleaseQuery(
696
- { id: releaseId },
697
- {
698
- skip: !releaseId
699
- }
700
- );
663
+ } = useGetReleaseQuery({ id: releaseId });
701
664
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
702
- const { toggleNotification } = useNotification();
665
+ const toggleNotification = useNotification();
703
666
  const { formatAPIError } = useAPIErrorHandler();
704
- const { allowedActions } = useRBAC(PERMISSIONS);
705
- const { canUpdate, canDelete, canPublish } = allowedActions;
667
+ const {
668
+ allowedActions: { canUpdate, canDelete }
669
+ } = useRBAC(PERMISSIONS);
706
670
  const dispatch = useTypedDispatch();
707
671
  const { trackUsage } = useTracking();
708
672
  const release = data?.data;
709
- const handlePublishRelease = (id) => async () => {
710
- const response = await publishRelease({ id });
673
+ const handlePublishRelease = async () => {
674
+ const response = await publishRelease({ id: releaseId });
711
675
  if ("data" in response) {
712
676
  toggleNotification({
713
677
  type: "success",
@@ -722,14 +686,14 @@ const ReleaseDetailsLayout = ({
722
686
  totalPublishedEntries,
723
687
  totalUnpublishedEntries
724
688
  });
725
- } else if (isFetchError(response.error)) {
689
+ } else if (isAxiosError(response.error)) {
726
690
  toggleNotification({
727
- type: "danger",
691
+ type: "warning",
728
692
  message: formatAPIError(response.error)
729
693
  });
730
694
  } else {
731
695
  toggleNotification({
732
- type: "danger",
696
+ type: "warning",
733
697
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
734
698
  });
735
699
  }
@@ -755,20 +719,21 @@ const ReleaseDetailsLayout = ({
755
719
  return release.createdBy.email;
756
720
  };
757
721
  if (isLoadingDetails) {
758
- return /* @__PURE__ */ jsx(Page.Loading, {});
722
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
759
723
  }
760
- if (isBaseQueryError(error) && "code" in error || !release) {
724
+ if (isError || !release) {
761
725
  return /* @__PURE__ */ jsx(
762
- Navigate,
726
+ Redirect,
763
727
  {
764
- to: "..",
765
- state: {
766
- errors: [
767
- {
768
- // @ts-expect-error – TODO: fix this weird error flow
769
- code: error?.code
770
- }
771
- ]
728
+ to: {
729
+ pathname: "/plugins/content-releases",
730
+ state: {
731
+ errors: [
732
+ {
733
+ code: error?.code
734
+ }
735
+ ]
736
+ }
772
737
  }
773
738
  }
774
739
  );
@@ -805,30 +770,34 @@ const ReleaseDetailsLayout = ({
805
770
  ) : "";
806
771
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
807
772
  /* @__PURE__ */ jsx(
808
- Layouts.Header,
773
+ HeaderLayout,
809
774
  {
810
775
  title: release.name,
811
776
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
812
777
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
813
778
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
814
779
  ] }),
815
- 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
+ }) }),
816
784
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
817
785
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
818
786
  /* @__PURE__ */ jsx(
819
787
  Menu.Trigger,
820
788
  {
789
+ as: IconButton,
821
790
  paddingLeft: 2,
822
791
  paddingRight: 2,
823
792
  "aria-label": formatMessage({
824
793
  id: "content-releases.header.actions.open-release-actions",
825
794
  defaultMessage: "Release edit and delete menu"
826
795
  }),
827
- variant: "tertiary",
828
- children: /* @__PURE__ */ jsx(More, {})
796
+ icon: /* @__PURE__ */ jsx(More, {}),
797
+ variant: "tertiary"
829
798
  }
830
799
  ),
831
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
800
+ /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
832
801
  /* @__PURE__ */ jsxs(
833
802
  Flex,
834
803
  {
@@ -850,7 +819,7 @@ const ReleaseDetailsLayout = ({
850
819
  {
851
820
  disabled: !canDelete,
852
821
  onSelect: toggleWarningSubmit,
853
- $variant: "danger",
822
+ variant: "danger",
854
823
  children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
855
824
  /* @__PURE__ */ jsx(TrashIcon, {}),
856
825
  /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
@@ -895,12 +864,12 @@ const ReleaseDetailsLayout = ({
895
864
  id: "content-releases.header.actions.refresh",
896
865
  defaultMessage: "Refresh"
897
866
  }) }),
898
- canPublish ? /* @__PURE__ */ jsx(
867
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
899
868
  Button,
900
869
  {
901
870
  size: "S",
902
871
  variant: "default",
903
- onClick: handlePublishRelease(release.id.toString()),
872
+ onClick: handlePublishRelease,
904
873
  loading: isPublishing,
905
874
  disabled: release.actions.meta.count === 0,
906
875
  children: formatMessage({
@@ -908,7 +877,7 @@ const ReleaseDetailsLayout = ({
908
877
  defaultMessage: "Publish"
909
878
  })
910
879
  }
911
- ) : null
880
+ ) })
912
881
  ] })
913
882
  }
914
883
  ),
@@ -935,30 +904,44 @@ const getGroupByOptionLabel = (value) => {
935
904
  defaultMessage: "Content-Types"
936
905
  };
937
906
  };
938
- 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 = () => {
939
923
  const { formatMessage } = useIntl();
924
+ const { releaseId } = useParams();
940
925
  const [{ query }, setQuery] = useQueryParams();
941
- const { toggleNotification } = useNotification();
926
+ const toggleNotification = useNotification();
942
927
  const { formatAPIError } = useAPIErrorHandler();
943
928
  const {
944
929
  data: releaseData,
945
930
  isLoading: isReleaseLoading,
931
+ isError: isReleaseError,
946
932
  error: releaseError
947
933
  } = useGetReleaseQuery({ id: releaseId });
948
934
  const {
949
935
  allowedActions: { canUpdate }
950
936
  } = useRBAC(PERMISSIONS);
951
- const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
952
- const { hasI18nEnabled } = runHookWaterfall(
937
+ const { runHookWaterfall } = useStrapiApp();
938
+ const {
939
+ displayedHeaders,
940
+ hasI18nEnabled
941
+ } = runHookWaterfall(
953
942
  "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
954
943
  {
955
- displayedHeaders: {
956
- label: formatMessage({
957
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
958
- defaultMessage: "locale"
959
- }),
960
- name: "locale"
961
- },
944
+ displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
962
945
  hasI18nEnabled: false
963
946
  }
964
947
  );
@@ -990,59 +973,65 @@ const ReleaseDetailsBody = ({ releaseId }) => {
990
973
  // We are passing the action path to found the position in the cache of the action for optimistic updates
991
974
  });
992
975
  if ("error" in response) {
993
- if (isFetchError(response.error)) {
976
+ if (isAxiosError(response.error)) {
994
977
  toggleNotification({
995
- type: "danger",
978
+ type: "warning",
996
979
  message: formatAPIError(response.error)
997
980
  });
998
981
  } else {
999
982
  toggleNotification({
1000
- type: "danger",
983
+ type: "warning",
1001
984
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1002
985
  });
1003
986
  }
1004
987
  }
1005
988
  };
1006
989
  if (isLoading || isReleaseLoading) {
1007
- return /* @__PURE__ */ jsx(Page.Loading, {});
990
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
1008
991
  }
1009
992
  const releaseActions = data?.data;
1010
993
  const releaseMeta = data?.meta;
1011
994
  const contentTypes = releaseMeta?.contentTypes || {};
1012
995
  const components = releaseMeta?.components || {};
1013
- if (isBaseQueryError(releaseError) || !release) {
996
+ if (isReleaseError || !release) {
1014
997
  const errorsArray = [];
1015
- if (releaseError && "code" in releaseError) {
998
+ if (releaseError) {
1016
999
  errorsArray.push({
1017
1000
  code: releaseError.code
1018
1001
  });
1019
1002
  }
1020
- if (releaseActionsError && "code" in releaseActionsError) {
1003
+ if (releaseActionsError) {
1021
1004
  errorsArray.push({
1022
1005
  code: releaseActionsError.code
1023
1006
  });
1024
1007
  }
1025
1008
  return /* @__PURE__ */ jsx(
1026
- Navigate,
1009
+ Redirect,
1027
1010
  {
1028
- to: "..",
1029
- state: {
1030
- errors: errorsArray
1011
+ to: {
1012
+ pathname: "/plugins/content-releases",
1013
+ state: {
1014
+ errors: errorsArray
1015
+ }
1031
1016
  }
1032
1017
  }
1033
1018
  );
1034
1019
  }
1035
1020
  if (isError || !releaseActions) {
1036
- return /* @__PURE__ */ jsx(Page.Error, {});
1021
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1037
1022
  }
1038
1023
  if (Object.keys(releaseActions).length === 0) {
1039
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1040
- EmptyStateLayout,
1024
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1025
+ NoContent,
1041
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
+ },
1042
1031
  action: /* @__PURE__ */ jsx(
1043
1032
  LinkButton,
1044
1033
  {
1045
- tag: Link$1,
1034
+ as: Link$2,
1046
1035
  to: {
1047
1036
  pathname: "/content-manager"
1048
1037
  },
@@ -1053,59 +1042,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1053
1042
  defaultMessage: "Open the Content Manager"
1054
1043
  })
1055
1044
  }
1056
- ),
1057
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1058
- content: formatMessage({
1059
- id: "content-releases.pages.Details.tab.emptyEntries",
1060
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1061
- })
1045
+ )
1062
1046
  }
1063
1047
  ) });
1064
1048
  }
1065
- const groupByLabel = formatMessage({
1066
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1067
- defaultMessage: "Group by"
1068
- });
1069
- const headers = [
1070
- // ...displayedHeaders,
1071
- {
1072
- label: formatMessage({
1073
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1074
- defaultMessage: "name"
1075
- }),
1076
- name: "name"
1077
- },
1078
- {
1079
- label: formatMessage({
1080
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1081
- defaultMessage: "content-type"
1082
- }),
1083
- name: "content-type"
1084
- },
1085
- {
1086
- label: formatMessage({
1087
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1088
- defaultMessage: "action"
1089
- }),
1090
- name: "action"
1091
- },
1092
- ...!release.releasedAt ? [
1093
- {
1094
- label: formatMessage({
1095
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1096
- defaultMessage: "status"
1097
- }),
1098
- name: "status"
1099
- }
1100
- ] : []
1101
- ];
1102
1049
  const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1103
- 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: [
1104
1051
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1105
1052
  SingleSelect,
1106
1053
  {
1107
- placeholder: groupByLabel,
1108
- "aria-label": groupByLabel,
1054
+ "aria-label": formatMessage({
1055
+ id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1056
+ defaultMessage: "Group by"
1057
+ }),
1109
1058
  customizeContent: (value) => formatMessage(
1110
1059
  {
1111
1060
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1129,11 +1078,55 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1129
1078
  ...item,
1130
1079
  id: Number(item.entry.id)
1131
1080
  })),
1132
- headers,
1133
- isLoading: isLoading || isFetching,
1081
+ colCount: releaseActions[key].length,
1082
+ isLoading,
1083
+ isFetching,
1134
1084
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1135
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1136
- /* @__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, {}),
1137
1130
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1138
1131
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1139
1132
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1191,39 +1184,34 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1191
1184
  }
1192
1185
  )
1193
1186
  ] }, `releases-group-${key}`)),
1194
- /* @__PURE__ */ jsxs(
1195
- Pagination.Root,
1196
- {
1197
- ...releaseMeta?.pagination,
1198
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1199
- children: [
1200
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1201
- /* @__PURE__ */ jsx(Pagination.Links, {})
1202
- ]
1203
- }
1204
- )
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
+ ] })
1205
1198
  ] }) });
1206
1199
  };
1207
1200
  const ReleaseDetailsPage = () => {
1208
1201
  const { formatMessage } = useIntl();
1209
1202
  const { releaseId } = useParams();
1210
- const { toggleNotification } = useNotification();
1203
+ const toggleNotification = useNotification();
1211
1204
  const { formatAPIError } = useAPIErrorHandler();
1212
- const navigate = useNavigate();
1205
+ const { replace } = useHistory();
1213
1206
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1214
1207
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1215
1208
  const {
1216
1209
  isLoading: isLoadingDetails,
1217
1210
  data,
1218
1211
  isSuccess: isSuccessDetails
1219
- } = useGetReleaseQuery(
1220
- { id: releaseId },
1221
- {
1222
- skip: !releaseId
1223
- }
1224
- );
1212
+ } = useGetReleaseQuery({ id: releaseId });
1225
1213
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1226
- const [deleteRelease] = useDeleteReleaseMutation();
1214
+ const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1227
1215
  const toggleEditReleaseModal = () => {
1228
1216
  setReleaseModalShown((prev) => !prev);
1229
1217
  };
@@ -1234,18 +1222,15 @@ const ReleaseDetailsPage = () => {
1234
1222
  {
1235
1223
  toggleEditReleaseModal,
1236
1224
  toggleWarningSubmit,
1237
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1225
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1238
1226
  }
1239
1227
  );
1240
1228
  }
1241
- if (!releaseId) {
1242
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1243
- }
1244
1229
  const releaseData = isSuccessDetails && data?.data || null;
1245
1230
  const title = releaseData?.name || "";
1246
1231
  const timezone = releaseData?.timezone ?? null;
1247
1232
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1248
- const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
1233
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1249
1234
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1250
1235
  const handleEditRelease = async (values) => {
1251
1236
  const response = await updateRelease({
@@ -1263,14 +1248,14 @@ const ReleaseDetailsPage = () => {
1263
1248
  })
1264
1249
  });
1265
1250
  toggleEditReleaseModal();
1266
- } else if (isFetchError(response.error)) {
1251
+ } else if (isAxiosError(response.error)) {
1267
1252
  toggleNotification({
1268
- type: "danger",
1253
+ type: "warning",
1269
1254
  message: formatAPIError(response.error)
1270
1255
  });
1271
1256
  } else {
1272
1257
  toggleNotification({
1273
- type: "danger",
1258
+ type: "warning",
1274
1259
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1275
1260
  });
1276
1261
  }
@@ -1280,15 +1265,15 @@ const ReleaseDetailsPage = () => {
1280
1265
  id: releaseId
1281
1266
  });
1282
1267
  if ("data" in response) {
1283
- navigate("..");
1284
- } else if (isFetchError(response.error)) {
1268
+ replace("/plugins/content-releases");
1269
+ } else if (isAxiosError(response.error)) {
1285
1270
  toggleNotification({
1286
- type: "danger",
1271
+ type: "warning",
1287
1272
  message: formatAPIError(response.error)
1288
1273
  });
1289
1274
  } else {
1290
1275
  toggleNotification({
1291
- type: "danger",
1276
+ type: "warning",
1292
1277
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1293
1278
  });
1294
1279
  }
@@ -1299,7 +1284,7 @@ const ReleaseDetailsPage = () => {
1299
1284
  toggleEditReleaseModal,
1300
1285
  toggleWarningSubmit,
1301
1286
  children: [
1302
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1287
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1303
1288
  releaseModalShown && /* @__PURE__ */ jsx(
1304
1289
  ReleaseModal,
1305
1290
  {
@@ -1319,13 +1304,14 @@ const ReleaseDetailsPage = () => {
1319
1304
  /* @__PURE__ */ jsx(
1320
1305
  ConfirmDialog,
1321
1306
  {
1322
- isOpen: showWarningSubmit,
1323
- onClose: toggleWarningSubmit,
1324
- onConfirm: handleDeleteRelease,
1325
- children: formatMessage({
1307
+ bodyText: {
1326
1308
  id: "content-releases.dialog.confirmation-message",
1327
1309
  defaultMessage: "Are you sure you want to delete this release?"
1328
- })
1310
+ },
1311
+ isOpen: showWarningSubmit,
1312
+ isConfirmButtonLoading: isDeletingRelease,
1313
+ onToggleDialog: toggleWarningSubmit,
1314
+ onConfirm: handleDeleteRelease
1329
1315
  }
1330
1316
  )
1331
1317
  ]
@@ -1333,12 +1319,12 @@ const ReleaseDetailsPage = () => {
1333
1319
  );
1334
1320
  };
1335
1321
  const App = () => {
1336
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1337
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1338
- /* @__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 })
1339
1325
  ] }) });
1340
1326
  };
1341
1327
  export {
1342
1328
  App
1343
1329
  };
1344
- //# sourceMappingURL=App-D_6Y9N2F.mjs.map
1330
+ //# sourceMappingURL=App-gu1aiP6i.mjs.map