@strapi/content-releases 0.0.0-next.d10040847b91742ccb8083938399b63ffa289c7a → 0.0.0-next.d54a672641d83234230d3d80d92aaf87f60f8c75

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 (32) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-lnXbSPgp.js → App-dLXY5ei3.js} +673 -630
  3. package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
  4. package/dist/_chunks/{App-g3vtS2Wa.mjs → App-jrh58sXY.mjs} +686 -643
  5. package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
  6. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +2 -2
  7. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  8. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-bpIYXOfu.js} +2 -2
  9. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  10. package/dist/_chunks/{en-gcJJ5htG.js → en-HrREghh3.js} +11 -3
  11. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  12. package/dist/_chunks/{en-WuuhP6Bn.mjs → en-ltT1TlKQ.mjs} +11 -3
  13. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  14. package/dist/_chunks/{index-ItlgrLcr.js → index-CVO0Rqdm.js} +320 -18
  15. package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
  16. package/dist/_chunks/{index-uGex_IIQ.mjs → index-PiOGBETy.mjs} +335 -33
  17. package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
  18. package/dist/admin/index.js +1 -1
  19. package/dist/admin/index.mjs +1 -1
  20. package/dist/server/index.js +331 -159
  21. package/dist/server/index.js.map +1 -1
  22. package/dist/server/index.mjs +331 -159
  23. package/dist/server/index.mjs.map +1 -1
  24. package/package.json +13 -13
  25. package/dist/_chunks/App-g3vtS2Wa.mjs.map +0 -1
  26. package/dist/_chunks/App-lnXbSPgp.js.map +0 -1
  27. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  28. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  29. package/dist/_chunks/en-WuuhP6Bn.mjs.map +0 -1
  30. package/dist/_chunks/en-gcJJ5htG.js.map +0 -1
  31. package/dist/_chunks/index-ItlgrLcr.js.map +0 -1
  32. package/dist/_chunks/index-uGex_IIQ.mjs.map +0 -1
@@ -1,17 +1,17 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, LoadingIndicatorPage, ConfirmDialog, useRBAC, useTracking, RelativeTime, CheckPermissions, useQueryParams, AnErrorOccurred, NoContent, Table, PageSizeURLQuery, PaginationURLQuery, CheckPagePermissions } from "@strapi/helper-plugin";
3
- import { useLocation, useParams, useHistory, Redirect, Link as Link$1, Switch, Route } from "react-router-dom";
4
- import { g as getTimezoneOffset, p as pluginId, u as useGetReleaseQuery, a as useUpdateReleaseMutation, b as useDeleteReleaseMutation, c as usePublishReleaseMutation, P as PERMISSIONS, d as useTypedDispatch, e as useGetReleaseActionsQuery, f as useUpdateReleaseActionMutation, R as ReleaseActionOptions, h as ReleaseActionMenu, i as isAxiosError, r as releaseApi, j as useGetReleasesQuery, k as useCreateReleaseMutation } from "./index-uGex_IIQ.mjs";
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, useLicenseLimits } from "@strapi/admin/strapi-admin";
7
- import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, ContentLayout, Main, HeaderLayout, Link, IconButton, SingleSelect, SingleSelectOption, Badge, Tr, Td, Icon, Tooltip, Alert, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem } from "@strapi/design-system";
8
- import { Menu, LinkButton, Link as Link$2 } from "@strapi/design-system/v2";
9
- import { Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle, Plus, EmptyDocuments } from "@strapi/icons";
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
- import { zonedTimeToUtc, utcToZonedTime } from "date-fns-tz";
11
+ import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
12
  import { useIntl } from "react-intl";
13
13
  import styled from "styled-components";
14
- import { formatISO, parse } from "date-fns";
14
+ import { formatISO } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
16
  import * as yup from "yup";
17
17
  import "@reduxjs/toolkit/query";
