@strapi/content-releases 0.0.0-experimental.e5740babedd53cf5b6af99d74920b6b9ef1e4c11 → 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813
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.
- package/dist/_chunks/{App-HVXzE3i3.mjs → App-BsUSTHVD.mjs} +243 -213
- package/dist/_chunks/App-BsUSTHVD.mjs.map +1 -0
- package/dist/_chunks/{App-l62gIUTX.js → App-CXRpb2hi.js} +258 -228
- package/dist/_chunks/App-CXRpb2hi.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/{en-RdapH-9X.mjs → en-B9Ur3VsE.mjs} +11 -2
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
- package/dist/_chunks/{en-faJDuv3q.js → en-DtFJ5ViE.js} +11 -2
- package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
- package/dist/_chunks/{index-ML_b3php.js → index-B6-lic1Q.js} +340 -113
- package/dist/_chunks/index-B6-lic1Q.js.map +1 -0
- package/dist/_chunks/{index-Ys87ROOe.mjs → index-DJLIZdZv.mjs} +339 -112
- package/dist/_chunks/index-DJLIZdZv.mjs.map +1 -0
- package/dist/admin/index.js +1 -15
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -16
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
- package/dist/admin/src/components/RelativeTime.d.ts +28 -0
- package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
- package/dist/admin/src/constants.d.ts +58 -0
- package/dist/admin/src/index.d.ts +3 -0
- package/dist/admin/src/pages/App.d.ts +1 -0
- package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
- package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
- package/dist/admin/src/pluginId.d.ts +1 -0
- package/dist/admin/src/services/axios.d.ts +29 -0
- package/dist/admin/src/services/release.d.ts +429 -0
- package/dist/admin/src/store/hooks.d.ts +7 -0
- package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
- package/dist/admin/src/utils/time.d.ts +1 -0
- package/dist/server/index.js +152 -93
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +153 -93
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +5 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -0
- package/dist/server/src/constants.d.ts +12 -0
- package/dist/server/src/constants.d.ts.map +1 -0
- package/dist/server/src/content-types/index.d.ts +99 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -0
- package/dist/server/src/content-types/release/index.d.ts +48 -0
- package/dist/server/src/content-types/release/index.d.ts.map +1 -0
- package/dist/server/src/content-types/release/schema.d.ts +47 -0
- package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
- package/dist/server/src/content-types/release-action/index.d.ts +50 -0
- package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
- package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
- package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
- package/dist/server/src/controllers/index.d.ts +20 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -0
- package/dist/server/src/controllers/release-action.d.ts +10 -0
- package/dist/server/src/controllers/release-action.d.ts.map +1 -0
- package/dist/server/src/controllers/release.d.ts +12 -0
- package/dist/server/src/controllers/release.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
- package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release.d.ts +2 -0
- package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
- package/dist/server/src/destroy.d.ts +5 -0
- package/dist/server/src/destroy.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +2096 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/migrations/index.d.ts +13 -0
- package/dist/server/src/migrations/index.d.ts.map +1 -0
- package/dist/server/src/register.d.ts +5 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/dist/server/src/routes/index.d.ts +35 -0
- package/dist/server/src/routes/index.d.ts.map +1 -0
- package/dist/server/src/routes/release-action.d.ts +18 -0
- package/dist/server/src/routes/release-action.d.ts.map +1 -0
- package/dist/server/src/routes/release.d.ts +18 -0
- package/dist/server/src/routes/release.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +1826 -0
- package/dist/server/src/services/index.d.ts.map +1 -0
- package/dist/server/src/services/release.d.ts +66 -0
- package/dist/server/src/services/release.d.ts.map +1 -0
- package/dist/server/src/services/scheduling.d.ts +18 -0
- package/dist/server/src/services/scheduling.d.ts.map +1 -0
- package/dist/server/src/services/validation.d.ts +18 -0
- package/dist/server/src/services/validation.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +14 -0
- package/dist/server/src/utils/index.d.ts.map +1 -0
- package/dist/shared/contracts/release-actions.d.ts +131 -0
- package/dist/shared/contracts/release-actions.d.ts.map +1 -0
- package/dist/shared/contracts/releases.d.ts +182 -0
- package/dist/shared/contracts/releases.d.ts.map +1 -0
- package/dist/shared/types.d.ts +24 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/validation-schemas.d.ts +2 -0
- package/dist/shared/validation-schemas.d.ts.map +1 -0
- package/package.json +26 -31
- package/dist/_chunks/App-HVXzE3i3.mjs.map +0 -1
- package/dist/_chunks/App-l62gIUTX.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
- package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
- package/dist/_chunks/en-faJDuv3q.js.map +0 -1
- package/dist/_chunks/index-ML_b3php.js.map +0 -1
- package/dist/_chunks/index-Ys87ROOe.mjs.map +0 -1
|
@@ -1,23 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { useLocation,
|
|
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
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
|
+
import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
|
|
4
|
+
import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, j as ReleaseActionMenu, r as releaseApi } from "./index-DJLIZdZv.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
-
import {
|
|
7
|
-
import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Alert, Main,
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
+
import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Link, Alert, Main, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Menu, IconButton, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
|
|
8
|
+
import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
|
|
9
|
+
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
10
10
|
import format from "date-fns/format";
|
|
11
11
|
import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
|
|
12
12
|
import { useIntl } from "react-intl";
|
|
13
13
|
import styled from "styled-components";
|
|
14
|
-
import {
|
|
14
|
+
import { intervalToDuration, isPast, formatISO } from "date-fns";
|
|
15
15
|
import { Formik, Form, useFormikContext } from "formik";
|
|
16
16
|
import * as yup from "yup";
|
|
17
|
-
import "
|
|
18
|
-
import "
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
import { useDispatch } from "react-redux";
|
|
18
|
+
import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
|
|
19
|
+
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
20
|
+
const RelativeTime$1 = React.forwardRef(
|
|
21
|
+
({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
|
|
22
|
+
const { formatRelativeTime, formatDate, formatTime } = useIntl();
|
|
23
|
+
const interval = intervalToDuration({
|
|
24
|
+
start: timestamp,
|
|
25
|
+
end: Date.now()
|
|
26
|
+
// see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
|
|
27
|
+
});
|
|
28
|
+
const unit = intervals.find((intervalUnit) => {
|
|
29
|
+
return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
|
|
30
|
+
});
|
|
31
|
+
const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
|
|
32
|
+
const customInterval = customIntervals.find(
|
|
33
|
+
(custom) => interval[custom.unit] < custom.threshold
|
|
34
|
+
);
|
|
35
|
+
const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
|
|
36
|
+
return /* @__PURE__ */ jsx(
|
|
37
|
+
"time",
|
|
38
|
+
{
|
|
39
|
+
ref: forwardedRef,
|
|
40
|
+
dateTime: timestamp.toISOString(),
|
|
41
|
+
role: "time",
|
|
42
|
+
title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
|
|
43
|
+
...restProps,
|
|
44
|
+
children: displayText
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
);
|
|
21
49
|
const RELEASE_SCHEMA = yup.object().shape({
|
|
22
50
|
name: yup.string().trim().required(),
|
|
23
51
|
scheduledAt: yup.string().nullable(),
|
|
@@ -54,9 +82,8 @@ const ReleaseModal = ({
|
|
|
54
82
|
const { date, time, timezone } = values;
|
|
55
83
|
if (!date || !time || !timezone)
|
|
56
84
|
return null;
|
|
57
|
-
const formattedDate = parse(time, "HH:mm", new Date(date));
|
|
58
85
|
const timezoneWithoutOffset = timezone.split("&")[1];
|
|
59
|
-
return zonedTimeToUtc(
|
|
86
|
+
return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
|
|
60
87
|
};
|
|
61
88
|
const getTimezoneWithOffset = () => {
|
|
62
89
|
const currentTimezone = timezoneList.find(
|
|
@@ -256,11 +283,15 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
256
283
|
}
|
|
257
284
|
);
|
|
258
285
|
};
|
|
286
|
+
const useTypedDispatch = useDispatch;
|
|
259
287
|
const LinkCard = styled(Link)`
|
|
260
288
|
display: block;
|
|
261
289
|
`;
|
|
262
|
-
const
|
|
263
|
-
|
|
290
|
+
const RelativeTime = styled(RelativeTime$1)`
|
|
291
|
+
display: inline-block;
|
|
292
|
+
&::first-letter {
|
|
293
|
+
text-transform: uppercase;
|
|
294
|
+
}
|
|
264
295
|
`;
|
|
265
296
|
const getBadgeProps = (status) => {
|
|
266
297
|
let color;
|
|
@@ -290,7 +321,7 @@ const getBadgeProps = (status) => {
|
|
|
290
321
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
291
322
|
const { formatMessage } = useIntl();
|
|
292
323
|
if (isError) {
|
|
293
|
-
return /* @__PURE__ */ jsx(
|
|
324
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
294
325
|
}
|
|
295
326
|
if (releases?.length === 0) {
|
|
296
327
|
return /* @__PURE__ */ jsx(
|
|
@@ -305,7 +336,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
305
336
|
target: sectionTitle
|
|
306
337
|
}
|
|
307
338
|
),
|
|
308
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
339
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
|
|
309
340
|
}
|
|
310
341
|
);
|
|
311
342
|
}
|
|
@@ -325,7 +356,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
325
356
|
children: [
|
|
326
357
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
327
358
|
/* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
328
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(
|
|
359
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
329
360
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
330
361
|
defaultMessage: "Not scheduled"
|
|
331
362
|
}) })
|
|
@@ -355,9 +386,9 @@ const ReleasesPage = () => {
|
|
|
355
386
|
const tabRef = React.useRef(null);
|
|
356
387
|
const location = useLocation();
|
|
357
388
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
358
|
-
const toggleNotification = useNotification();
|
|
389
|
+
const { toggleNotification } = useNotification();
|
|
359
390
|
const { formatMessage } = useIntl();
|
|
360
|
-
const
|
|
391
|
+
const navigate = useNavigate();
|
|
361
392
|
const { formatAPIError } = useAPIErrorHandler();
|
|
362
393
|
const [{ query }, setQuery] = useQueryParams();
|
|
363
394
|
const response = useGetReleasesQuery(query);
|
|
@@ -365,13 +396,16 @@ const ReleasesPage = () => {
|
|
|
365
396
|
const { getFeature } = useLicenseLimits();
|
|
366
397
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
367
398
|
const { trackUsage } = useTracking();
|
|
399
|
+
const {
|
|
400
|
+
allowedActions: { canCreate }
|
|
401
|
+
} = useRBAC(PERMISSIONS);
|
|
368
402
|
const { isLoading, isSuccess, isError } = response;
|
|
369
403
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
370
404
|
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
371
405
|
React.useEffect(() => {
|
|
372
406
|
if (location?.state?.errors) {
|
|
373
407
|
toggleNotification({
|
|
374
|
-
type: "
|
|
408
|
+
type: "danger",
|
|
375
409
|
title: formatMessage({
|
|
376
410
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
377
411
|
defaultMessage: "Your request could not be processed."
|
|
@@ -381,9 +415,9 @@ const ReleasesPage = () => {
|
|
|
381
415
|
defaultMessage: "Please try again or open another release."
|
|
382
416
|
})
|
|
383
417
|
});
|
|
384
|
-
|
|
418
|
+
navigate("", { replace: true, state: null });
|
|
385
419
|
}
|
|
386
|
-
}, [formatMessage, location?.state?.errors,
|
|
420
|
+
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
387
421
|
React.useEffect(() => {
|
|
388
422
|
if (tabRef.current) {
|
|
389
423
|
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
@@ -393,7 +427,7 @@ const ReleasesPage = () => {
|
|
|
393
427
|
setReleaseModalShown((prev) => !prev);
|
|
394
428
|
};
|
|
395
429
|
if (isLoading) {
|
|
396
|
-
return /* @__PURE__ */ jsx(
|
|
430
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
397
431
|
}
|
|
398
432
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
399
433
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
@@ -424,22 +458,22 @@ const ReleasesPage = () => {
|
|
|
424
458
|
})
|
|
425
459
|
});
|
|
426
460
|
trackUsage("didCreateRelease");
|
|
427
|
-
|
|
461
|
+
navigate(response2.data.data.id.toString());
|
|
428
462
|
} else if (isAxiosError(response2.error)) {
|
|
429
463
|
toggleNotification({
|
|
430
|
-
type: "
|
|
464
|
+
type: "danger",
|
|
431
465
|
message: formatAPIError(response2.error)
|
|
432
466
|
});
|
|
433
467
|
} else {
|
|
434
468
|
toggleNotification({
|
|
435
|
-
type: "
|
|
469
|
+
type: "danger",
|
|
436
470
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
437
471
|
});
|
|
438
472
|
}
|
|
439
473
|
};
|
|
440
474
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
|
|
441
475
|
/* @__PURE__ */ jsx(
|
|
442
|
-
|
|
476
|
+
Layouts.Header,
|
|
443
477
|
{
|
|
444
478
|
title: formatMessage({
|
|
445
479
|
id: "content-releases.pages.Releases.title",
|
|
@@ -449,7 +483,7 @@ const ReleasesPage = () => {
|
|
|
449
483
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
450
484
|
defaultMessage: "Create and manage content updates"
|
|
451
485
|
}),
|
|
452
|
-
primaryAction:
|
|
486
|
+
primaryAction: canCreate ? /* @__PURE__ */ jsx(
|
|
453
487
|
Button,
|
|
454
488
|
{
|
|
455
489
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -460,10 +494,10 @@ const ReleasesPage = () => {
|
|
|
460
494
|
defaultMessage: "New release"
|
|
461
495
|
})
|
|
462
496
|
}
|
|
463
|
-
)
|
|
497
|
+
) : null
|
|
464
498
|
}
|
|
465
499
|
),
|
|
466
|
-
/* @__PURE__ */ jsx(
|
|
500
|
+
/* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
467
501
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
468
502
|
StyledAlert,
|
|
469
503
|
{
|
|
@@ -539,23 +573,17 @@ const ReleasesPage = () => {
|
|
|
539
573
|
]
|
|
540
574
|
}
|
|
541
575
|
),
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
pagination: {
|
|
554
|
-
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
)
|
|
558
|
-
] }) : null
|
|
576
|
+
/* @__PURE__ */ jsxs(
|
|
577
|
+
Pagination.Root,
|
|
578
|
+
{
|
|
579
|
+
...response?.currentData?.meta?.pagination,
|
|
580
|
+
defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
|
|
581
|
+
children: [
|
|
582
|
+
/* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
|
|
583
|
+
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
584
|
+
]
|
|
585
|
+
}
|
|
586
|
+
)
|
|
559
587
|
] }) }),
|
|
560
588
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
561
589
|
ReleaseModal,
|
|
@@ -603,14 +631,18 @@ const TrashIcon = styled(Trash)`
|
|
|
603
631
|
const TypographyMaxWidth = styled(Typography)`
|
|
604
632
|
max-width: 300px;
|
|
605
633
|
`;
|
|
606
|
-
const EntryValidationText = ({ action, schema,
|
|
634
|
+
const EntryValidationText = ({ action, schema, entry }) => {
|
|
607
635
|
const { formatMessage } = useIntl();
|
|
608
|
-
const { validate } = unstable_useDocument(
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
636
|
+
const { validate } = unstable_useDocument(
|
|
637
|
+
{
|
|
638
|
+
collectionType: schema?.kind ?? "",
|
|
639
|
+
model: schema?.uid ?? ""
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
skip: !schema
|
|
643
|
+
}
|
|
644
|
+
);
|
|
645
|
+
const errors = validate(entry) ?? {};
|
|
614
646
|
if (Object.keys(errors).length > 0) {
|
|
615
647
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
616
648
|
([key, value]) => formatMessage(
|
|
@@ -619,13 +651,13 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
|
619
651
|
)
|
|
620
652
|
).join(" ");
|
|
621
653
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
622
|
-
/* @__PURE__ */ jsx(
|
|
654
|
+
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
623
655
|
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
624
656
|
] });
|
|
625
657
|
}
|
|
626
658
|
if (action == "publish") {
|
|
627
659
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
628
|
-
/* @__PURE__ */ jsx(
|
|
660
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
629
661
|
entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
630
662
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
631
663
|
defaultMessage: "Already published"
|
|
@@ -636,7 +668,7 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
|
636
668
|
] });
|
|
637
669
|
}
|
|
638
670
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
639
|
-
/* @__PURE__ */ jsx(
|
|
671
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
640
672
|
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
641
673
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
642
674
|
defaultMessage: "Already unpublished"
|
|
@@ -658,18 +690,22 @@ const ReleaseDetailsLayout = ({
|
|
|
658
690
|
isLoading: isLoadingDetails,
|
|
659
691
|
isError,
|
|
660
692
|
error
|
|
661
|
-
} = useGetReleaseQuery(
|
|
693
|
+
} = useGetReleaseQuery(
|
|
694
|
+
{ id: releaseId },
|
|
695
|
+
{
|
|
696
|
+
skip: !releaseId
|
|
697
|
+
}
|
|
698
|
+
);
|
|
662
699
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
663
|
-
const toggleNotification = useNotification();
|
|
700
|
+
const { toggleNotification } = useNotification();
|
|
664
701
|
const { formatAPIError } = useAPIErrorHandler();
|
|
665
|
-
const {
|
|
666
|
-
|
|
667
|
-
} = useRBAC(PERMISSIONS);
|
|
702
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
703
|
+
const { canUpdate, canDelete, canPublish } = allowedActions;
|
|
668
704
|
const dispatch = useTypedDispatch();
|
|
669
705
|
const { trackUsage } = useTracking();
|
|
670
706
|
const release = data?.data;
|
|
671
|
-
const handlePublishRelease = async () => {
|
|
672
|
-
const response = await publishRelease({ id
|
|
707
|
+
const handlePublishRelease = (id) => async () => {
|
|
708
|
+
const response = await publishRelease({ id });
|
|
673
709
|
if ("data" in response) {
|
|
674
710
|
toggleNotification({
|
|
675
711
|
type: "success",
|
|
@@ -686,12 +722,12 @@ const ReleaseDetailsLayout = ({
|
|
|
686
722
|
});
|
|
687
723
|
} else if (isAxiosError(response.error)) {
|
|
688
724
|
toggleNotification({
|
|
689
|
-
type: "
|
|
725
|
+
type: "danger",
|
|
690
726
|
message: formatAPIError(response.error)
|
|
691
727
|
});
|
|
692
728
|
} else {
|
|
693
729
|
toggleNotification({
|
|
694
|
-
type: "
|
|
730
|
+
type: "danger",
|
|
695
731
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
696
732
|
});
|
|
697
733
|
}
|
|
@@ -717,21 +753,19 @@ const ReleaseDetailsLayout = ({
|
|
|
717
753
|
return release.createdBy.email;
|
|
718
754
|
};
|
|
719
755
|
if (isLoadingDetails) {
|
|
720
|
-
return /* @__PURE__ */ jsx(
|
|
756
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
721
757
|
}
|
|
722
758
|
if (isError || !release) {
|
|
723
759
|
return /* @__PURE__ */ jsx(
|
|
724
|
-
|
|
760
|
+
Navigate,
|
|
725
761
|
{
|
|
726
|
-
to:
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
]
|
|
734
|
-
}
|
|
762
|
+
to: "..",
|
|
763
|
+
state: {
|
|
764
|
+
errors: [
|
|
765
|
+
{
|
|
766
|
+
code: error?.code
|
|
767
|
+
}
|
|
768
|
+
]
|
|
735
769
|
}
|
|
736
770
|
}
|
|
737
771
|
);
|
|
@@ -768,17 +802,14 @@ const ReleaseDetailsLayout = ({
|
|
|
768
802
|
) : "";
|
|
769
803
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
770
804
|
/* @__PURE__ */ jsx(
|
|
771
|
-
|
|
805
|
+
Layouts.Header,
|
|
772
806
|
{
|
|
773
807
|
title: release.name,
|
|
774
808
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
775
809
|
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
776
810
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
777
811
|
] }),
|
|
778
|
-
navigationAction: /* @__PURE__ */ jsx(
|
|
779
|
-
id: "global.back",
|
|
780
|
-
defaultMessage: "Back"
|
|
781
|
-
}) }),
|
|
812
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
782
813
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
783
814
|
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
784
815
|
/* @__PURE__ */ jsx(
|
|
@@ -795,7 +826,7 @@ const ReleaseDetailsLayout = ({
|
|
|
795
826
|
variant: "tertiary"
|
|
796
827
|
}
|
|
797
828
|
),
|
|
798
|
-
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
|
|
829
|
+
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
|
|
799
830
|
/* @__PURE__ */ jsxs(
|
|
800
831
|
Flex,
|
|
801
832
|
{
|
|
@@ -844,7 +875,7 @@ const ReleaseDetailsLayout = ({
|
|
|
844
875
|
defaultMessage: "Created"
|
|
845
876
|
}) }),
|
|
846
877
|
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
847
|
-
/* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
|
|
878
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
848
879
|
formatMessage(
|
|
849
880
|
{
|
|
850
881
|
id: "content-releases.header.actions.created.description",
|
|
@@ -862,12 +893,12 @@ const ReleaseDetailsLayout = ({
|
|
|
862
893
|
id: "content-releases.header.actions.refresh",
|
|
863
894
|
defaultMessage: "Refresh"
|
|
864
895
|
}) }),
|
|
865
|
-
|
|
896
|
+
canPublish ? /* @__PURE__ */ jsx(
|
|
866
897
|
Button,
|
|
867
898
|
{
|
|
868
899
|
size: "S",
|
|
869
900
|
variant: "default",
|
|
870
|
-
onClick: handlePublishRelease,
|
|
901
|
+
onClick: handlePublishRelease(release.id.toString()),
|
|
871
902
|
loading: isPublishing,
|
|
872
903
|
disabled: release.actions.meta.count === 0,
|
|
873
904
|
children: formatMessage({
|
|
@@ -875,7 +906,7 @@ const ReleaseDetailsLayout = ({
|
|
|
875
906
|
defaultMessage: "Publish"
|
|
876
907
|
})
|
|
877
908
|
}
|
|
878
|
-
)
|
|
909
|
+
) : null
|
|
879
910
|
] })
|
|
880
911
|
}
|
|
881
912
|
),
|
|
@@ -883,6 +914,7 @@ const ReleaseDetailsLayout = ({
|
|
|
883
914
|
] });
|
|
884
915
|
};
|
|
885
916
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
917
|
+
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
886
918
|
const getGroupByOptionLabel = (value) => {
|
|
887
919
|
if (value === "locale") {
|
|
888
920
|
return {
|
|
@@ -901,11 +933,10 @@ const getGroupByOptionLabel = (value) => {
|
|
|
901
933
|
defaultMessage: "Content-Types"
|
|
902
934
|
};
|
|
903
935
|
};
|
|
904
|
-
const ReleaseDetailsBody = () => {
|
|
936
|
+
const ReleaseDetailsBody = ({ releaseId }) => {
|
|
905
937
|
const { formatMessage } = useIntl();
|
|
906
|
-
const { releaseId } = useParams();
|
|
907
938
|
const [{ query }, setQuery] = useQueryParams();
|
|
908
|
-
const toggleNotification = useNotification();
|
|
939
|
+
const { toggleNotification } = useNotification();
|
|
909
940
|
const { formatAPIError } = useAPIErrorHandler();
|
|
910
941
|
const {
|
|
911
942
|
data: releaseData,
|
|
@@ -916,6 +947,20 @@ const ReleaseDetailsBody = () => {
|
|
|
916
947
|
const {
|
|
917
948
|
allowedActions: { canUpdate }
|
|
918
949
|
} = useRBAC(PERMISSIONS);
|
|
950
|
+
const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
|
|
951
|
+
const { hasI18nEnabled } = runHookWaterfall(
|
|
952
|
+
"ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
|
|
953
|
+
{
|
|
954
|
+
displayedHeaders: {
|
|
955
|
+
label: formatMessage({
|
|
956
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
957
|
+
defaultMessage: "locale"
|
|
958
|
+
}),
|
|
959
|
+
name: "locale"
|
|
960
|
+
},
|
|
961
|
+
hasI18nEnabled: false
|
|
962
|
+
}
|
|
963
|
+
);
|
|
919
964
|
const release = releaseData?.data;
|
|
920
965
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
921
966
|
const {
|
|
@@ -946,19 +991,19 @@ const ReleaseDetailsBody = () => {
|
|
|
946
991
|
if ("error" in response) {
|
|
947
992
|
if (isAxiosError(response.error)) {
|
|
948
993
|
toggleNotification({
|
|
949
|
-
type: "
|
|
994
|
+
type: "danger",
|
|
950
995
|
message: formatAPIError(response.error)
|
|
951
996
|
});
|
|
952
997
|
} else {
|
|
953
998
|
toggleNotification({
|
|
954
|
-
type: "
|
|
999
|
+
type: "danger",
|
|
955
1000
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
956
1001
|
});
|
|
957
1002
|
}
|
|
958
1003
|
}
|
|
959
1004
|
};
|
|
960
1005
|
if (isLoading || isReleaseLoading) {
|
|
961
|
-
return /* @__PURE__ */ jsx(
|
|
1006
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
962
1007
|
}
|
|
963
1008
|
const releaseActions = data?.data;
|
|
964
1009
|
const releaseMeta = data?.meta;
|
|
@@ -977,32 +1022,26 @@ const ReleaseDetailsBody = () => {
|
|
|
977
1022
|
});
|
|
978
1023
|
}
|
|
979
1024
|
return /* @__PURE__ */ jsx(
|
|
980
|
-
|
|
1025
|
+
Navigate,
|
|
981
1026
|
{
|
|
982
|
-
to:
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
errors: errorsArray
|
|
986
|
-
}
|
|
1027
|
+
to: "..",
|
|
1028
|
+
state: {
|
|
1029
|
+
errors: errorsArray
|
|
987
1030
|
}
|
|
988
1031
|
}
|
|
989
1032
|
);
|
|
990
1033
|
}
|
|
991
1034
|
if (isError || !releaseActions) {
|
|
992
|
-
return /* @__PURE__ */ jsx(
|
|
1035
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
993
1036
|
}
|
|
994
1037
|
if (Object.keys(releaseActions).length === 0) {
|
|
995
|
-
return /* @__PURE__ */ jsx(
|
|
996
|
-
|
|
1038
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
|
|
1039
|
+
EmptyStateLayout,
|
|
997
1040
|
{
|
|
998
|
-
content: {
|
|
999
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1000
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1001
|
-
},
|
|
1002
1041
|
action: /* @__PURE__ */ jsx(
|
|
1003
1042
|
LinkButton,
|
|
1004
1043
|
{
|
|
1005
|
-
as: Link$
|
|
1044
|
+
as: Link$1,
|
|
1006
1045
|
to: {
|
|
1007
1046
|
pathname: "/content-manager"
|
|
1008
1047
|
},
|
|
@@ -1013,18 +1052,59 @@ const ReleaseDetailsBody = () => {
|
|
|
1013
1052
|
defaultMessage: "Open the Content Manager"
|
|
1014
1053
|
})
|
|
1015
1054
|
}
|
|
1016
|
-
)
|
|
1055
|
+
),
|
|
1056
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
1057
|
+
content: formatMessage({
|
|
1058
|
+
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1059
|
+
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1060
|
+
})
|
|
1017
1061
|
}
|
|
1018
1062
|
) });
|
|
1019
1063
|
}
|
|
1020
|
-
|
|
1064
|
+
const groupByLabel = formatMessage({
|
|
1065
|
+
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1066
|
+
defaultMessage: "Group by"
|
|
1067
|
+
});
|
|
1068
|
+
const headers = [
|
|
1069
|
+
// ...displayedHeaders,
|
|
1070
|
+
{
|
|
1071
|
+
label: formatMessage({
|
|
1072
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1073
|
+
defaultMessage: "name"
|
|
1074
|
+
}),
|
|
1075
|
+
name: "name"
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
label: formatMessage({
|
|
1079
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1080
|
+
defaultMessage: "content-type"
|
|
1081
|
+
}),
|
|
1082
|
+
name: "content-type"
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
label: formatMessage({
|
|
1086
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1087
|
+
defaultMessage: "action"
|
|
1088
|
+
}),
|
|
1089
|
+
name: "action"
|
|
1090
|
+
},
|
|
1091
|
+
...!release.releasedAt ? [
|
|
1092
|
+
{
|
|
1093
|
+
label: formatMessage({
|
|
1094
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1095
|
+
defaultMessage: "status"
|
|
1096
|
+
}),
|
|
1097
|
+
name: "status"
|
|
1098
|
+
}
|
|
1099
|
+
] : []
|
|
1100
|
+
];
|
|
1101
|
+
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1102
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1021
1103
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1022
1104
|
SingleSelect,
|
|
1023
1105
|
{
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
defaultMessage: "Group by"
|
|
1027
|
-
}),
|
|
1106
|
+
placeholder: groupByLabel,
|
|
1107
|
+
"aria-label": groupByLabel,
|
|
1028
1108
|
customizeContent: (value) => formatMessage(
|
|
1029
1109
|
{
|
|
1030
1110
|
id: `content-releases.pages.ReleaseDetails.groupBy.label`,
|
|
@@ -1036,7 +1116,7 @@ const ReleaseDetailsBody = () => {
|
|
|
1036
1116
|
),
|
|
1037
1117
|
value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
|
|
1038
1118
|
onChange: (value) => setQuery({ groupBy: value }),
|
|
1039
|
-
children:
|
|
1119
|
+
children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
|
|
1040
1120
|
}
|
|
1041
1121
|
) }),
|
|
1042
1122
|
Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
|
|
@@ -1048,72 +1128,15 @@ const ReleaseDetailsBody = () => {
|
|
|
1048
1128
|
...item,
|
|
1049
1129
|
id: Number(item.entry.id)
|
|
1050
1130
|
})),
|
|
1051
|
-
|
|
1052
|
-
isLoading,
|
|
1053
|
-
isFetching,
|
|
1131
|
+
headers,
|
|
1132
|
+
isLoading: isLoading || isFetching,
|
|
1054
1133
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1055
|
-
/* @__PURE__ */
|
|
1056
|
-
|
|
1057
|
-
Table.HeaderCell,
|
|
1058
|
-
{
|
|
1059
|
-
fieldSchemaType: "string",
|
|
1060
|
-
label: formatMessage({
|
|
1061
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1062
|
-
defaultMessage: "name"
|
|
1063
|
-
}),
|
|
1064
|
-
name: "name"
|
|
1065
|
-
}
|
|
1066
|
-
),
|
|
1067
|
-
/* @__PURE__ */ jsx(
|
|
1068
|
-
Table.HeaderCell,
|
|
1069
|
-
{
|
|
1070
|
-
fieldSchemaType: "string",
|
|
1071
|
-
label: formatMessage({
|
|
1072
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1073
|
-
defaultMessage: "locale"
|
|
1074
|
-
}),
|
|
1075
|
-
name: "locale"
|
|
1076
|
-
}
|
|
1077
|
-
),
|
|
1078
|
-
/* @__PURE__ */ jsx(
|
|
1079
|
-
Table.HeaderCell,
|
|
1080
|
-
{
|
|
1081
|
-
fieldSchemaType: "string",
|
|
1082
|
-
label: formatMessage({
|
|
1083
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1084
|
-
defaultMessage: "content-type"
|
|
1085
|
-
}),
|
|
1086
|
-
name: "content-type"
|
|
1087
|
-
}
|
|
1088
|
-
),
|
|
1089
|
-
/* @__PURE__ */ jsx(
|
|
1090
|
-
Table.HeaderCell,
|
|
1091
|
-
{
|
|
1092
|
-
fieldSchemaType: "string",
|
|
1093
|
-
label: formatMessage({
|
|
1094
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1095
|
-
defaultMessage: "action"
|
|
1096
|
-
}),
|
|
1097
|
-
name: "action"
|
|
1098
|
-
}
|
|
1099
|
-
),
|
|
1100
|
-
!release.releasedAt && /* @__PURE__ */ jsx(
|
|
1101
|
-
Table.HeaderCell,
|
|
1102
|
-
{
|
|
1103
|
-
fieldSchemaType: "string",
|
|
1104
|
-
label: formatMessage({
|
|
1105
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1106
|
-
defaultMessage: "status"
|
|
1107
|
-
}),
|
|
1108
|
-
name: "status"
|
|
1109
|
-
}
|
|
1110
|
-
)
|
|
1111
|
-
] }),
|
|
1112
|
-
/* @__PURE__ */ jsx(Table.LoadingBody, {}),
|
|
1134
|
+
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
|
|
1135
|
+
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1113
1136
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1114
1137
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1115
1138
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1116
|
-
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1139
|
+
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1117
1140
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
1118
1141
|
/* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
|
|
1119
1142
|
{
|
|
@@ -1167,34 +1190,39 @@ const ReleaseDetailsBody = () => {
|
|
|
1167
1190
|
}
|
|
1168
1191
|
)
|
|
1169
1192
|
] }, `releases-group-${key}`)),
|
|
1170
|
-
/* @__PURE__ */ jsxs(
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
}
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1193
|
+
/* @__PURE__ */ jsxs(
|
|
1194
|
+
Pagination.Root,
|
|
1195
|
+
{
|
|
1196
|
+
...releaseMeta?.pagination,
|
|
1197
|
+
defaultPageSize: releaseMeta?.pagination?.pageSize,
|
|
1198
|
+
children: [
|
|
1199
|
+
/* @__PURE__ */ jsx(Pagination.PageSize, {}),
|
|
1200
|
+
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
1201
|
+
]
|
|
1202
|
+
}
|
|
1203
|
+
)
|
|
1181
1204
|
] }) });
|
|
1182
1205
|
};
|
|
1183
1206
|
const ReleaseDetailsPage = () => {
|
|
1184
1207
|
const { formatMessage } = useIntl();
|
|
1185
1208
|
const { releaseId } = useParams();
|
|
1186
|
-
const toggleNotification = useNotification();
|
|
1209
|
+
const { toggleNotification } = useNotification();
|
|
1187
1210
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1188
|
-
const
|
|
1211
|
+
const navigate = useNavigate();
|
|
1189
1212
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1190
1213
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1191
1214
|
const {
|
|
1192
1215
|
isLoading: isLoadingDetails,
|
|
1193
1216
|
data,
|
|
1194
1217
|
isSuccess: isSuccessDetails
|
|
1195
|
-
} = useGetReleaseQuery(
|
|
1218
|
+
} = useGetReleaseQuery(
|
|
1219
|
+
{ id: releaseId },
|
|
1220
|
+
{
|
|
1221
|
+
skip: !releaseId
|
|
1222
|
+
}
|
|
1223
|
+
);
|
|
1196
1224
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1197
|
-
const [deleteRelease
|
|
1225
|
+
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1198
1226
|
const toggleEditReleaseModal = () => {
|
|
1199
1227
|
setReleaseModalShown((prev) => !prev);
|
|
1200
1228
|
};
|
|
@@ -1205,15 +1233,18 @@ const ReleaseDetailsPage = () => {
|
|
|
1205
1233
|
{
|
|
1206
1234
|
toggleEditReleaseModal,
|
|
1207
1235
|
toggleWarningSubmit,
|
|
1208
|
-
children: /* @__PURE__ */ jsx(
|
|
1236
|
+
children: /* @__PURE__ */ jsx(Page.Loading, {})
|
|
1209
1237
|
}
|
|
1210
1238
|
);
|
|
1211
1239
|
}
|
|
1240
|
+
if (!releaseId) {
|
|
1241
|
+
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1242
|
+
}
|
|
1212
1243
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1213
1244
|
const title = releaseData?.name || "";
|
|
1214
1245
|
const timezone = releaseData?.timezone ?? null;
|
|
1215
1246
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1216
|
-
const date = scheduledAt ?
|
|
1247
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
|
|
1217
1248
|
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1218
1249
|
const handleEditRelease = async (values) => {
|
|
1219
1250
|
const response = await updateRelease({
|
|
@@ -1230,33 +1261,33 @@ const ReleaseDetailsPage = () => {
|
|
|
1230
1261
|
defaultMessage: "Release updated."
|
|
1231
1262
|
})
|
|
1232
1263
|
});
|
|
1264
|
+
toggleEditReleaseModal();
|
|
1233
1265
|
} else if (isAxiosError(response.error)) {
|
|
1234
1266
|
toggleNotification({
|
|
1235
|
-
type: "
|
|
1267
|
+
type: "danger",
|
|
1236
1268
|
message: formatAPIError(response.error)
|
|
1237
1269
|
});
|
|
1238
1270
|
} else {
|
|
1239
1271
|
toggleNotification({
|
|
1240
|
-
type: "
|
|
1272
|
+
type: "danger",
|
|
1241
1273
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1242
1274
|
});
|
|
1243
1275
|
}
|
|
1244
|
-
toggleEditReleaseModal();
|
|
1245
1276
|
};
|
|
1246
1277
|
const handleDeleteRelease = async () => {
|
|
1247
1278
|
const response = await deleteRelease({
|
|
1248
1279
|
id: releaseId
|
|
1249
1280
|
});
|
|
1250
1281
|
if ("data" in response) {
|
|
1251
|
-
|
|
1282
|
+
navigate("..");
|
|
1252
1283
|
} else if (isAxiosError(response.error)) {
|
|
1253
1284
|
toggleNotification({
|
|
1254
|
-
type: "
|
|
1285
|
+
type: "danger",
|
|
1255
1286
|
message: formatAPIError(response.error)
|
|
1256
1287
|
});
|
|
1257
1288
|
} else {
|
|
1258
1289
|
toggleNotification({
|
|
1259
|
-
type: "
|
|
1290
|
+
type: "danger",
|
|
1260
1291
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1261
1292
|
});
|
|
1262
1293
|
}
|
|
@@ -1267,7 +1298,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1267
1298
|
toggleEditReleaseModal,
|
|
1268
1299
|
toggleWarningSubmit,
|
|
1269
1300
|
children: [
|
|
1270
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1301
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1271
1302
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1272
1303
|
ReleaseModal,
|
|
1273
1304
|
{
|
|
@@ -1287,14 +1318,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1287
1318
|
/* @__PURE__ */ jsx(
|
|
1288
1319
|
ConfirmDialog,
|
|
1289
1320
|
{
|
|
1290
|
-
|
|
1321
|
+
isOpen: showWarningSubmit,
|
|
1322
|
+
onClose: toggleWarningSubmit,
|
|
1323
|
+
onConfirm: handleDeleteRelease,
|
|
1324
|
+
children: formatMessage({
|
|
1291
1325
|
id: "content-releases.dialog.confirmation-message",
|
|
1292
1326
|
defaultMessage: "Are you sure you want to delete this release?"
|
|
1293
|
-
}
|
|
1294
|
-
isOpen: showWarningSubmit,
|
|
1295
|
-
isConfirmButtonLoading: isDeletingRelease,
|
|
1296
|
-
onToggleDialog: toggleWarningSubmit,
|
|
1297
|
-
onConfirm: handleDeleteRelease
|
|
1327
|
+
})
|
|
1298
1328
|
}
|
|
1299
1329
|
)
|
|
1300
1330
|
]
|
|
@@ -1302,12 +1332,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1302
1332
|
);
|
|
1303
1333
|
};
|
|
1304
1334
|
const App = () => {
|
|
1305
|
-
return /* @__PURE__ */ jsx(
|
|
1306
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1307
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1335
|
+
return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
|
|
1336
|
+
/* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
|
|
1337
|
+
/* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
|
|
1308
1338
|
] }) });
|
|
1309
1339
|
};
|
|
1310
1340
|
export {
|
|
1311
1341
|
App
|
|
1312
1342
|
};
|
|
1313
|
-
//# sourceMappingURL=App-
|
|
1343
|
+
//# sourceMappingURL=App-BsUSTHVD.mjs.map
|