@strapi/content-releases 0.0.0-experimental.e47108ccbbc4ad1bfaf4526fa6b70d6ace1ca7a9 → 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-XbK-TdJn.mjs → App-BsUSTHVD.mjs} +241 -210
- package/dist/_chunks/App-BsUSTHVD.mjs.map +1 -0
- package/dist/_chunks/{App-ftICpqDz.js → App-CXRpb2hi.js} +256 -225
- package/dist/_chunks/App-CXRpb2hi.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/{en-pOJ6G5fC.mjs → en-B9Ur3VsE.mjs} +10 -1
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
- package/dist/_chunks/{en-4CUzVH2g.js → en-DtFJ5ViE.js} +10 -1
- package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
- package/dist/_chunks/{index-RYVGXFeL.js → index-B6-lic1Q.js} +340 -113
- package/dist/_chunks/index-B6-lic1Q.js.map +1 -0
- package/dist/_chunks/{index-8LrruHqK.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-XbK-TdJn.mjs.map +0 -1
- package/dist/_chunks/App-ftICpqDz.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
- package/dist/_chunks/en-4CUzVH2g.js.map +0 -1
- package/dist/_chunks/en-pOJ6G5fC.mjs.map +0 -1
- package/dist/_chunks/index-8LrruHqK.mjs.map +0 -1
- package/dist/_chunks/index-RYVGXFeL.js.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 { formatISO } from "date-fns";
|
|
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(),
|
|
@@ -255,11 +283,15 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
255
283
|
}
|
|
256
284
|
);
|
|
257
285
|
};
|
|
286
|
+
const useTypedDispatch = useDispatch;
|
|
258
287
|
const LinkCard = styled(Link)`
|
|
259
288
|
display: block;
|
|
260
289
|
`;
|
|
261
|
-
const
|
|
262
|
-
|
|
290
|
+
const RelativeTime = styled(RelativeTime$1)`
|
|
291
|
+
display: inline-block;
|
|
292
|
+
&::first-letter {
|
|
293
|
+
text-transform: uppercase;
|
|
294
|
+
}
|
|
263
295
|
`;
|
|
264
296
|
const getBadgeProps = (status) => {
|
|
265
297
|
let color;
|
|
@@ -289,7 +321,7 @@ const getBadgeProps = (status) => {
|
|
|
289
321
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
290
322
|
const { formatMessage } = useIntl();
|
|
291
323
|
if (isError) {
|
|
292
|
-
return /* @__PURE__ */ jsx(
|
|
324
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
293
325
|
}
|
|
294
326
|
if (releases?.length === 0) {
|
|
295
327
|
return /* @__PURE__ */ jsx(
|
|
@@ -304,7 +336,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
304
336
|
target: sectionTitle
|
|
305
337
|
}
|
|
306
338
|
),
|
|
307
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
339
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
|
|
308
340
|
}
|
|
309
341
|
);
|
|
310
342
|
}
|
|
@@ -324,7 +356,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
324
356
|
children: [
|
|
325
357
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
326
358
|
/* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
327
|
-
/* @__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({
|
|
328
360
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
329
361
|
defaultMessage: "Not scheduled"
|
|
330
362
|
}) })
|
|
@@ -354,9 +386,9 @@ const ReleasesPage = () => {
|
|
|
354
386
|
const tabRef = React.useRef(null);
|
|
355
387
|
const location = useLocation();
|
|
356
388
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
357
|
-
const toggleNotification = useNotification();
|
|
389
|
+
const { toggleNotification } = useNotification();
|
|
358
390
|
const { formatMessage } = useIntl();
|
|
359
|
-
const
|
|
391
|
+
const navigate = useNavigate();
|
|
360
392
|
const { formatAPIError } = useAPIErrorHandler();
|
|
361
393
|
const [{ query }, setQuery] = useQueryParams();
|
|
362
394
|
const response = useGetReleasesQuery(query);
|
|
@@ -364,13 +396,16 @@ const ReleasesPage = () => {
|
|
|
364
396
|
const { getFeature } = useLicenseLimits();
|
|
365
397
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
366
398
|
const { trackUsage } = useTracking();
|
|
399
|
+
const {
|
|
400
|
+
allowedActions: { canCreate }
|
|
401
|
+
} = useRBAC(PERMISSIONS);
|
|
367
402
|
const { isLoading, isSuccess, isError } = response;
|
|
368
403
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
369
404
|
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
370
405
|
React.useEffect(() => {
|
|
371
406
|
if (location?.state?.errors) {
|
|
372
407
|
toggleNotification({
|
|
373
|
-
type: "
|
|
408
|
+
type: "danger",
|
|
374
409
|
title: formatMessage({
|
|
375
410
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
376
411
|
defaultMessage: "Your request could not be processed."
|
|
@@ -380,9 +415,9 @@ const ReleasesPage = () => {
|
|
|
380
415
|
defaultMessage: "Please try again or open another release."
|
|
381
416
|
})
|
|
382
417
|
});
|
|
383
|
-
|
|
418
|
+
navigate("", { replace: true, state: null });
|
|
384
419
|
}
|
|
385
|
-
}, [formatMessage, location?.state?.errors,
|
|
420
|
+
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
386
421
|
React.useEffect(() => {
|
|
387
422
|
if (tabRef.current) {
|
|
388
423
|
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
@@ -392,7 +427,7 @@ const ReleasesPage = () => {
|
|
|
392
427
|
setReleaseModalShown((prev) => !prev);
|
|
393
428
|
};
|
|
394
429
|
if (isLoading) {
|
|
395
|
-
return /* @__PURE__ */ jsx(
|
|
430
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
396
431
|
}
|
|
397
432
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
398
433
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
@@ -423,22 +458,22 @@ const ReleasesPage = () => {
|
|
|
423
458
|
})
|
|
424
459
|
});
|
|
425
460
|
trackUsage("didCreateRelease");
|
|
426
|
-
|
|
461
|
+
navigate(response2.data.data.id.toString());
|
|
427
462
|
} else if (isAxiosError(response2.error)) {
|
|
428
463
|
toggleNotification({
|
|
429
|
-
type: "
|
|
464
|
+
type: "danger",
|
|
430
465
|
message: formatAPIError(response2.error)
|
|
431
466
|
});
|
|
432
467
|
} else {
|
|
433
468
|
toggleNotification({
|
|
434
|
-
type: "
|
|
469
|
+
type: "danger",
|
|
435
470
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
436
471
|
});
|
|
437
472
|
}
|
|
438
473
|
};
|
|
439
474
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
|
|
440
475
|
/* @__PURE__ */ jsx(
|
|
441
|
-
|
|
476
|
+
Layouts.Header,
|
|
442
477
|
{
|
|
443
478
|
title: formatMessage({
|
|
444
479
|
id: "content-releases.pages.Releases.title",
|
|
@@ -448,7 +483,7 @@ const ReleasesPage = () => {
|
|
|
448
483
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
449
484
|
defaultMessage: "Create and manage content updates"
|
|
450
485
|
}),
|
|
451
|
-
primaryAction:
|
|
486
|
+
primaryAction: canCreate ? /* @__PURE__ */ jsx(
|
|
452
487
|
Button,
|
|
453
488
|
{
|
|
454
489
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -459,10 +494,10 @@ const ReleasesPage = () => {
|
|
|
459
494
|
defaultMessage: "New release"
|
|
460
495
|
})
|
|
461
496
|
}
|
|
462
|
-
)
|
|
497
|
+
) : null
|
|
463
498
|
}
|
|
464
499
|
),
|
|
465
|
-
/* @__PURE__ */ jsx(
|
|
500
|
+
/* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
466
501
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
467
502
|
StyledAlert,
|
|
468
503
|
{
|
|
@@ -538,23 +573,17 @@ const ReleasesPage = () => {
|
|
|
538
573
|
]
|
|
539
574
|
}
|
|
540
575
|
),
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
pagination: {
|
|
553
|
-
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
)
|
|
557
|
-
] }) : 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
|
+
)
|
|
558
587
|
] }) }),
|
|
559
588
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
560
589
|
ReleaseModal,
|
|
@@ -602,14 +631,18 @@ const TrashIcon = styled(Trash)`
|
|
|
602
631
|
const TypographyMaxWidth = styled(Typography)`
|
|
603
632
|
max-width: 300px;
|
|
604
633
|
`;
|
|
605
|
-
const EntryValidationText = ({ action, schema,
|
|
634
|
+
const EntryValidationText = ({ action, schema, entry }) => {
|
|
606
635
|
const { formatMessage } = useIntl();
|
|
607
|
-
const { validate } = unstable_useDocument(
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
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) ?? {};
|
|
613
646
|
if (Object.keys(errors).length > 0) {
|
|
614
647
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
615
648
|
([key, value]) => formatMessage(
|
|
@@ -618,13 +651,13 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
|
618
651
|
)
|
|
619
652
|
).join(" ");
|
|
620
653
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
621
|
-
/* @__PURE__ */ jsx(
|
|
654
|
+
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
622
655
|
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
623
656
|
] });
|
|
624
657
|
}
|
|
625
658
|
if (action == "publish") {
|
|
626
659
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
627
|
-
/* @__PURE__ */ jsx(
|
|
660
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
628
661
|
entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
629
662
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
630
663
|
defaultMessage: "Already published"
|
|
@@ -635,7 +668,7 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
|
635
668
|
] });
|
|
636
669
|
}
|
|
637
670
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
638
|
-
/* @__PURE__ */ jsx(
|
|
671
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
639
672
|
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
640
673
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
641
674
|
defaultMessage: "Already unpublished"
|
|
@@ -657,18 +690,22 @@ const ReleaseDetailsLayout = ({
|
|
|
657
690
|
isLoading: isLoadingDetails,
|
|
658
691
|
isError,
|
|
659
692
|
error
|
|
660
|
-
} = useGetReleaseQuery(
|
|
693
|
+
} = useGetReleaseQuery(
|
|
694
|
+
{ id: releaseId },
|
|
695
|
+
{
|
|
696
|
+
skip: !releaseId
|
|
697
|
+
}
|
|
698
|
+
);
|
|
661
699
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
662
|
-
const toggleNotification = useNotification();
|
|
700
|
+
const { toggleNotification } = useNotification();
|
|
663
701
|
const { formatAPIError } = useAPIErrorHandler();
|
|
664
|
-
const {
|
|
665
|
-
|
|
666
|
-
} = useRBAC(PERMISSIONS);
|
|
702
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
703
|
+
const { canUpdate, canDelete, canPublish } = allowedActions;
|
|
667
704
|
const dispatch = useTypedDispatch();
|
|
668
705
|
const { trackUsage } = useTracking();
|
|
669
706
|
const release = data?.data;
|
|
670
|
-
const handlePublishRelease = async () => {
|
|
671
|
-
const response = await publishRelease({ id
|
|
707
|
+
const handlePublishRelease = (id) => async () => {
|
|
708
|
+
const response = await publishRelease({ id });
|
|
672
709
|
if ("data" in response) {
|
|
673
710
|
toggleNotification({
|
|
674
711
|
type: "success",
|
|
@@ -685,12 +722,12 @@ const ReleaseDetailsLayout = ({
|
|
|
685
722
|
});
|
|
686
723
|
} else if (isAxiosError(response.error)) {
|
|
687
724
|
toggleNotification({
|
|
688
|
-
type: "
|
|
725
|
+
type: "danger",
|
|
689
726
|
message: formatAPIError(response.error)
|
|
690
727
|
});
|
|
691
728
|
} else {
|
|
692
729
|
toggleNotification({
|
|
693
|
-
type: "
|
|
730
|
+
type: "danger",
|
|
694
731
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
695
732
|
});
|
|
696
733
|
}
|
|
@@ -716,21 +753,19 @@ const ReleaseDetailsLayout = ({
|
|
|
716
753
|
return release.createdBy.email;
|
|
717
754
|
};
|
|
718
755
|
if (isLoadingDetails) {
|
|
719
|
-
return /* @__PURE__ */ jsx(
|
|
756
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
720
757
|
}
|
|
721
758
|
if (isError || !release) {
|
|
722
759
|
return /* @__PURE__ */ jsx(
|
|
723
|
-
|
|
760
|
+
Navigate,
|
|
724
761
|
{
|
|
725
|
-
to:
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
]
|
|
733
|
-
}
|
|
762
|
+
to: "..",
|
|
763
|
+
state: {
|
|
764
|
+
errors: [
|
|
765
|
+
{
|
|
766
|
+
code: error?.code
|
|
767
|
+
}
|
|
768
|
+
]
|
|
734
769
|
}
|
|
735
770
|
}
|
|
736
771
|
);
|
|
@@ -767,17 +802,14 @@ const ReleaseDetailsLayout = ({
|
|
|
767
802
|
) : "";
|
|
768
803
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
769
804
|
/* @__PURE__ */ jsx(
|
|
770
|
-
|
|
805
|
+
Layouts.Header,
|
|
771
806
|
{
|
|
772
807
|
title: release.name,
|
|
773
808
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
774
809
|
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
775
810
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
776
811
|
] }),
|
|
777
|
-
navigationAction: /* @__PURE__ */ jsx(
|
|
778
|
-
id: "global.back",
|
|
779
|
-
defaultMessage: "Back"
|
|
780
|
-
}) }),
|
|
812
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
781
813
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
782
814
|
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
783
815
|
/* @__PURE__ */ jsx(
|
|
@@ -794,7 +826,7 @@ const ReleaseDetailsLayout = ({
|
|
|
794
826
|
variant: "tertiary"
|
|
795
827
|
}
|
|
796
828
|
),
|
|
797
|
-
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
|
|
829
|
+
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
|
|
798
830
|
/* @__PURE__ */ jsxs(
|
|
799
831
|
Flex,
|
|
800
832
|
{
|
|
@@ -843,7 +875,7 @@ const ReleaseDetailsLayout = ({
|
|
|
843
875
|
defaultMessage: "Created"
|
|
844
876
|
}) }),
|
|
845
877
|
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
846
|
-
/* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
|
|
878
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
847
879
|
formatMessage(
|
|
848
880
|
{
|
|
849
881
|
id: "content-releases.header.actions.created.description",
|
|
@@ -861,12 +893,12 @@ const ReleaseDetailsLayout = ({
|
|
|
861
893
|
id: "content-releases.header.actions.refresh",
|
|
862
894
|
defaultMessage: "Refresh"
|
|
863
895
|
}) }),
|
|
864
|
-
|
|
896
|
+
canPublish ? /* @__PURE__ */ jsx(
|
|
865
897
|
Button,
|
|
866
898
|
{
|
|
867
899
|
size: "S",
|
|
868
900
|
variant: "default",
|
|
869
|
-
onClick: handlePublishRelease,
|
|
901
|
+
onClick: handlePublishRelease(release.id.toString()),
|
|
870
902
|
loading: isPublishing,
|
|
871
903
|
disabled: release.actions.meta.count === 0,
|
|
872
904
|
children: formatMessage({
|
|
@@ -874,7 +906,7 @@ const ReleaseDetailsLayout = ({
|
|
|
874
906
|
defaultMessage: "Publish"
|
|
875
907
|
})
|
|
876
908
|
}
|
|
877
|
-
)
|
|
909
|
+
) : null
|
|
878
910
|
] })
|
|
879
911
|
}
|
|
880
912
|
),
|
|
@@ -882,6 +914,7 @@ const ReleaseDetailsLayout = ({
|
|
|
882
914
|
] });
|
|
883
915
|
};
|
|
884
916
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
917
|
+
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
885
918
|
const getGroupByOptionLabel = (value) => {
|
|
886
919
|
if (value === "locale") {
|
|
887
920
|
return {
|
|
@@ -900,11 +933,10 @@ const getGroupByOptionLabel = (value) => {
|
|
|
900
933
|
defaultMessage: "Content-Types"
|
|
901
934
|
};
|
|
902
935
|
};
|
|
903
|
-
const ReleaseDetailsBody = () => {
|
|
936
|
+
const ReleaseDetailsBody = ({ releaseId }) => {
|
|
904
937
|
const { formatMessage } = useIntl();
|
|
905
|
-
const { releaseId } = useParams();
|
|
906
938
|
const [{ query }, setQuery] = useQueryParams();
|
|
907
|
-
const toggleNotification = useNotification();
|
|
939
|
+
const { toggleNotification } = useNotification();
|
|
908
940
|
const { formatAPIError } = useAPIErrorHandler();
|
|
909
941
|
const {
|
|
910
942
|
data: releaseData,
|
|
@@ -915,6 +947,20 @@ const ReleaseDetailsBody = () => {
|
|
|
915
947
|
const {
|
|
916
948
|
allowedActions: { canUpdate }
|
|
917
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
|
+
);
|
|
918
964
|
const release = releaseData?.data;
|
|
919
965
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
920
966
|
const {
|
|
@@ -945,19 +991,19 @@ const ReleaseDetailsBody = () => {
|
|
|
945
991
|
if ("error" in response) {
|
|
946
992
|
if (isAxiosError(response.error)) {
|
|
947
993
|
toggleNotification({
|
|
948
|
-
type: "
|
|
994
|
+
type: "danger",
|
|
949
995
|
message: formatAPIError(response.error)
|
|
950
996
|
});
|
|
951
997
|
} else {
|
|
952
998
|
toggleNotification({
|
|
953
|
-
type: "
|
|
999
|
+
type: "danger",
|
|
954
1000
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
955
1001
|
});
|
|
956
1002
|
}
|
|
957
1003
|
}
|
|
958
1004
|
};
|
|
959
1005
|
if (isLoading || isReleaseLoading) {
|
|
960
|
-
return /* @__PURE__ */ jsx(
|
|
1006
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
961
1007
|
}
|
|
962
1008
|
const releaseActions = data?.data;
|
|
963
1009
|
const releaseMeta = data?.meta;
|
|
@@ -976,32 +1022,26 @@ const ReleaseDetailsBody = () => {
|
|
|
976
1022
|
});
|
|
977
1023
|
}
|
|
978
1024
|
return /* @__PURE__ */ jsx(
|
|
979
|
-
|
|
1025
|
+
Navigate,
|
|
980
1026
|
{
|
|
981
|
-
to:
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
errors: errorsArray
|
|
985
|
-
}
|
|
1027
|
+
to: "..",
|
|
1028
|
+
state: {
|
|
1029
|
+
errors: errorsArray
|
|
986
1030
|
}
|
|
987
1031
|
}
|
|
988
1032
|
);
|
|
989
1033
|
}
|
|
990
1034
|
if (isError || !releaseActions) {
|
|
991
|
-
return /* @__PURE__ */ jsx(
|
|
1035
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
992
1036
|
}
|
|
993
1037
|
if (Object.keys(releaseActions).length === 0) {
|
|
994
|
-
return /* @__PURE__ */ jsx(
|
|
995
|
-
|
|
1038
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
|
|
1039
|
+
EmptyStateLayout,
|
|
996
1040
|
{
|
|
997
|
-
content: {
|
|
998
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
999
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1000
|
-
},
|
|
1001
1041
|
action: /* @__PURE__ */ jsx(
|
|
1002
1042
|
LinkButton,
|
|
1003
1043
|
{
|
|
1004
|
-
as: Link$
|
|
1044
|
+
as: Link$1,
|
|
1005
1045
|
to: {
|
|
1006
1046
|
pathname: "/content-manager"
|
|
1007
1047
|
},
|
|
@@ -1012,18 +1052,59 @@ const ReleaseDetailsBody = () => {
|
|
|
1012
1052
|
defaultMessage: "Open the Content Manager"
|
|
1013
1053
|
})
|
|
1014
1054
|
}
|
|
1015
|
-
)
|
|
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
|
+
})
|
|
1016
1061
|
}
|
|
1017
1062
|
) });
|
|
1018
1063
|
}
|
|
1019
|
-
|
|
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: [
|
|
1020
1103
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1021
1104
|
SingleSelect,
|
|
1022
1105
|
{
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
defaultMessage: "Group by"
|
|
1026
|
-
}),
|
|
1106
|
+
placeholder: groupByLabel,
|
|
1107
|
+
"aria-label": groupByLabel,
|
|
1027
1108
|
customizeContent: (value) => formatMessage(
|
|
1028
1109
|
{
|
|
1029
1110
|
id: `content-releases.pages.ReleaseDetails.groupBy.label`,
|
|
@@ -1035,7 +1116,7 @@ const ReleaseDetailsBody = () => {
|
|
|
1035
1116
|
),
|
|
1036
1117
|
value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
|
|
1037
1118
|
onChange: (value) => setQuery({ groupBy: value }),
|
|
1038
|
-
children:
|
|
1119
|
+
children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
|
|
1039
1120
|
}
|
|
1040
1121
|
) }),
|
|
1041
1122
|
Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
|
|
@@ -1047,72 +1128,15 @@ const ReleaseDetailsBody = () => {
|
|
|
1047
1128
|
...item,
|
|
1048
1129
|
id: Number(item.entry.id)
|
|
1049
1130
|
})),
|
|
1050
|
-
|
|
1051
|
-
isLoading,
|
|
1052
|
-
isFetching,
|
|
1131
|
+
headers,
|
|
1132
|
+
isLoading: isLoading || isFetching,
|
|
1053
1133
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1054
|
-
/* @__PURE__ */
|
|
1055
|
-
|
|
1056
|
-
Table.HeaderCell,
|
|
1057
|
-
{
|
|
1058
|
-
fieldSchemaType: "string",
|
|
1059
|
-
label: formatMessage({
|
|
1060
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1061
|
-
defaultMessage: "name"
|
|
1062
|
-
}),
|
|
1063
|
-
name: "name"
|
|
1064
|
-
}
|
|
1065
|
-
),
|
|
1066
|
-
/* @__PURE__ */ jsx(
|
|
1067
|
-
Table.HeaderCell,
|
|
1068
|
-
{
|
|
1069
|
-
fieldSchemaType: "string",
|
|
1070
|
-
label: formatMessage({
|
|
1071
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1072
|
-
defaultMessage: "locale"
|
|
1073
|
-
}),
|
|
1074
|
-
name: "locale"
|
|
1075
|
-
}
|
|
1076
|
-
),
|
|
1077
|
-
/* @__PURE__ */ jsx(
|
|
1078
|
-
Table.HeaderCell,
|
|
1079
|
-
{
|
|
1080
|
-
fieldSchemaType: "string",
|
|
1081
|
-
label: formatMessage({
|
|
1082
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1083
|
-
defaultMessage: "content-type"
|
|
1084
|
-
}),
|
|
1085
|
-
name: "content-type"
|
|
1086
|
-
}
|
|
1087
|
-
),
|
|
1088
|
-
/* @__PURE__ */ jsx(
|
|
1089
|
-
Table.HeaderCell,
|
|
1090
|
-
{
|
|
1091
|
-
fieldSchemaType: "string",
|
|
1092
|
-
label: formatMessage({
|
|
1093
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1094
|
-
defaultMessage: "action"
|
|
1095
|
-
}),
|
|
1096
|
-
name: "action"
|
|
1097
|
-
}
|
|
1098
|
-
),
|
|
1099
|
-
!release.releasedAt && /* @__PURE__ */ jsx(
|
|
1100
|
-
Table.HeaderCell,
|
|
1101
|
-
{
|
|
1102
|
-
fieldSchemaType: "string",
|
|
1103
|
-
label: formatMessage({
|
|
1104
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1105
|
-
defaultMessage: "status"
|
|
1106
|
-
}),
|
|
1107
|
-
name: "status"
|
|
1108
|
-
}
|
|
1109
|
-
)
|
|
1110
|
-
] }),
|
|
1111
|
-
/* @__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, {}),
|
|
1112
1136
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1113
1137
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1114
1138
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1115
|
-
/* @__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 : "-"}` }) }),
|
|
1116
1140
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
1117
1141
|
/* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
|
|
1118
1142
|
{
|
|
@@ -1166,34 +1190,39 @@ const ReleaseDetailsBody = () => {
|
|
|
1166
1190
|
}
|
|
1167
1191
|
)
|
|
1168
1192
|
] }, `releases-group-${key}`)),
|
|
1169
|
-
/* @__PURE__ */ jsxs(
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
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
|
+
)
|
|
1180
1204
|
] }) });
|
|
1181
1205
|
};
|
|
1182
1206
|
const ReleaseDetailsPage = () => {
|
|
1183
1207
|
const { formatMessage } = useIntl();
|
|
1184
1208
|
const { releaseId } = useParams();
|
|
1185
|
-
const toggleNotification = useNotification();
|
|
1209
|
+
const { toggleNotification } = useNotification();
|
|
1186
1210
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1187
|
-
const
|
|
1211
|
+
const navigate = useNavigate();
|
|
1188
1212
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1189
1213
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1190
1214
|
const {
|
|
1191
1215
|
isLoading: isLoadingDetails,
|
|
1192
1216
|
data,
|
|
1193
1217
|
isSuccess: isSuccessDetails
|
|
1194
|
-
} = useGetReleaseQuery(
|
|
1218
|
+
} = useGetReleaseQuery(
|
|
1219
|
+
{ id: releaseId },
|
|
1220
|
+
{
|
|
1221
|
+
skip: !releaseId
|
|
1222
|
+
}
|
|
1223
|
+
);
|
|
1195
1224
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1196
|
-
const [deleteRelease
|
|
1225
|
+
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1197
1226
|
const toggleEditReleaseModal = () => {
|
|
1198
1227
|
setReleaseModalShown((prev) => !prev);
|
|
1199
1228
|
};
|
|
@@ -1204,10 +1233,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1204
1233
|
{
|
|
1205
1234
|
toggleEditReleaseModal,
|
|
1206
1235
|
toggleWarningSubmit,
|
|
1207
|
-
children: /* @__PURE__ */ jsx(
|
|
1236
|
+
children: /* @__PURE__ */ jsx(Page.Loading, {})
|
|
1208
1237
|
}
|
|
1209
1238
|
);
|
|
1210
1239
|
}
|
|
1240
|
+
if (!releaseId) {
|
|
1241
|
+
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1242
|
+
}
|
|
1211
1243
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1212
1244
|
const title = releaseData?.name || "";
|
|
1213
1245
|
const timezone = releaseData?.timezone ?? null;
|
|
@@ -1229,33 +1261,33 @@ const ReleaseDetailsPage = () => {
|
|
|
1229
1261
|
defaultMessage: "Release updated."
|
|
1230
1262
|
})
|
|
1231
1263
|
});
|
|
1264
|
+
toggleEditReleaseModal();
|
|
1232
1265
|
} else if (isAxiosError(response.error)) {
|
|
1233
1266
|
toggleNotification({
|
|
1234
|
-
type: "
|
|
1267
|
+
type: "danger",
|
|
1235
1268
|
message: formatAPIError(response.error)
|
|
1236
1269
|
});
|
|
1237
1270
|
} else {
|
|
1238
1271
|
toggleNotification({
|
|
1239
|
-
type: "
|
|
1272
|
+
type: "danger",
|
|
1240
1273
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1241
1274
|
});
|
|
1242
1275
|
}
|
|
1243
|
-
toggleEditReleaseModal();
|
|
1244
1276
|
};
|
|
1245
1277
|
const handleDeleteRelease = async () => {
|
|
1246
1278
|
const response = await deleteRelease({
|
|
1247
1279
|
id: releaseId
|
|
1248
1280
|
});
|
|
1249
1281
|
if ("data" in response) {
|
|
1250
|
-
|
|
1282
|
+
navigate("..");
|
|
1251
1283
|
} else if (isAxiosError(response.error)) {
|
|
1252
1284
|
toggleNotification({
|
|
1253
|
-
type: "
|
|
1285
|
+
type: "danger",
|
|
1254
1286
|
message: formatAPIError(response.error)
|
|
1255
1287
|
});
|
|
1256
1288
|
} else {
|
|
1257
1289
|
toggleNotification({
|
|
1258
|
-
type: "
|
|
1290
|
+
type: "danger",
|
|
1259
1291
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1260
1292
|
});
|
|
1261
1293
|
}
|
|
@@ -1266,7 +1298,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1266
1298
|
toggleEditReleaseModal,
|
|
1267
1299
|
toggleWarningSubmit,
|
|
1268
1300
|
children: [
|
|
1269
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1301
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1270
1302
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1271
1303
|
ReleaseModal,
|
|
1272
1304
|
{
|
|
@@ -1286,14 +1318,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1286
1318
|
/* @__PURE__ */ jsx(
|
|
1287
1319
|
ConfirmDialog,
|
|
1288
1320
|
{
|
|
1289
|
-
|
|
1321
|
+
isOpen: showWarningSubmit,
|
|
1322
|
+
onClose: toggleWarningSubmit,
|
|
1323
|
+
onConfirm: handleDeleteRelease,
|
|
1324
|
+
children: formatMessage({
|
|
1290
1325
|
id: "content-releases.dialog.confirmation-message",
|
|
1291
1326
|
defaultMessage: "Are you sure you want to delete this release?"
|
|
1292
|
-
}
|
|
1293
|
-
isOpen: showWarningSubmit,
|
|
1294
|
-
isConfirmButtonLoading: isDeletingRelease,
|
|
1295
|
-
onToggleDialog: toggleWarningSubmit,
|
|
1296
|
-
onConfirm: handleDeleteRelease
|
|
1327
|
+
})
|
|
1297
1328
|
}
|
|
1298
1329
|
)
|
|
1299
1330
|
]
|
|
@@ -1301,12 +1332,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1301
1332
|
);
|
|
1302
1333
|
};
|
|
1303
1334
|
const App = () => {
|
|
1304
|
-
return /* @__PURE__ */ jsx(
|
|
1305
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1306
|
-
/* @__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, {}) })
|
|
1307
1338
|
] }) });
|
|
1308
1339
|
};
|
|
1309
1340
|
export {
|
|
1310
1341
|
App
|
|
1311
1342
|
};
|
|
1312
|
-
//# sourceMappingURL=App-
|
|
1343
|
+
//# sourceMappingURL=App-BsUSTHVD.mjs.map
|