@@ -47,7 +47,6 @@ const ReleaseModal = ({
47
47
  const { formatMessage } = useIntl();
48
48
  const { pathname } = useLocation();
49
49
  const isCreatingRelease = pathname === `/plugins/${pluginId}`;
50
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
51
50
  const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
52
51
  initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
53
52
  );
@@ -55,13 +54,12 @@ const ReleaseModal = ({
55
54
  const { date, time, timezone } = values;
56
55
  if (!date || !time || !timezone)
57
56
  return null;
58
- const formattedDate = parse(time, "HH:mm", new Date(date));
59
- const timezoneWithoutOffset = timezone.split("_")[1];
60
- return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
57
+ const timezoneWithoutOffset = timezone.split("&")[1];
58
+ return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
61
59
  };
62
60
  const getTimezoneWithOffset = () => {
63
61
  const currentTimezone = timezoneList.find(
64
- (timezone) => timezone.value.split("_")[1] === initialValues.timezone
62
+ (timezone) => timezone.value.split("&")[1] === initialValues.timezone
65
63
  );
66
64
  return currentTimezone?.value || systemTimezone.value;
67
65
  };
@@ -79,7 +77,7 @@ const ReleaseModal = ({
79
77
  onSubmit: (values) => {
80
78
  handleSubmit({
81
79
  ...values,
82
- timezone: values.timezone ? values.timezone.split("_")[1] : null,
80
+ timezone: values.timezone ? values.timezone.split("&")[1] : null,
83
81
  scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
84
82
  });
85
83
  },
@@ -105,92 +103,88 @@ const ReleaseModal = ({
105
103
  required: true
106
104
  }
107
105
  ),
108
- IsSchedulingEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
109
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
110
- Checkbox,
111
- {
112
- name: "isScheduled",
113
- value: values.isScheduled,
114
- onChange: (event) => {
115
- setFieldValue("isScheduled", event.target.checked);
116
- if (!event.target.checked) {
106
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
107
+ Checkbox,
108
+ {
109
+ name: "isScheduled",
110
+ value: values.isScheduled,
111
+ onChange: (event) => {
112
+ setFieldValue("isScheduled", event.target.checked);
113
+ if (!event.target.checked) {
114
+ setFieldValue("date", null);
115
+ setFieldValue("time", "");
116
+ setFieldValue("timezone", null);
117
+ } else {
118
+ setFieldValue("date", initialValues.date);
119
+ setFieldValue("time", initialValues.time);
120
+ setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
121
+ }
122
+ },
123
+ children: /* @__PURE__ */ jsx(
124
+ Typography,
125
+ {
126
+ textColor: values.isScheduled ? "primary600" : "neutral800",
127
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
128
+ children: formatMessage({
129
+ id: "modal.form.input.label.schedule-release",
130
+ defaultMessage: "Schedule release"
131
+ })
132
+ }
133
+ )
134
+ }
135
+ ) }),
136
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
137
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
138
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
139
+ DatePicker,
140
+ {
141
+ label: formatMessage({
142
+ id: "content-releases.modal.form.input.label.date",
143
+ defaultMessage: "Date"
144
+ }),
145
+ name: "date",
146
+ error: errors.date,
147
+ onChange: (date) => {
148
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
149
+ setFieldValue("date", isoFormatDate);
150
+ },
151
+ clearLabel: formatMessage({
152
+ id: "content-releases.modal.form.input.clearLabel",
153
+ defaultMessage: "Clear"
154
+ }),
155
+ onClear: () => {
117
156
  setFieldValue("date", null);
157
+ },
158
+ selectedDate: values.date || void 0,
159
+ required: true,
160
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
161
+ }
162
+ ) }),
163
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
164
+ TimePicker,
165
+ {
166
+ label: formatMessage({
167
+ id: "content-releases.modal.form.input.label.time",
168
+ defaultMessage: "Time"
169
+ }),
170
+ name: "time",
171
+ error: errors.time,
172
+ onChange: (time) => {
173
+ setFieldValue("time", time);
174
+ },
175
+ clearLabel: formatMessage({
176
+ id: "content-releases.modal.form.input.clearLabel",
177
+ defaultMessage: "Clear"
178
+ }),
179
+ onClear: () => {
118
180
  setFieldValue("time", "");
119
- setFieldValue("timezone", null);
120
- } else {
121
- setFieldValue("date", initialValues.date);
122
- setFieldValue("time", initialValues.time);
123
- setFieldValue(
124
- "timezone",
125
- initialValues.timezone ?? systemTimezone?.value
126
- );
127
- }
128
- },
129
- children: /* @__PURE__ */ jsx(
130
- Typography,
131
- {
132
- textColor: values.isScheduled ? "primary600" : "neutral800",
133
- fontWeight: values.isScheduled ? "semiBold" : "regular",
134
- children: formatMessage({
135
- id: "modal.form.input.label.schedule-release",
136
- defaultMessage: "Schedule release"
137
- })
138
- }
139
- )
140
- }
141
- ) }),
142
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
143
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
144
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
145
- DatePicker,
146
- {
147
- label: formatMessage({
148
- id: "content-releases.modal.form.input.label.date",
149
- defaultMessage: "Date"
150
- }),
151
- name: "date",
152
- error: errors.date,
153
- onChange: (date) => {
154
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
155
- setFieldValue("date", isoFormatDate);
156
- },
157
- clearLabel: formatMessage({
158
- id: "content-releases.modal.form.input.clearLabel",
159
- defaultMessage: "Clear"
160
- }),
161
- onClear: () => {
162
- setFieldValue("date", null);
163
- },
164
- selectedDate: values.date || void 0,
165
- required: true
166
- }
167
- ) }),
168
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
169
- TimePicker,
170
- {
171
- label: formatMessage({
172
- id: "content-releases.modal.form.input.label.time",
173
- defaultMessage: "Time"
174
- }),
175
- name: "time",
176
- error: errors.time,
177
- onChange: (time) => {
178
- setFieldValue("time", time);
179
- },
180
- clearLabel: formatMessage({
181
- id: "content-releases.modal.form.input.clearLabel",
182
- defaultMessage: "Clear"
183
- }),
184
- onClear: () => {
185
- setFieldValue("time", "");
186
- },
187
- value: values.time || void 0,
188
- required: true
189
- }
190
- ) })
191
- ] }),
192
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
193
- ] })
181
+ },
182
+ value: values.time || void 0,
183
+ required: true
184
+ }
185
+ ) })
186
+ ] }),
187
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
194
188
  ] })
195
189
  ] }) }),
196
190
  /* @__PURE__ */ jsx(
@@ -214,10 +208,10 @@ const ReleaseModal = ({
214
208
  const getTimezones = (selectedDate) => {
215
209
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
216
210
  const utcOffset = getTimezoneOffset(timezone, selectedDate);
217
- return { offset: utcOffset, value: `${utcOffset}_${timezone}` };
211
+ return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
218
212
  });
219
213
  const systemTimezone = timezoneList.find(
220
- (timezone) => timezone.value.split("_")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
214
+ (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
221
215
  );
222
216
  return { timezoneList, systemTimezone };
223
217
  };
@@ -229,7 +223,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
229
223
  if (values.date) {
230
224
  const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
231
225
  setTimezoneList(timezoneList2);
232
- const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("_")[1] === values.timezone.split("_")[1]);
226
+ const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
233
227
  if (updatedTimezone) {
234
228
  setFieldValue("timezone", updatedTimezone.value);
235
229
  }
@@ -242,9 +236,10 @@ const TimezoneComponent = ({ timezoneOptions }) => {
242
236
  id: "content-releases.modal.form.input.label.timezone",
243
237
  defaultMessage: "Timezone"
244
238
  }),
239
+ autocomplete: { type: "list", filter: "contains" },
245
240
  name: "timezone",
246
241
  value: values.timezone || void 0,
247
- textValue: values.timezone ? values.timezone.replace("_", " ") : void 0,
242
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
248
243
  onChange: (timezone) => {
249
244
  setFieldValue("timezone", timezone);
250
245
  },
@@ -256,130 +251,186 @@ const TimezoneComponent = ({ timezoneOptions }) => {
256
251
  },
257
252
  error: errors.timezone,
258
253
  required: true,
259
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace("_", " ") }, timezone.value))
254
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
260
255
  }
261
256
  );
262
257
  };
