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

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