263
- const ReleaseInfoWrapper = styled(Flex)`
264
- align-self: stretch;
265
- border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
266
- border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
267
- border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
268
- `;
269
- const StyledMenuItem = styled(Menu.Item)`
270
- svg path {
271
- fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
272
- }
273
- span {
274
- color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
275
- }
276
-
277
- &:hover {
278
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
279
- }
258
+ const LinkCard = styled(Link)`
259
+ display: block;
280
260
  `;
281
- const PencilIcon = styled(Pencil)`
282
- width: ${({ theme }) => theme.spaces[3]};
283
- height: ${({ theme }) => theme.spaces[3]};
284
- path {
285
- fill: ${({ theme }) => theme.colors.neutral600};
261
+ const RelativeTime = styled(RelativeTime$1)`
262
+ display: inline-block;
263
+ &::first-letter {
264
+ text-transform: uppercase;
286
265
  }
287
266
  `;
288
- const TrashIcon = styled(Trash)`
289
- width: ${({ theme }) => theme.spaces[3]};
290
- height: ${({ theme }) => theme.spaces[3]};
291
- path {
292
- fill: ${({ theme }) => theme.colors.danger600};
267
+ const getBadgeProps = (status) => {
268
+ let color;
269
+ switch (status) {
270
+ case "ready":
271
+ color = "success";
272
+ break;
273
+ case "blocked":
274
+ color = "warning";
275
+ break;
276
+ case "failed":
277
+ color = "danger";
278
+ break;
279
+ case "done":
280
+ color = "primary";
281
+ break;
282
+ case "empty":
283
+ default:
284
+ color = "neutral";
293
285
  }
294
- `;
295
- const TypographyMaxWidth = styled(Typography)`
296
- max-width: 300px;
297
- `;
298
- const EntryValidationText = ({ action, schema, components, entry }) => {
286
+ return {
287
+ textColor: `${color}600`,
288
+ backgroundColor: `${color}100`,
289
+ borderColor: `${color}200`
290
+ };
291
+ };
292
+ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
299
293
  const { formatMessage } = useIntl();
300
- const { validate } = unstable_useDocument();
301
- const { errors } = validate(entry, {
302
- contentType: schema,
303
- components,
304
- isCreatingEntry: false
305
- });
306
- if (Object.keys(errors).length > 0) {
307
- const validationErrorsMessages = Object.entries(errors).map(
308
- ([key, value]) => formatMessage(
309
- { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
310
- { field: key }
311
- )
312
- ).join(" ");
313
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
314
- /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
315
- /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
316
- ] });
294
+ if (isError) {
295
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
317
296
  }
318
- if (action == "publish") {
319
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
320
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
321
- entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
322
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
323
- defaultMessage: "Already published"
324
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
325
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
326
- defaultMessage: "Ready to publish"
327
- }) })
328
- ] });
297
+ if (releases?.length === 0) {
298
+ return /* @__PURE__ */ jsx(
299
+ EmptyStateLayout,
300
+ {
301
+ content: formatMessage(
302
+ {
303
+ id: "content-releases.page.Releases.tab.emptyEntries",
304
+ defaultMessage: "No releases"
305
+ },
306
+ {
307
+ target: sectionTitle
308
+ }
309
+ ),
310
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
311
+ }
312
+ );
329
313
  }
330
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
331
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
332
- !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
333
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
334
- defaultMessage: "Already unpublished"
335
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
336
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
337
- defaultMessage: "Ready to unpublish"
338
- }) })
339
- ] });
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(
315
+ Flex,
316
+ {
317
+ direction: "column",
318
+ justifyContent: "space-between",
319
+ padding: 4,
320
+ hasRadius: true,
321
+ background: "neutral0",
322
+ shadow: "tableShadow",
323
+ height: "100%",
324
+ width: "100%",
325
+ alignItems: "start",
326
+ gap: 4,
327
+ children: [
328
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
329
+ /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
330
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
331
+ id: "content-releases.pages.Releases.not-scheduled",
332
+ defaultMessage: "Not scheduled"
333
+ }) })
334
+ ] }),
335
+ /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
336
+ ]
337
+ }
338
+ ) }) }, id)) });
340
339
  };
341
- const ReleaseDetailsLayout = ({
342
- toggleEditReleaseModal,
343
- toggleWarningSubmit,
344
- children
345
- }) => {
346
- const { formatMessage, formatDate, formatTime } = useIntl();
347
- const { releaseId } = useParams();
348
- const {
349
- data,
350
- isLoading: isLoadingDetails,
351
- isError,
352
- error
353
- } = useGetReleaseQuery({ id: releaseId });
354
- const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
340
+ const StyledAlert = styled(Alert)`
341
+ button {
342
+ display: none;
343
+ }
344
+ p + div {
345
+ margin-left: auto;
346
+ }
347
+ `;
348
+ const INITIAL_FORM_VALUES = {
349
+ name: "",
350
+ date: null,
351
+ time: "",
352
+ isScheduled: true,
353
+ scheduledAt: null,
354
+ timezone: null
355
+ };
356
+ const ReleasesPage = () => {
357
+ const tabRef = React.useRef(null);
358
+ const location = useLocation();
359
+ const [releaseModalShown, setReleaseModalShown] = React.useState(false);
355
360
  const toggleNotification = useNotification();
361
+ const { formatMessage } = useIntl();
362
+ const { push, replace } = useHistory();
356
363
  const { formatAPIError } = useAPIErrorHandler();
357
- const {
358
- allowedActions: { canUpdate, canDelete }
359
- } = useRBAC(PERMISSIONS);
360
- const dispatch = useTypedDispatch();
364
+ const [{ query }, setQuery] = useQueryParams();
365
+ const response = useGetReleasesQuery(query);
366
+ const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
367
+ const { getFeature } = useLicenseLimits();
368
+ const { maximumReleases = 3 } = getFeature("cms-content-releases");
361
369
  const { trackUsage } = useTracking();
362
- const release = data?.data;
363
- const handlePublishRelease = async () => {
364
- const response = await publishRelease({ id: releaseId });
365
- if ("data" in response) {
370
+ const { isLoading, isSuccess, isError } = response;
371
+ const activeTab = response?.currentData?.meta?.activeTab || "pending";
372
+ const activeTabIndex = ["pending", "done"].indexOf(activeTab);
373
+ React.useEffect(() => {
374
+ if (location?.state?.errors) {
366
375
  toggleNotification({
367
- type: "success",
376
+ type: "warning",
377
+ title: formatMessage({
378
+ id: "content-releases.pages.Releases.notification.error.title",
379
+ defaultMessage: "Your request could not be processed."
380
+ }),
368
381
  message: formatMessage({
369
- id: "content-releases.pages.ReleaseDetails.publish-notification-success",
370
- defaultMessage: "Release was published successfully."
382
+ id: "content-releases.pages.Releases.notification.error.message",
383
+ defaultMessage: "Please try again or open another release."
371
384
  })
372
385
  });
373
- const { totalEntries: totalEntries2, totalPublishedEntries, totalUnpublishedEntries } = response.data.meta;
374
- trackUsage("didPublishRelease", {
375
- totalEntries: totalEntries2,
376
- totalPublishedEntries,
377
- totalUnpublishedEntries
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);
392
+ }
393
+ }, [activeTabIndex]);
394
+ const toggleAddReleaseModal = () => {
395
+ setReleaseModalShown((prev) => !prev);
396
+ };
397
+ if (isLoading) {
398
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
399
+ }
400
+ const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
401
+ const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
402
+ const handleTabChange = (index) => {
403
+ setQuery({
404
+ ...query,
405
+ page: 1,
406
+ pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
407
+ filters: {
408
+ releasedAt: {
409
+ $notNull: index === 0 ? false : true
410
+ }
411
+ }
412
+ });
413
+ };
414
+ const handleAddRelease = async ({ name, scheduledAt, timezone }) => {
415
+ const response2 = await createRelease({
416
+ name,
417
+ scheduledAt,
418
+ timezone
419
+ });
420
+ if ("data" in response2) {
421
+ toggleNotification({
422
+ type: "success",
423
+ message: formatMessage({
424
+ id: "content-releases.modal.release-created-notification-success",
425
+ defaultMessage: "Release created."
426
+ })
378
427
  });
379
- } else if (isAxiosError(response.error)) {
428
+ trackUsage("didCreateRelease");
429
+ push(`/plugins/content-releases/${response2.data.data.id}`);
430
+ } else if (isAxiosError(response2.error)) {
380
431
  toggleNotification({
381
432
  type: "warning",
382
- message: formatAPIError(response.error)
433
+ message: formatAPIError(response2.error)
383
434
  });
384
435
  } else {
385
436
  toggleNotification({
@@ -388,16 +439,280 @@ const ReleaseDetailsLayout = ({
388
439
  });
389
440
  }
390
441
  };
391
- const handleRefresh = () => {
392
- dispatch(releaseApi.util.invalidateTags([{ type: "ReleaseAction", id: "LIST" }]));
393
- };
394
- const getCreatedByUser = () => {
395
- if (!release?.createdBy) {
396
- return null;
397
- }
398
- if (release.createdBy.username) {
399
- return release.createdBy.username;
400
- }
442
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
443
+ /* @__PURE__ */ jsx(
444
+ HeaderLayout,
445
+ {
446
+ title: formatMessage({
447
+ id: "content-releases.pages.Releases.title",
448
+ defaultMessage: "Releases"
449
+ }),
450
+ subtitle: formatMessage({
451
+ id: "content-releases.pages.Releases.header-subtitle",
452
+ defaultMessage: "Create and manage content updates"
453
+ }),
454
+ primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
455
+ Button,
456
+ {
457
+ startIcon: /* @__PURE__ */ jsx(Plus, {}),
458
+ onClick: toggleAddReleaseModal,
459
+ disabled: hasReachedMaximumPendingReleases,
460
+ children: formatMessage({
461
+ id: "content-releases.header.actions.add-release",
462
+ defaultMessage: "New release"
463
+ })
464
+ }
465
+ ) })
466
+ }
467
+ ),
468
+ /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
469
+ hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
470
+ StyledAlert,
471
+ {
472
+ marginBottom: 6,
473
+ action: /* @__PURE__ */ jsx(Link, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
474
+ id: "content-releases.pages.Releases.max-limit-reached.action",
475
+ defaultMessage: "Explore plans"
476
+ }) }),
477
+ title: formatMessage(
478
+ {
479
+ id: "content-releases.pages.Releases.max-limit-reached.title",
480
+ defaultMessage: "You have reached the {number} pending {number, plural, one {release} other {releases}} limit."
481
+ },
482
+ { number: maximumReleases }
483
+ ),
484
+ onClose: () => {
485
+ },
486
+ closeLabel: "",
487
+ children: formatMessage({
488
+ id: "content-releases.pages.Releases.max-limit-reached.message",
489
+ defaultMessage: "Upgrade to manage an unlimited number of releases."
490
+ })
491
+ }
492
+ ),
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(
508
+ {
509
+ id: "content-releases.pages.Releases.tab.pending",
510
+ defaultMessage: "Pending ({count})"
511
+ },
512
+ {
513
+ count: totalPendingReleases
514
+ }
515
+ ) }),
516
+ /* @__PURE__ */ jsx(Tab, { children: formatMessage({
517
+ id: "content-releases.pages.Releases.tab.done",
518
+ defaultMessage: "Done"
519
+ }) })
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,
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
561
+ ] }) }),
562
+ releaseModalShown && /* @__PURE__ */ jsx(
563
+ ReleaseModal,
564
+ {
565
+ handleClose: toggleAddReleaseModal,
566
+ handleSubmit: handleAddRelease,
567
+ isLoading: isSubmittingForm,
568
+ initialValues: INITIAL_FORM_VALUES
569
+ }
570
+ )
571
+ ] });
572
+ };
573
+ const ReleaseInfoWrapper = styled(Flex)`
574
+ align-self: stretch;
575
+ border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
576
+ border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
577
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
578
+ `;
579
+ const StyledMenuItem = styled(Menu.Item)`
580
+ svg path {
581
+ fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
582
+ }
583
+ span {
584
+ color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
585
+ }
586
+
587
+ &:hover {
588
+ background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
589
+ }
590
+ `;
591
+ const PencilIcon = styled(Pencil)`
592
+ width: ${({ theme }) => theme.spaces[3]};
593
+ height: ${({ theme }) => theme.spaces[3]};
594
+ path {
595
+ fill: ${({ theme }) => theme.colors.neutral600};
596
+ }
597
+ `;
598
+ const TrashIcon = styled(Trash)`
599
+ width: ${({ theme }) => theme.spaces[3]};
600
+ height: ${({ theme }) => theme.spaces[3]};
601
+ path {
602
+ fill: ${({ theme }) => theme.colors.danger600};
603
+ }
604
+ `;
605
+ const TypographyMaxWidth = styled(Typography)`
606
+ max-width: 300px;
607
+ `;
608
+ const EntryValidationText = ({ action, schema, components, entry }) => {
609
+ const { formatMessage } = useIntl();
610
+ const { validate } = unstable_useDocument();
611
+ const { errors } = validate(entry, {
612
+ contentType: schema,
613
+ components,
614
+ isCreatingEntry: false
615
+ });
616
+ if (Object.keys(errors).length > 0) {
617
+ const validationErrorsMessages = Object.entries(errors).map(
618
+ ([key, value]) => formatMessage(
619
+ { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
620
+ { field: key }
621
+ )
622
+ ).join(" ");
623
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
624
+ /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
625
+ /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
626
+ ] });
627
+ }
628
+ if (action == "publish") {
629
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
630
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
631
+ entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
632
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
633
+ defaultMessage: "Already published"
634
+ }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
635
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
636
+ defaultMessage: "Ready to publish"
637
+ }) })
638
+ ] });
639
+ }
640
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
641
+ /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
642
+ !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
643
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
644
+ defaultMessage: "Already unpublished"
645
+ }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
646
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
647
+ defaultMessage: "Ready to unpublish"
648
+ }) })
649
+ ] });
650
+ };
651
+ const ReleaseDetailsLayout = ({
652
+ toggleEditReleaseModal,
653
+ toggleWarningSubmit,
654
+ children
655
+ }) => {
656
+ const { formatMessage, formatDate, formatTime } = useIntl();
657
+ const { releaseId } = useParams();
658
+ const {
659
+ data,
660
+ isLoading: isLoadingDetails,
661
+ isError,
662
+ error
663
+ } = useGetReleaseQuery({ id: releaseId });
664
+ const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
665
+ const toggleNotification = useNotification();
666
+ const { formatAPIError } = useAPIErrorHandler();
667
+ const {
668
+ allowedActions: { canUpdate, canDelete }
669
+ } = useRBAC(PERMISSIONS);
670
+ const dispatch = useTypedDispatch();
671
+ const { trackUsage } = useTracking();
672
+ const release = data?.data;
673
+ const handlePublishRelease = async () => {
674
+ const response = await publishRelease({ id: releaseId });
675
+ if ("data" in response) {
676
+ toggleNotification({
677
+ type: "success",
678
+ message: formatMessage({
679
+ id: "content-releases.pages.ReleaseDetails.publish-notification-success",
680
+ defaultMessage: "Release was published successfully."
681
+ })
682
+ });
683
+ const { totalEntries: totalEntries2, totalPublishedEntries, totalUnpublishedEntries } = response.data.meta;
684
+ trackUsage("didPublishRelease", {
685
+ totalEntries: totalEntries2,
686
+ totalPublishedEntries,
687
+ totalUnpublishedEntries
688
+ });
689
+ } else if (isAxiosError(response.error)) {
690
+ toggleNotification({
691
+ type: "warning",
692
+ message: formatAPIError(response.error)
693
+ });
694
+ } else {
695
+ toggleNotification({
696
+ type: "warning",
697
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
698
+ });
699
+ }
700
+ };
701
+ const handleRefresh = () => {
702
+ dispatch(
703
+ releaseApi.util.invalidateTags([
704
+ { type: "ReleaseAction", id: "LIST" },
705
+ { type: "Release", id: releaseId }
706
+ ])
707
+ );
708
+ };
709
+ const getCreatedByUser = () => {
710
+ if (!release?.createdBy) {
711
+ return null;
712
+ }
713
+ if (release.createdBy.username) {
714
+ return release.createdBy.username;
715
+ }
401
716
  if (release.createdBy.firstname) {
402
717
  return `${release.createdBy.firstname} ${release.createdBy.lastname || ""}`.trim();
403
718
  }
@@ -425,7 +740,6 @@ const ReleaseDetailsLayout = ({
425
740
  }
426
741
  const totalEntries = release.actions.meta.count || 0;
427
742
  const hasCreatedByUser = Boolean(getCreatedByUser());
428
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
429
743
  const isScheduled = release.scheduledAt && release.timezone;
430
744
  const numberOfEntriesText = formatMessage(
431
745
  {
@@ -459,8 +773,11 @@ const ReleaseDetailsLayout = ({
459
773
  HeaderLayout,
460
774
  {
461
775
  title: release.name,
462
- subtitle: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : ""),
463
- navigationAction: /* @__PURE__ */ jsx(Link, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
776
+ subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
777
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
778
+ /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
779
+ ] }),
780
+ navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
464
781
  id: "global.back",
465
782
  defaultMessage: "Back"
466
783
  }) }),
@@ -529,7 +846,7 @@ const ReleaseDetailsLayout = ({
529
846
  defaultMessage: "Created"
530
847
  }) }),
531
848
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
532
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
849
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
533
850
  formatMessage(
534
851
  {
535
852
  id: "content-releases.header.actions.created.description",
@@ -568,6 +885,7 @@ const ReleaseDetailsLayout = ({
568
885
  ] });
569
886
  };
570
887
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
888
+ const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
571
889
  const getGroupByOptionLabel = (value) => {
572
890
  if (value === "locale") {
573
891
  return {
@@ -586,6 +904,21 @@ const getGroupByOptionLabel = (value) => {
586
904
  defaultMessage: "Content-Types"
587
905
  };
588
906
  };
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
+ ];
589
922
  const ReleaseDetailsBody = () => {
590
923
  const { formatMessage } = useIntl();
591
924
  const { releaseId } = useParams();
@@ -601,6 +934,17 @@ const ReleaseDetailsBody = () => {
601
934
  const {
602
935
  allowedActions: { canUpdate }
603
936
  } = useRBAC(PERMISSIONS);
937
+ const { runHookWaterfall } = useStrapiApp();
938
+ const {
939
+ displayedHeaders,
940
+ hasI18nEnabled
941
+ } = runHookWaterfall(
942
+ "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
943
+ {
944
+ displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
945
+ hasI18nEnabled: false
946
+ }
947
+ );
604
948
  const release = releaseData?.data;
605
949
  const selectedGroupBy = query?.groupBy || "contentType";
606
950
  const {
@@ -687,7 +1031,7 @@ const ReleaseDetailsBody = () => {
687
1031
  action: /* @__PURE__ */ jsx(
688
1032
  LinkButton,
689
1033
  {
690
- as: Link$1,
1034
+ as: Link$2,
691
1035
  to: {
692
1036
  pathname: "/content-manager"
693
1037
  },
@@ -702,6 +1046,7 @@ const ReleaseDetailsBody = () => {
702
1046
  }
703
1047
  ) });
704
1048
  }
1049
+ const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
705
1050
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
706
1051
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
707
1052
  SingleSelect,
@@ -721,7 +1066,7 @@ const ReleaseDetailsBody = () => {
721
1066
  ),
722
1067
  value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
723
1068
  onChange: (value) => setQuery({ groupBy: value }),
724
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1069
+ children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
725
1070
  }
726
1071
  ) }),
727
1072
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
@@ -738,28 +1083,15 @@ const ReleaseDetailsBody = () => {
738
1083
  isFetching,
739
1084
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
740
1085
  /* @__PURE__ */ jsxs(Table.Head, { children: [
741
- /* @__PURE__ */ jsx(
742
- Table.HeaderCell,
743
- {
744
- fieldSchemaType: "string",
745
- label: formatMessage({
746
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
747
- defaultMessage: "name"
748
- }),
749
- name: "name"
750
- }
751
- ),
752
- /* @__PURE__ */ jsx(
1086
+ displayedHeaders.map(({ key: key2, fieldSchema, metadatas, name }) => /* @__PURE__ */ jsx(
753
1087
  Table.HeaderCell,
754
1088
  {
755
- fieldSchemaType: "string",
756
- label: formatMessage({
757
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
758
- defaultMessage: "locale"
759
- }),
760
- name: "locale"
761
- }
762
- ),
1089
+ fieldSchemaType: fieldSchema.type,
1090
+ label: formatMessage(metadatas.label),
1091
+ name
1092
+ },
1093
+ key2
1094
+ )),
763
1095
  /* @__PURE__ */ jsx(
764
1096
  Table.HeaderCell,
765
1097
  {
@@ -798,7 +1130,7 @@ const ReleaseDetailsBody = () => {
798
1130
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
799
1131
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
800
1132
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
801
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1133
+ hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
802
1134
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
803
1135
  /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
804
1136
  {
@@ -849,293 +1181,77 @@ const ReleaseDetailsBody = () => {
849
1181
  ] }, id)
850
1182
  ) })
851
1183
  ] })
852
- }
853
- )
854
- ] }, `releases-group-${key}`)),
855
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
856
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
857
- /* @__PURE__ */ jsx(
858
- PaginationURLQuery,
859
- {
860
- pagination: {
861
- pageCount: releaseMeta?.pagination?.pageCount || 0
862
- }
863
- }
864
- )
865
- ] })
866
- ] }) });
867
- };
868
- const ReleaseDetailsPage = () => {
869
- const { formatMessage } = useIntl();
870
- const { releaseId } = useParams();
871
- const toggleNotification = useNotification();
872
- const { formatAPIError } = useAPIErrorHandler();
873
- const { push } = useHistory();
874
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
875
- const [showWarningSubmit, setWarningSubmit] = React.useState(false);
876
- const {
877
- isLoading: isLoadingDetails,
878
- data,
879
- isSuccess: isSuccessDetails
880
- } = useGetReleaseQuery({ id: releaseId });
881
- const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
882
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
883
- const toggleEditReleaseModal = () => {
884
- setReleaseModalShown((prev) => !prev);
885
- };
886
- const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
887
- if (isLoadingDetails) {
888
- return /* @__PURE__ */ jsx(
889
- ReleaseDetailsLayout,
890
- {
891
- toggleEditReleaseModal,
892
- toggleWarningSubmit,
893
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
894
- }
895
- );
896
- }
897
- const releaseData = isSuccessDetails && data?.data || null;
898
- const title = releaseData?.name || "";
899
- const timezone = releaseData?.timezone ?? null;
900
- const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
901
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
902
- const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
903
- const handleEditRelease = async (values) => {
904
- const response = await updateRelease({
905
- id: releaseId,
906
- name: values.name,
907
- scheduledAt: values.scheduledAt,
908
- timezone: values.timezone
909
- });
910
- if ("data" in response) {
911
- toggleNotification({
912
- type: "success",
913
- message: formatMessage({
914
- id: "content-releases.modal.release-updated-notification-success",
915
- defaultMessage: "Release updated."
916
- })
917
- });
918
- } else if (isAxiosError(response.error)) {
919
- toggleNotification({
920
- type: "warning",
921
- message: formatAPIError(response.error)
922
- });
923
- } else {
924
- toggleNotification({
925
- type: "warning",
926
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
927
- });
928
- }
929
- toggleEditReleaseModal();
930
- };
931
- const handleDeleteRelease = async () => {
932
- const response = await deleteRelease({
933
- id: releaseId
934
- });
935
- if ("data" in response) {
936
- push("/plugins/content-releases");
937
- } else if (isAxiosError(response.error)) {
938
- toggleNotification({
939
- type: "warning",
940
- message: formatAPIError(response.error)
941
- });
942
- } else {
943
- toggleNotification({
944
- type: "warning",
945
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
946
- });
947
- }
948
- };
949
- return /* @__PURE__ */ jsxs(
950
- ReleaseDetailsLayout,
951
- {
952
- toggleEditReleaseModal,
953
- toggleWarningSubmit,
954
- children: [
955
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
956
- releaseModalShown && /* @__PURE__ */ jsx(
957
- ReleaseModal,
958
- {
959
- handleClose: toggleEditReleaseModal,
960
- handleSubmit: handleEditRelease,
961
- isLoading: isLoadingDetails || isSubmittingForm,
962
- initialValues: {
963
- name: title || "",
964
- scheduledAt,
965
- date,
966
- time,
967
- isScheduled: Boolean(scheduledAt),
968
- timezone
969
- }
970
- }
971
- ),
972
- /* @__PURE__ */ jsx(
973
- ConfirmDialog,
974
- {
975
- bodyText: {
976
- id: "content-releases.dialog.confirmation-message",
977
- defaultMessage: "Are you sure you want to delete this release?"
978
- },
979
- isOpen: showWarningSubmit,
980
- isConfirmButtonLoading: isDeletingRelease,
981
- onToggleDialog: toggleWarningSubmit,
982
- onConfirm: handleDeleteRelease
983
- }
984
- )
985
- ]
986
- }
987
- );
988
- };
989
- const LinkCard = styled(Link$2)`
990
- display: block;
991
- `;
992
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
993
- const { formatMessage } = useIntl();
994
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
995
- if (isError) {
996
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
997
- }
998
- if (releases?.length === 0) {
999
- return /* @__PURE__ */ jsx(
1000
- EmptyStateLayout,
1001
- {
1002
- content: formatMessage(
1003
- {
1004
- id: "content-releases.page.Releases.tab.emptyEntries",
1005
- defaultMessage: "No releases"
1006
- },
1007
- {
1008
- target: sectionTitle
1009
- }
1010
- ),
1011
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
1012
- }
1013
- );
1014
- }
1015
- return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, actions, scheduledAt }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
1016
- Flex,
1017
- {
1018
- direction: "column",
1019
- justifyContent: "space-between",
1020
- padding: 4,
1021
- hasRadius: true,
1022
- background: "neutral0",
1023
- shadow: "tableShadow",
1024
- height: "100%",
1025
- width: "100%",
1026
- alignItems: "start",
1027
- gap: 2,
1028
- children: [
1029
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
1030
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: IsSchedulingEnabled ? scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
1031
- id: "content-releases.pages.Releases.not-scheduled",
1032
- defaultMessage: "Not scheduled"
1033
- }) : formatMessage(
1034
- {
1035
- id: "content-releases.page.Releases.release-item.entries",
1036
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
1037
- },
1038
- { number: actions.meta.count }
1039
- ) })
1040
- ]
1041
- }
1042
- ) }) }, id)) });
1043
- };
1044
- const StyledAlert = styled(Alert)`
1045
- button {
1046
- display: none;
1047
- }
1048
- p + div {
1049
- margin-left: auto;
1050
- }
1051
- `;
1052
- const INITIAL_FORM_VALUES = {
1053
- name: "",
1054
- date: null,
1055
- time: "",
1056
- // Remove future flag check after Scheduling Beta release and replace with true as creating new release should include scheduling by default
1057
- isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
1058
- scheduledAt: null,
1059
- timezone: null
1060
- };
1061
- const ReleasesPage = () => {
1062
- const tabRef = React.useRef(null);
1063
- const location = useLocation();
1064
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1065
- const toggleNotification = useNotification();
1066
- const { formatMessage } = useIntl();
1067
- const { push, replace } = useHistory();
1068
- const { formatAPIError } = useAPIErrorHandler();
1069
- const [{ query }, setQuery] = useQueryParams();
1070
- const response = useGetReleasesQuery(query);
1071
- const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
1072
- const { getFeature } = useLicenseLimits();
1073
- const { maximumReleases = 3 } = getFeature("cms-content-releases");
1074
- const { trackUsage } = useTracking();
1075
- const { isLoading, isSuccess, isError } = response;
1076
- const activeTab = response?.currentData?.meta?.activeTab || "pending";
1077
- const activeTabIndex = ["pending", "done"].indexOf(activeTab);
1078
- React.useEffect(() => {
1079
- if (location?.state?.errors) {
1080
- toggleNotification({
1081
- type: "warning",
1082
- title: formatMessage({
1083
- id: "content-releases.pages.Releases.notification.error.title",
1084
- defaultMessage: "Your request could not be processed."
1085
- }),
1086
- message: formatMessage({
1087
- id: "content-releases.pages.Releases.notification.error.message",
1088
- defaultMessage: "Please try again or open another release."
1089
- })
1090
- });
1091
- replace({ state: null });
1092
- }
1093
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
1094
- React.useEffect(() => {
1095
- if (tabRef.current) {
1096
- tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
1097
- }
1098
- }, [activeTabIndex]);
1099
- const toggleAddReleaseModal = () => {
1184
+ }
1185
+ )
1186
+ ] }, `releases-group-${key}`)),
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
+ ] })
1198
+ ] }) });
1199
+ };
1200
+ const ReleaseDetailsPage = () => {
1201
+ const { formatMessage } = useIntl();
1202
+ const { releaseId } = useParams();
1203
+ const toggleNotification = useNotification();
1204
+ const { formatAPIError } = useAPIErrorHandler();
1205
+ const { replace } = useHistory();
1206
+ const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1207
+ const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1208
+ const {
1209
+ isLoading: isLoadingDetails,
1210
+ data,
1211
+ isSuccess: isSuccessDetails
1212
+ } = useGetReleaseQuery({ id: releaseId });
1213
+ const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1214
+ const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1215
+ const toggleEditReleaseModal = () => {
1100
1216
  setReleaseModalShown((prev) => !prev);
1101
1217
  };
1102
- if (isLoading) {
1103
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
1104
- }
1105
- const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
1106
- const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
1107
- const handleTabChange = (index) => {
1108
- setQuery({
1109
- ...query,
1110
- page: 1,
1111
- pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
1112
- filters: {
1113
- releasedAt: {
1114
- $notNull: index === 0 ? false : true
1115
- }
1218
+ const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1219
+ if (isLoadingDetails) {
1220
+ return /* @__PURE__ */ jsx(
1221
+ ReleaseDetailsLayout,
1222
+ {
1223
+ toggleEditReleaseModal,
1224
+ toggleWarningSubmit,
1225
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1116
1226
  }
1227
+ );
1228
+ }
1229
+ const releaseData = isSuccessDetails && data?.data || null;
1230
+ const title = releaseData?.name || "";
1231
+ const timezone = releaseData?.timezone ?? null;
1232
+ const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1233
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1234
+ const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1235
+ const handleEditRelease = async (values) => {
1236
+ const response = await updateRelease({
1237
+ id: releaseId,
1238
+ name: values.name,
1239
+ scheduledAt: values.scheduledAt,
1240
+ timezone: values.timezone
1117
1241
  });
1118
- };
1119
- const handleAddRelease = async ({ name, scheduledAt, timezone }) => {
1120
- const response2 = await createRelease({
1121
- name,
1122
- scheduledAt,
1123
- timezone
1124
- });
1125
- if ("data" in response2) {
1242
+ if ("data" in response) {
1126
1243
  toggleNotification({
1127
1244
  type: "success",
1128
1245
  message: formatMessage({
1129
- id: "content-releases.modal.release-created-notification-success",
1130
- defaultMessage: "Release created."
1246
+ id: "content-releases.modal.release-updated-notification-success",
1247
+ defaultMessage: "Release updated."
1131
1248
  })
1132
1249
  });
1133
- trackUsage("didCreateRelease");
1134
- push(`/plugins/content-releases/${response2.data.data.id}`);
1135
- } else if (isAxiosError(response2.error)) {
1250
+ toggleEditReleaseModal();
1251
+ } else if (isAxiosError(response.error)) {
1136
1252
  toggleNotification({
1137
1253
  type: "warning",
1138
- message: formatAPIError(response2.error)
1254
+ message: formatAPIError(response.error)
1139
1255
  });
1140
1256
  } else {
1141
1257
  toggleNotification({
@@ -1144,136 +1260,63 @@ const ReleasesPage = () => {
1144
1260
  });
1145
1261
  }
1146
1262
  };
1147
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
1148
- /* @__PURE__ */ jsx(
1149
- HeaderLayout,
1150
- {
1151
- title: formatMessage({
1152
- id: "content-releases.pages.Releases.title",
1153
- defaultMessage: "Releases"
1154
- }),
1155
- subtitle: formatMessage({
1156
- id: "content-releases.pages.Releases.header-subtitle",
1157
- defaultMessage: "Create and manage content updates"
1158
- }),
1159
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
1160
- Button,
1161
- {
1162
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
1163
- onClick: toggleAddReleaseModal,
1164
- disabled: hasReachedMaximumPendingReleases,
1165
- children: formatMessage({
1166
- id: "content-releases.header.actions.add-release",
1167
- defaultMessage: "New release"
1168
- })
1169
- }
1170
- ) })
1171
- }
1172
- ),
1173
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
1174
- hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
1175
- StyledAlert,
1176
- {
1177
- marginBottom: 6,
1178
- action: /* @__PURE__ */ jsx(Link$2, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
1179
- id: "content-releases.pages.Releases.max-limit-reached.action",
1180
- defaultMessage: "Explore plans"
1181
- }) }),
1182
- title: formatMessage(
1183
- {
1184
- id: "content-releases.pages.Releases.max-limit-reached.title",
1185
- defaultMessage: "You have reached the {number} pending {number, plural, one {release} other {releases}} limit."
1186
- },
1187
- { number: maximumReleases }
1188
- ),
1189
- onClose: () => {
1190
- },
1191
- closeLabel: "",
1192
- children: formatMessage({
1193
- id: "content-releases.pages.Releases.max-limit-reached.message",
1194
- defaultMessage: "Upgrade to manage an unlimited number of releases."
1195
- })
1196
- }
1197
- ),
1198
- /* @__PURE__ */ jsxs(
1199
- TabGroup,
1200
- {
1201
- label: formatMessage({
1202
- id: "content-releases.pages.Releases.tab-group.label",
1203
- defaultMessage: "Releases list"
1204
- }),
1205
- variant: "simple",
1206
- initialSelectedTabIndex: activeTabIndex,
1207
- onTabChange: handleTabChange,
1208
- ref: tabRef,
1209
- children: [
1210
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
1211
- /* @__PURE__ */ jsxs(Tabs, { children: [
1212
- /* @__PURE__ */ jsx(Tab, { children: formatMessage(
1213
- {
1214
- id: "content-releases.pages.Releases.tab.pending",
1215
- defaultMessage: "Pending ({count})"
1216
- },
1217
- {
1218
- count: totalPendingReleases
1219
- }
1220
- ) }),
1221
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
1222
- id: "content-releases.pages.Releases.tab.done",
1223
- defaultMessage: "Done"
1224
- }) })
1225
- ] }),
1226
- /* @__PURE__ */ jsx(Divider, {})
1227
- ] }),
1228
- /* @__PURE__ */ jsxs(TabPanels, { children: [
1229
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
1230
- ReleasesGrid,
1231
- {
1232
- sectionTitle: "pending",
1233
- releases: response?.currentData?.data,
1234
- isError
1235
- }
1236
- ) }),
1237
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
1238
- ReleasesGrid,
1239
- {
1240
- sectionTitle: "done",
1241
- releases: response?.currentData?.data,
1242
- isError
1243
- }
1244
- ) })
1245
- ] })
1246
- ]
1247
- }
1248
- ),
1249
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1250
- /* @__PURE__ */ jsx(
1251
- PageSizeURLQuery,
1263
+ const handleDeleteRelease = async () => {
1264
+ const response = await deleteRelease({
1265
+ id: releaseId
1266
+ });
1267
+ if ("data" in response) {
1268
+ replace("/plugins/content-releases");
1269
+ } else if (isAxiosError(response.error)) {
1270
+ toggleNotification({
1271
+ type: "warning",
1272
+ message: formatAPIError(response.error)
1273
+ });
1274
+ } else {
1275
+ toggleNotification({
1276
+ type: "warning",
1277
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1278
+ });
1279
+ }
1280
+ };
1281
+ return /* @__PURE__ */ jsxs(
1282
+ ReleaseDetailsLayout,
1283
+ {
1284
+ toggleEditReleaseModal,
1285
+ toggleWarningSubmit,
1286
+ children: [
1287
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1288
+ releaseModalShown && /* @__PURE__ */ jsx(
1289
+ ReleaseModal,
1252
1290
  {
1253
- options: ["8", "16", "32", "64"],
1254
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
1291
+ handleClose: toggleEditReleaseModal,
1292
+ handleSubmit: handleEditRelease,
1293
+ isLoading: isLoadingDetails || isSubmittingForm,
1294
+ initialValues: {
1295
+ name: title || "",
1296
+ scheduledAt,
1297
+ date,
1298
+ time,
1299
+ isScheduled: Boolean(scheduledAt),
1300
+ timezone
1301
+ }
1255
1302
  }
1256
1303
  ),
1257
1304
  /* @__PURE__ */ jsx(
1258
- PaginationURLQuery,
1305
+ ConfirmDialog,
1259
1306
  {
1260
- pagination: {
1261
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
1262
- }
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
1263
1315
  }
1264
1316
  )
1265
- ] }) : null
1266
- ] }) }),
1267
- releaseModalShown && /* @__PURE__ */ jsx(
1268
- ReleaseModal,
1269
- {
1270
- handleClose: toggleAddReleaseModal,
1271
- handleSubmit: handleAddRelease,
1272
- isLoading: isSubmittingForm,
1273
- initialValues: INITIAL_FORM_VALUES
1274
- }
1275
- )
1276
- ] });
1317
+ ]
1318
+ }
1319
+ );
1277
1320
  };
1278
1321
  const App = () => {
1279
1322
  return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
@@ -1284,4 +1327,4 @@ const App = () => {
1284
1327
  export {
1285
1328
  App
1286
1329
  };
1287
- //# sourceMappingURL=App-g3vtS2Wa.mjs.map
1330
+ //# sourceMappingURL=App-jrh58sXY.mjs.map