@strapi/content-releases 0.0.0-experimental.d8a676a242377cee820b59b21a05d47290d9ac73 → 0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d
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-p8aKBitd.js → App-CqbuK4M6.js} +426 -427
- package/dist/_chunks/App-CqbuK4M6.js.map +1 -0
- package/dist/_chunks/{App-bpzO2Ljh.mjs → App-Do-Rnv0A.mjs} +406 -406
- package/dist/_chunks/App-Do-Rnv0A.mjs.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-WuuhP6Bn.mjs → en-B9Ur3VsE.mjs} +11 -3
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
- package/dist/_chunks/{en-gcJJ5htG.js → en-DtFJ5ViE.js} +11 -3
- package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
- package/dist/_chunks/{index-AECgcaDa.mjs → index-D_pgdqQL.mjs} +244 -247
- package/dist/_chunks/index-D_pgdqQL.mjs.map +1 -0
- package/dist/_chunks/{index-fP3qoWZ4.js → index-Tedsw4GC.js} +244 -249
- package/dist/_chunks/index-Tedsw4GC.js.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 +17 -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/release.d.ts +105 -0
- package/dist/admin/src/store/hooks.d.ts +7 -0
- package/dist/admin/src/utils/api.d.ts +6 -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 +358 -237
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +359 -237
- 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 +29 -36
- package/dist/_chunks/App-bpzO2Ljh.mjs.map +0 -1
- package/dist/_chunks/App-p8aKBitd.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-WuuhP6Bn.mjs.map +0 -1
- package/dist/_chunks/en-gcJJ5htG.js.map +0 -1
- package/dist/_chunks/index-AECgcaDa.mjs.map +0 -1
- package/dist/_chunks/index-fP3qoWZ4.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,
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
|
+
import { useLocation, useNavigate, NavLink, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
|
|
4
|
+
import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, i as ReleaseActionMenu, r as releaseApi } from "./index-D_pgdqQL.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
+
import { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, Menu, Dialog, 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
|
-
import styled from "styled-components";
|
|
14
|
-
import {
|
|
13
|
+
import { styled } from "styled-components";
|
|
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(),
|
|
@@ -40,6 +68,7 @@ const RELEASE_SCHEMA = yup.object().shape({
|
|
|
40
68
|
}).required().noUnknown();
|
|
41
69
|
const ReleaseModal = ({
|
|
42
70
|
handleClose,
|
|
71
|
+
open,
|
|
43
72
|
handleSubmit,
|
|
44
73
|
initialValues,
|
|
45
74
|
isLoading = false
|
|
@@ -47,7 +76,6 @@ const ReleaseModal = ({
|
|
|
47
76
|
const { formatMessage } = useIntl();
|
|
48
77
|
const { pathname } = useLocation();
|
|
49
78
|
const isCreatingRelease = pathname === `/plugins/${pluginId}`;
|
|
50
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
51
79
|
const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
|
|
52
80
|
initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
|
|
53
81
|
);
|
|
@@ -55,9 +83,8 @@ const ReleaseModal = ({
|
|
|
55
83
|
const { date, time, timezone } = values;
|
|
56
84
|
if (!date || !time || !timezone)
|
|
57
85
|
return null;
|
|
58
|
-
const formattedDate = parse(time, "HH:mm", new Date(date));
|
|
59
86
|
const timezoneWithoutOffset = timezone.split("&")[1];
|
|
60
|
-
return zonedTimeToUtc(
|
|
87
|
+
return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
|
|
61
88
|
};
|
|
62
89
|
const getTimezoneWithOffset = () => {
|
|
63
90
|
const currentTimezone = timezoneList.find(
|
|
@@ -65,8 +92,8 @@ const ReleaseModal = ({
|
|
|
65
92
|
);
|
|
66
93
|
return currentTimezone?.value || systemTimezone.value;
|
|
67
94
|
};
|
|
68
|
-
return /* @__PURE__ */
|
|
69
|
-
/* @__PURE__ */ jsx(
|
|
95
|
+
return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
|
|
96
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
|
|
70
97
|
{
|
|
71
98
|
id: "content-releases.modal.title",
|
|
72
99
|
defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
|
|
@@ -89,31 +116,25 @@ const ReleaseModal = ({
|
|
|
89
116
|
},
|
|
90
117
|
validationSchema: RELEASE_SCHEMA,
|
|
91
118
|
validateOnChange: false,
|
|
92
|
-
children: ({ values, errors, handleChange, setFieldValue }) =>
|
|
93
|
-
|
|
94
|
-
/* @__PURE__ */ jsx(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
label: formatMessage({
|
|
119
|
+
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
120
|
+
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
121
|
+
/* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
|
122
|
+
/* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
|
|
123
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
98
124
|
id: "content-releases.modal.form.input.label.release-name",
|
|
99
125
|
defaultMessage: "Name"
|
|
100
|
-
}),
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
onChange: handleChange,
|
|
105
|
-
required: true
|
|
106
|
-
}
|
|
107
|
-
),
|
|
108
|
-
IsSchedulingEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
126
|
+
}) }),
|
|
127
|
+
/* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
|
|
128
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
129
|
+
] }),
|
|
109
130
|
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
110
131
|
Checkbox,
|
|
111
132
|
{
|
|
112
133
|
name: "isScheduled",
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
setFieldValue("isScheduled",
|
|
116
|
-
if (!
|
|
134
|
+
checked: values.isScheduled,
|
|
135
|
+
onCheckedChange: (checked) => {
|
|
136
|
+
setFieldValue("isScheduled", checked);
|
|
137
|
+
if (!checked) {
|
|
117
138
|
setFieldValue("date", null);
|
|
118
139
|
setFieldValue("time", "");
|
|
119
140
|
setFieldValue("timezone", null);
|
|
@@ -141,76 +162,73 @@ const ReleaseModal = ({
|
|
|
141
162
|
) }),
|
|
142
163
|
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
143
164
|
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
144
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
) }),
|
|
169
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
) })
|
|
165
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
|
|
166
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
167
|
+
id: "content-releases.modal.form.input.label.date",
|
|
168
|
+
defaultMessage: "Date"
|
|
169
|
+
}) }),
|
|
170
|
+
/* @__PURE__ */ jsx(
|
|
171
|
+
DatePicker,
|
|
172
|
+
{
|
|
173
|
+
onChange: (date) => {
|
|
174
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
175
|
+
setFieldValue("date", isoFormatDate);
|
|
176
|
+
},
|
|
177
|
+
clearLabel: formatMessage({
|
|
178
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
179
|
+
defaultMessage: "Clear"
|
|
180
|
+
}),
|
|
181
|
+
onClear: () => {
|
|
182
|
+
setFieldValue("date", null);
|
|
183
|
+
},
|
|
184
|
+
value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
|
|
185
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
186
|
+
}
|
|
187
|
+
),
|
|
188
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
189
|
+
] }) }),
|
|
190
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
|
|
191
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
192
|
+
id: "content-releases.modal.form.input.label.time",
|
|
193
|
+
defaultMessage: "Time"
|
|
194
|
+
}) }),
|
|
195
|
+
/* @__PURE__ */ jsx(
|
|
196
|
+
TimePicker,
|
|
197
|
+
{
|
|
198
|
+
onChange: (time) => {
|
|
199
|
+
setFieldValue("time", time);
|
|
200
|
+
},
|
|
201
|
+
clearLabel: formatMessage({
|
|
202
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
203
|
+
defaultMessage: "Clear"
|
|
204
|
+
}),
|
|
205
|
+
onClear: () => {
|
|
206
|
+
setFieldValue("time", "");
|
|
207
|
+
},
|
|
208
|
+
value: values.time || void 0
|
|
209
|
+
}
|
|
210
|
+
),
|
|
211
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
212
|
+
] }) })
|
|
192
213
|
] }),
|
|
193
214
|
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
194
215
|
] })
|
|
195
|
-
] })
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
{
|
|
200
|
-
startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
|
|
201
|
-
endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
216
|
+
] }) }),
|
|
217
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
218
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
|
|
219
|
+
/* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
202
220
|
{
|
|
203
221
|
id: "content-releases.modal.form.button.submit",
|
|
204
222
|
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
205
223
|
},
|
|
206
224
|
{ isCreatingRelease }
|
|
207
225
|
) })
|
|
208
|
-
}
|
|
209
|
-
)
|
|
210
|
-
|
|
226
|
+
] })
|
|
227
|
+
] });
|
|
228
|
+
}
|
|
211
229
|
}
|
|
212
230
|
)
|
|
213
|
-
] });
|
|
231
|
+
] }) });
|
|
214
232
|
};
|
|
215
233
|
const getTimezones = (selectedDate) => {
|
|
216
234
|
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
@@ -236,37 +254,44 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
236
254
|
}
|
|
237
255
|
}
|
|
238
256
|
}, [setFieldValue, values.date, values.timezone]);
|
|
239
|
-
return /* @__PURE__ */
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
);
|
|
257
|
+
return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, children: [
|
|
258
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
259
|
+
id: "content-releases.modal.form.input.label.timezone",
|
|
260
|
+
defaultMessage: "Timezone"
|
|
261
|
+
}) }),
|
|
262
|
+
/* @__PURE__ */ jsx(
|
|
263
|
+
Combobox,
|
|
264
|
+
{
|
|
265
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
266
|
+
value: values.timezone || void 0,
|
|
267
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
268
|
+
onChange: (timezone) => {
|
|
269
|
+
setFieldValue("timezone", timezone);
|
|
270
|
+
},
|
|
271
|
+
onTextValueChange: (timezone) => {
|
|
272
|
+
setFieldValue("timezone", timezone);
|
|
273
|
+
},
|
|
274
|
+
onClear: () => {
|
|
275
|
+
setFieldValue("timezone", "");
|
|
276
|
+
},
|
|
277
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
278
|
+
}
|
|
279
|
+
),
|
|
280
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
281
|
+
] });
|
|
282
|
+
};
|
|
283
|
+
const useTypedDispatch = useDispatch;
|
|
284
|
+
const isBaseQueryError = (error) => {
|
|
285
|
+
return typeof error !== "undefined" && error.name !== void 0;
|
|
264
286
|
};
|
|
265
287
|
const LinkCard = styled(Link)`
|
|
266
288
|
display: block;
|
|
267
289
|
`;
|
|
268
|
-
const
|
|
269
|
-
|
|
290
|
+
const RelativeTime = styled(RelativeTime$1)`
|
|
291
|
+
display: inline-block;
|
|
292
|
+
&::first-letter {
|
|
293
|
+
text-transform: uppercase;
|
|
294
|
+
}
|
|
270
295
|
`;
|
|
271
296
|
const getBadgeProps = (status) => {
|
|
272
297
|
let color;
|
|
@@ -295,9 +320,8 @@ const getBadgeProps = (status) => {
|
|
|
295
320
|
};
|
|
296
321
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
297
322
|
const { formatMessage } = useIntl();
|
|
298
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
299
323
|
if (isError) {
|
|
300
|
-
return /* @__PURE__ */ jsx(
|
|
324
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
301
325
|
}
|
|
302
326
|
if (releases?.length === 0) {
|
|
303
327
|
return /* @__PURE__ */ jsx(
|
|
@@ -312,11 +336,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
312
336
|
target: sectionTitle
|
|
313
337
|
}
|
|
314
338
|
),
|
|
315
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
339
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
|
|
316
340
|
}
|
|
317
341
|
);
|
|
318
342
|
}
|
|
319
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name,
|
|
343
|
+
return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
|
|
320
344
|
Flex,
|
|
321
345
|
{
|
|
322
346
|
direction: "column",
|
|
@@ -331,17 +355,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
331
355
|
gap: 4,
|
|
332
356
|
children: [
|
|
333
357
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
334
|
-
/* @__PURE__ */ jsx(Typography, {
|
|
335
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children:
|
|
358
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
359
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
336
360
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
337
361
|
defaultMessage: "Not scheduled"
|
|
338
|
-
})
|
|
339
|
-
{
|
|
340
|
-
id: "content-releases.page.Releases.release-item.entries",
|
|
341
|
-
defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
|
|
342
|
-
},
|
|
343
|
-
{ number: actions.meta.count }
|
|
344
|
-
) })
|
|
362
|
+
}) })
|
|
345
363
|
] }),
|
|
346
364
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
|
|
347
365
|
]
|
|
@@ -358,20 +376,18 @@ const StyledAlert = styled(Alert)`
|
|
|
358
376
|
`;
|
|
359
377
|
const INITIAL_FORM_VALUES = {
|
|
360
378
|
name: "",
|
|
361
|
-
date:
|
|
379
|
+
date: void 0,
|
|
362
380
|
time: "",
|
|
363
|
-
|
|
364
|
-
isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
|
|
381
|
+
isScheduled: true,
|
|
365
382
|
scheduledAt: null,
|
|
366
383
|
timezone: null
|
|
367
384
|
};
|
|
368
385
|
const ReleasesPage = () => {
|
|
369
|
-
const tabRef = React.useRef(null);
|
|
370
386
|
const location = useLocation();
|
|
371
387
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
372
|
-
const toggleNotification = useNotification();
|
|
388
|
+
const { toggleNotification } = useNotification();
|
|
373
389
|
const { formatMessage } = useIntl();
|
|
374
|
-
const
|
|
390
|
+
const navigate = useNavigate();
|
|
375
391
|
const { formatAPIError } = useAPIErrorHandler();
|
|
376
392
|
const [{ query }, setQuery] = useQueryParams();
|
|
377
393
|
const response = useGetReleasesQuery(query);
|
|
@@ -379,13 +395,15 @@ const ReleasesPage = () => {
|
|
|
379
395
|
const { getFeature } = useLicenseLimits();
|
|
380
396
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
381
397
|
const { trackUsage } = useTracking();
|
|
398
|
+
const {
|
|
399
|
+
allowedActions: { canCreate }
|
|
400
|
+
} = useRBAC(PERMISSIONS);
|
|
382
401
|
const { isLoading, isSuccess, isError } = response;
|
|
383
402
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
384
|
-
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
385
403
|
React.useEffect(() => {
|
|
386
404
|
if (location?.state?.errors) {
|
|
387
405
|
toggleNotification({
|
|
388
|
-
type: "
|
|
406
|
+
type: "danger",
|
|
389
407
|
title: formatMessage({
|
|
390
408
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
391
409
|
defaultMessage: "Your request could not be processed."
|
|
@@ -395,30 +413,25 @@ const ReleasesPage = () => {
|
|
|
395
413
|
defaultMessage: "Please try again or open another release."
|
|
396
414
|
})
|
|
397
415
|
});
|
|
398
|
-
|
|
416
|
+
navigate("", { replace: true, state: null });
|
|
399
417
|
}
|
|
400
|
-
}, [formatMessage, location?.state?.errors,
|
|
401
|
-
React.useEffect(() => {
|
|
402
|
-
if (tabRef.current) {
|
|
403
|
-
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
404
|
-
}
|
|
405
|
-
}, [activeTabIndex]);
|
|
418
|
+
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
406
419
|
const toggleAddReleaseModal = () => {
|
|
407
420
|
setReleaseModalShown((prev) => !prev);
|
|
408
421
|
};
|
|
409
422
|
if (isLoading) {
|
|
410
|
-
return /* @__PURE__ */ jsx(
|
|
423
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
411
424
|
}
|
|
412
425
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
413
426
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
414
|
-
const handleTabChange = (
|
|
427
|
+
const handleTabChange = (tabValue) => {
|
|
415
428
|
setQuery({
|
|
416
429
|
...query,
|
|
417
430
|
page: 1,
|
|
418
431
|
pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
|
|
419
432
|
filters: {
|
|
420
433
|
releasedAt: {
|
|
421
|
-
$notNull:
|
|
434
|
+
$notNull: tabValue === "pending"
|
|
422
435
|
}
|
|
423
436
|
}
|
|
424
437
|
});
|
|
@@ -438,22 +451,22 @@ const ReleasesPage = () => {
|
|
|
438
451
|
})
|
|
439
452
|
});
|
|
440
453
|
trackUsage("didCreateRelease");
|
|
441
|
-
|
|
442
|
-
} else if (
|
|
454
|
+
navigate(response2.data.data.id.toString());
|
|
455
|
+
} else if (isFetchError(response2.error)) {
|
|
443
456
|
toggleNotification({
|
|
444
|
-
type: "
|
|
457
|
+
type: "danger",
|
|
445
458
|
message: formatAPIError(response2.error)
|
|
446
459
|
});
|
|
447
460
|
} else {
|
|
448
461
|
toggleNotification({
|
|
449
|
-
type: "
|
|
462
|
+
type: "danger",
|
|
450
463
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
451
464
|
});
|
|
452
465
|
}
|
|
453
466
|
};
|
|
454
467
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
|
|
455
468
|
/* @__PURE__ */ jsx(
|
|
456
|
-
|
|
469
|
+
Layouts.Header,
|
|
457
470
|
{
|
|
458
471
|
title: formatMessage({
|
|
459
472
|
id: "content-releases.pages.Releases.title",
|
|
@@ -463,7 +476,7 @@ const ReleasesPage = () => {
|
|
|
463
476
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
464
477
|
defaultMessage: "Create and manage content updates"
|
|
465
478
|
}),
|
|
466
|
-
primaryAction:
|
|
479
|
+
primaryAction: canCreate ? /* @__PURE__ */ jsx(
|
|
467
480
|
Button,
|
|
468
481
|
{
|
|
469
482
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -474,10 +487,10 @@ const ReleasesPage = () => {
|
|
|
474
487
|
defaultMessage: "New release"
|
|
475
488
|
})
|
|
476
489
|
}
|
|
477
|
-
)
|
|
490
|
+
) : null
|
|
478
491
|
}
|
|
479
492
|
),
|
|
480
|
-
/* @__PURE__ */ jsx(
|
|
493
|
+
/* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
481
494
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
482
495
|
StyledAlert,
|
|
483
496
|
{
|
|
@@ -502,21 +515,17 @@ const ReleasesPage = () => {
|
|
|
502
515
|
})
|
|
503
516
|
}
|
|
504
517
|
),
|
|
505
|
-
/* @__PURE__ */ jsxs(
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
children: [
|
|
517
|
-
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
518
|
-
/* @__PURE__ */ jsxs(Tabs, { children: [
|
|
519
|
-
/* @__PURE__ */ jsx(Tab, { children: formatMessage(
|
|
518
|
+
/* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
|
|
519
|
+
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
520
|
+
/* @__PURE__ */ jsxs(
|
|
521
|
+
Tabs.List,
|
|
522
|
+
{
|
|
523
|
+
"aria-label": formatMessage({
|
|
524
|
+
id: "content-releases.pages.Releases.tab-group.label",
|
|
525
|
+
defaultMessage: "Releases list"
|
|
526
|
+
}),
|
|
527
|
+
children: [
|
|
528
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
|
|
520
529
|
{
|
|
521
530
|
id: "content-releases.pages.Releases.tab.pending",
|
|
522
531
|
defaultMessage: "Pending ({count})"
|
|
@@ -525,55 +534,48 @@ const ReleasesPage = () => {
|
|
|
525
534
|
count: totalPendingReleases
|
|
526
535
|
}
|
|
527
536
|
) }),
|
|
528
|
-
/* @__PURE__ */ jsx(
|
|
537
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
|
|
529
538
|
id: "content-releases.pages.Releases.tab.done",
|
|
530
539
|
defaultMessage: "Done"
|
|
531
540
|
}) })
|
|
532
|
-
]
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
sectionTitle: "pending",
|
|
540
|
-
releases: response?.currentData?.data,
|
|
541
|
-
isError
|
|
542
|
-
}
|
|
543
|
-
) }),
|
|
544
|
-
/* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
|
|
545
|
-
ReleasesGrid,
|
|
546
|
-
{
|
|
547
|
-
sectionTitle: "done",
|
|
548
|
-
releases: response?.currentData?.data,
|
|
549
|
-
isError
|
|
550
|
-
}
|
|
551
|
-
) })
|
|
552
|
-
] })
|
|
553
|
-
]
|
|
554
|
-
}
|
|
555
|
-
),
|
|
556
|
-
response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
|
|
557
|
-
/* @__PURE__ */ jsx(
|
|
558
|
-
PageSizeURLQuery,
|
|
541
|
+
]
|
|
542
|
+
}
|
|
543
|
+
),
|
|
544
|
+
/* @__PURE__ */ jsx(Divider, {})
|
|
545
|
+
] }),
|
|
546
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
|
|
547
|
+
ReleasesGrid,
|
|
559
548
|
{
|
|
560
|
-
|
|
561
|
-
|
|
549
|
+
sectionTitle: "pending",
|
|
550
|
+
releases: response?.currentData?.data,
|
|
551
|
+
isError
|
|
562
552
|
}
|
|
563
|
-
),
|
|
564
|
-
/* @__PURE__ */ jsx(
|
|
565
|
-
|
|
553
|
+
) }),
|
|
554
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
|
|
555
|
+
ReleasesGrid,
|
|
566
556
|
{
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
557
|
+
sectionTitle: "done",
|
|
558
|
+
releases: response?.currentData?.data,
|
|
559
|
+
isError
|
|
570
560
|
}
|
|
571
|
-
)
|
|
572
|
-
] })
|
|
561
|
+
) })
|
|
562
|
+
] }),
|
|
563
|
+
/* @__PURE__ */ jsxs(
|
|
564
|
+
Pagination.Root,
|
|
565
|
+
{
|
|
566
|
+
...response?.currentData?.meta?.pagination,
|
|
567
|
+
defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
|
|
568
|
+
children: [
|
|
569
|
+
/* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
|
|
570
|
+
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
571
|
+
]
|
|
572
|
+
}
|
|
573
|
+
)
|
|
573
574
|
] }) }),
|
|
574
|
-
|
|
575
|
+
/* @__PURE__ */ jsx(
|
|
575
576
|
ReleaseModal,
|
|
576
577
|
{
|
|
578
|
+
open: releaseModalShown,
|
|
577
579
|
handleClose: toggleAddReleaseModal,
|
|
578
580
|
handleSubmit: handleAddRelease,
|
|
579
581
|
isLoading: isSubmittingForm,
|
|
@@ -597,7 +599,7 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
597
599
|
}
|
|
598
600
|
|
|
599
601
|
&:hover {
|
|
600
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
602
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
601
603
|
}
|
|
602
604
|
`;
|
|
603
605
|
const PencilIcon = styled(Pencil)`
|
|
@@ -617,29 +619,34 @@ const TrashIcon = styled(Trash)`
|
|
|
617
619
|
const TypographyMaxWidth = styled(Typography)`
|
|
618
620
|
max-width: 300px;
|
|
619
621
|
`;
|
|
620
|
-
const EntryValidationText = ({ action, schema,
|
|
622
|
+
const EntryValidationText = ({ action, schema, entry }) => {
|
|
621
623
|
const { formatMessage } = useIntl();
|
|
622
|
-
const { validate } = unstable_useDocument(
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
624
|
+
const { validate } = unstable_useDocument(
|
|
625
|
+
{
|
|
626
|
+
collectionType: schema?.kind ?? "",
|
|
627
|
+
model: schema?.uid ?? ""
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
skip: !schema
|
|
631
|
+
}
|
|
632
|
+
);
|
|
633
|
+
const errors = validate(entry) ?? {};
|
|
628
634
|
if (Object.keys(errors).length > 0) {
|
|
629
635
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
630
636
|
([key, value]) => formatMessage(
|
|
637
|
+
// @ts-expect-error – TODO: fix this will better checks
|
|
631
638
|
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
632
639
|
{ field: key }
|
|
633
640
|
)
|
|
634
641
|
).join(" ");
|
|
635
642
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
636
|
-
/* @__PURE__ */ jsx(
|
|
643
|
+
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
637
644
|
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
638
645
|
] });
|
|
639
646
|
}
|
|
640
647
|
if (action == "publish") {
|
|
641
648
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
642
|
-
/* @__PURE__ */ jsx(
|
|
649
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
643
650
|
entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
644
651
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
645
652
|
defaultMessage: "Already published"
|
|
@@ -650,7 +657,7 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
|
650
657
|
] });
|
|
651
658
|
}
|
|
652
659
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
653
|
-
/* @__PURE__ */ jsx(
|
|
660
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
654
661
|
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
655
662
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
656
663
|
defaultMessage: "Already unpublished"
|
|
@@ -670,20 +677,23 @@ const ReleaseDetailsLayout = ({
|
|
|
670
677
|
const {
|
|
671
678
|
data,
|
|
672
679
|
isLoading: isLoadingDetails,
|
|
673
|
-
isError,
|
|
674
680
|
error
|
|
675
|
-
} = useGetReleaseQuery(
|
|
681
|
+
} = useGetReleaseQuery(
|
|
682
|
+
{ id: releaseId },
|
|
683
|
+
{
|
|
684
|
+
skip: !releaseId
|
|
685
|
+
}
|
|
686
|
+
);
|
|
676
687
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
677
|
-
const toggleNotification = useNotification();
|
|
688
|
+
const { toggleNotification } = useNotification();
|
|
678
689
|
const { formatAPIError } = useAPIErrorHandler();
|
|
679
|
-
const {
|
|
680
|
-
|
|
681
|
-
} = useRBAC(PERMISSIONS);
|
|
690
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
691
|
+
const { canUpdate, canDelete, canPublish } = allowedActions;
|
|
682
692
|
const dispatch = useTypedDispatch();
|
|
683
693
|
const { trackUsage } = useTracking();
|
|
684
694
|
const release = data?.data;
|
|
685
|
-
const handlePublishRelease = async () => {
|
|
686
|
-
const response = await publishRelease({ id
|
|
695
|
+
const handlePublishRelease = (id) => async () => {
|
|
696
|
+
const response = await publishRelease({ id });
|
|
687
697
|
if ("data" in response) {
|
|
688
698
|
toggleNotification({
|
|
689
699
|
type: "success",
|
|
@@ -698,20 +708,25 @@ const ReleaseDetailsLayout = ({
|
|
|
698
708
|
totalPublishedEntries,
|
|
699
709
|
totalUnpublishedEntries
|
|
700
710
|
});
|
|
701
|
-
} else if (
|
|
711
|
+
} else if (isFetchError(response.error)) {
|
|
702
712
|
toggleNotification({
|
|
703
|
-
type: "
|
|
713
|
+
type: "danger",
|
|
704
714
|
message: formatAPIError(response.error)
|
|
705
715
|
});
|
|
706
716
|
} else {
|
|
707
717
|
toggleNotification({
|
|
708
|
-
type: "
|
|
718
|
+
type: "danger",
|
|
709
719
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
710
720
|
});
|
|
711
721
|
}
|
|
712
722
|
};
|
|
713
723
|
const handleRefresh = () => {
|
|
714
|
-
dispatch(
|
|
724
|
+
dispatch(
|
|
725
|
+
releaseApi.util.invalidateTags([
|
|
726
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
727
|
+
{ type: "Release", id: releaseId }
|
|
728
|
+
])
|
|
729
|
+
);
|
|
715
730
|
};
|
|
716
731
|
const getCreatedByUser = () => {
|
|
717
732
|
if (!release?.createdBy) {
|
|
@@ -726,28 +741,26 @@ const ReleaseDetailsLayout = ({
|
|
|
726
741
|
return release.createdBy.email;
|
|
727
742
|
};
|
|
728
743
|
if (isLoadingDetails) {
|
|
729
|
-
return /* @__PURE__ */ jsx(
|
|
744
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
730
745
|
}
|
|
731
|
-
if (
|
|
746
|
+
if (isBaseQueryError(error) && "code" in error || !release) {
|
|
732
747
|
return /* @__PURE__ */ jsx(
|
|
733
|
-
|
|
748
|
+
Navigate,
|
|
734
749
|
{
|
|
735
|
-
to:
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
}
|
|
750
|
+
to: "..",
|
|
751
|
+
state: {
|
|
752
|
+
errors: [
|
|
753
|
+
{
|
|
754
|
+
// @ts-expect-error – TODO: fix this weird error flow
|
|
755
|
+
code: error?.code
|
|
756
|
+
}
|
|
757
|
+
]
|
|
744
758
|
}
|
|
745
759
|
}
|
|
746
760
|
);
|
|
747
761
|
}
|
|
748
762
|
const totalEntries = release.actions.meta.count || 0;
|
|
749
763
|
const hasCreatedByUser = Boolean(getCreatedByUser());
|
|
750
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
751
764
|
const isScheduled = release.scheduledAt && release.timezone;
|
|
752
765
|
const numberOfEntriesText = formatMessage(
|
|
753
766
|
{
|
|
@@ -778,34 +791,30 @@ const ReleaseDetailsLayout = ({
|
|
|
778
791
|
) : "";
|
|
779
792
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
780
793
|
/* @__PURE__ */ jsx(
|
|
781
|
-
|
|
794
|
+
Layouts.Header,
|
|
782
795
|
{
|
|
783
796
|
title: release.name,
|
|
784
797
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
785
|
-
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (
|
|
798
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
786
799
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
787
800
|
] }),
|
|
788
|
-
navigationAction: /* @__PURE__ */ jsx(
|
|
789
|
-
id: "global.back",
|
|
790
|
-
defaultMessage: "Back"
|
|
791
|
-
}) }),
|
|
801
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
792
802
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
793
803
|
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
794
804
|
/* @__PURE__ */ jsx(
|
|
795
805
|
Menu.Trigger,
|
|
796
806
|
{
|
|
797
|
-
as: IconButton,
|
|
798
807
|
paddingLeft: 2,
|
|
799
808
|
paddingRight: 2,
|
|
800
809
|
"aria-label": formatMessage({
|
|
801
810
|
id: "content-releases.header.actions.open-release-actions",
|
|
802
811
|
defaultMessage: "Release edit and delete menu"
|
|
803
812
|
}),
|
|
804
|
-
|
|
805
|
-
|
|
813
|
+
variant: "tertiary",
|
|
814
|
+
children: /* @__PURE__ */ jsx(More, {})
|
|
806
815
|
}
|
|
807
816
|
),
|
|
808
|
-
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
|
|
817
|
+
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
|
|
809
818
|
/* @__PURE__ */ jsxs(
|
|
810
819
|
Flex,
|
|
811
820
|
{
|
|
@@ -827,7 +836,7 @@ const ReleaseDetailsLayout = ({
|
|
|
827
836
|
{
|
|
828
837
|
disabled: !canDelete,
|
|
829
838
|
onSelect: toggleWarningSubmit,
|
|
830
|
-
variant: "danger",
|
|
839
|
+
$variant: "danger",
|
|
831
840
|
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
832
841
|
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
833
842
|
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
@@ -854,7 +863,7 @@ const ReleaseDetailsLayout = ({
|
|
|
854
863
|
defaultMessage: "Created"
|
|
855
864
|
}) }),
|
|
856
865
|
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
857
|
-
/* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
|
|
866
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
858
867
|
formatMessage(
|
|
859
868
|
{
|
|
860
869
|
id: "content-releases.header.actions.created.description",
|
|
@@ -872,12 +881,12 @@ const ReleaseDetailsLayout = ({
|
|
|
872
881
|
id: "content-releases.header.actions.refresh",
|
|
873
882
|
defaultMessage: "Refresh"
|
|
874
883
|
}) }),
|
|
875
|
-
|
|
884
|
+
canPublish ? /* @__PURE__ */ jsx(
|
|
876
885
|
Button,
|
|
877
886
|
{
|
|
878
887
|
size: "S",
|
|
879
888
|
variant: "default",
|
|
880
|
-
onClick: handlePublishRelease,
|
|
889
|
+
onClick: handlePublishRelease(release.id.toString()),
|
|
881
890
|
loading: isPublishing,
|
|
882
891
|
disabled: release.actions.meta.count === 0,
|
|
883
892
|
children: formatMessage({
|
|
@@ -885,7 +894,7 @@ const ReleaseDetailsLayout = ({
|
|
|
885
894
|
defaultMessage: "Publish"
|
|
886
895
|
})
|
|
887
896
|
}
|
|
888
|
-
)
|
|
897
|
+
) : null
|
|
889
898
|
] })
|
|
890
899
|
}
|
|
891
900
|
),
|
|
@@ -893,6 +902,7 @@ const ReleaseDetailsLayout = ({
|
|
|
893
902
|
] });
|
|
894
903
|
};
|
|
895
904
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
905
|
+
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
896
906
|
const getGroupByOptionLabel = (value) => {
|
|
897
907
|
if (value === "locale") {
|
|
898
908
|
return {
|
|
@@ -911,21 +921,33 @@ const getGroupByOptionLabel = (value) => {
|
|
|
911
921
|
defaultMessage: "Content-Types"
|
|
912
922
|
};
|
|
913
923
|
};
|
|
914
|
-
const ReleaseDetailsBody = () => {
|
|
924
|
+
const ReleaseDetailsBody = ({ releaseId }) => {
|
|
915
925
|
const { formatMessage } = useIntl();
|
|
916
|
-
const { releaseId } = useParams();
|
|
917
926
|
const [{ query }, setQuery] = useQueryParams();
|
|
918
|
-
const toggleNotification = useNotification();
|
|
927
|
+
const { toggleNotification } = useNotification();
|
|
919
928
|
const { formatAPIError } = useAPIErrorHandler();
|
|
920
929
|
const {
|
|
921
930
|
data: releaseData,
|
|
922
931
|
isLoading: isReleaseLoading,
|
|
923
|
-
isError: isReleaseError,
|
|
924
932
|
error: releaseError
|
|
925
933
|
} = useGetReleaseQuery({ id: releaseId });
|
|
926
934
|
const {
|
|
927
935
|
allowedActions: { canUpdate }
|
|
928
936
|
} = useRBAC(PERMISSIONS);
|
|
937
|
+
const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
|
|
938
|
+
const { hasI18nEnabled } = runHookWaterfall(
|
|
939
|
+
"ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
|
|
940
|
+
{
|
|
941
|
+
displayedHeaders: {
|
|
942
|
+
label: formatMessage({
|
|
943
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
944
|
+
defaultMessage: "locale"
|
|
945
|
+
}),
|
|
946
|
+
name: "locale"
|
|
947
|
+
},
|
|
948
|
+
hasI18nEnabled: false
|
|
949
|
+
}
|
|
950
|
+
);
|
|
929
951
|
const release = releaseData?.data;
|
|
930
952
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
931
953
|
const {
|
|
@@ -954,65 +976,59 @@ const ReleaseDetailsBody = () => {
|
|
|
954
976
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
955
977
|
});
|
|
956
978
|
if ("error" in response) {
|
|
957
|
-
if (
|
|
979
|
+
if (isFetchError(response.error)) {
|
|
958
980
|
toggleNotification({
|
|
959
|
-
type: "
|
|
981
|
+
type: "danger",
|
|
960
982
|
message: formatAPIError(response.error)
|
|
961
983
|
});
|
|
962
984
|
} else {
|
|
963
985
|
toggleNotification({
|
|
964
|
-
type: "
|
|
986
|
+
type: "danger",
|
|
965
987
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
966
988
|
});
|
|
967
989
|
}
|
|
968
990
|
}
|
|
969
991
|
};
|
|
970
992
|
if (isLoading || isReleaseLoading) {
|
|
971
|
-
return /* @__PURE__ */ jsx(
|
|
993
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
972
994
|
}
|
|
973
995
|
const releaseActions = data?.data;
|
|
974
996
|
const releaseMeta = data?.meta;
|
|
975
997
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
976
998
|
const components = releaseMeta?.components || {};
|
|
977
|
-
if (
|
|
999
|
+
if (isBaseQueryError(releaseError) || !release) {
|
|
978
1000
|
const errorsArray = [];
|
|
979
|
-
if (releaseError) {
|
|
1001
|
+
if (releaseError && "code" in releaseError) {
|
|
980
1002
|
errorsArray.push({
|
|
981
1003
|
code: releaseError.code
|
|
982
1004
|
});
|
|
983
1005
|
}
|
|
984
|
-
if (releaseActionsError) {
|
|
1006
|
+
if (releaseActionsError && "code" in releaseActionsError) {
|
|
985
1007
|
errorsArray.push({
|
|
986
1008
|
code: releaseActionsError.code
|
|
987
1009
|
});
|
|
988
1010
|
}
|
|
989
1011
|
return /* @__PURE__ */ jsx(
|
|
990
|
-
|
|
1012
|
+
Navigate,
|
|
991
1013
|
{
|
|
992
|
-
to:
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
errors: errorsArray
|
|
996
|
-
}
|
|
1014
|
+
to: "..",
|
|
1015
|
+
state: {
|
|
1016
|
+
errors: errorsArray
|
|
997
1017
|
}
|
|
998
1018
|
}
|
|
999
1019
|
);
|
|
1000
1020
|
}
|
|
1001
1021
|
if (isError || !releaseActions) {
|
|
1002
|
-
return /* @__PURE__ */ jsx(
|
|
1022
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
1003
1023
|
}
|
|
1004
1024
|
if (Object.keys(releaseActions).length === 0) {
|
|
1005
|
-
return /* @__PURE__ */ jsx(
|
|
1006
|
-
|
|
1025
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
|
|
1026
|
+
EmptyStateLayout,
|
|
1007
1027
|
{
|
|
1008
|
-
content: {
|
|
1009
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1010
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1011
|
-
},
|
|
1012
1028
|
action: /* @__PURE__ */ jsx(
|
|
1013
1029
|
LinkButton,
|
|
1014
1030
|
{
|
|
1015
|
-
|
|
1031
|
+
tag: Link$1,
|
|
1016
1032
|
to: {
|
|
1017
1033
|
pathname: "/content-manager"
|
|
1018
1034
|
},
|
|
@@ -1023,18 +1039,59 @@ const ReleaseDetailsBody = () => {
|
|
|
1023
1039
|
defaultMessage: "Open the Content Manager"
|
|
1024
1040
|
})
|
|
1025
1041
|
}
|
|
1026
|
-
)
|
|
1042
|
+
),
|
|
1043
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
1044
|
+
content: formatMessage({
|
|
1045
|
+
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1046
|
+
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1047
|
+
})
|
|
1027
1048
|
}
|
|
1028
1049
|
) });
|
|
1029
1050
|
}
|
|
1030
|
-
|
|
1051
|
+
const groupByLabel = formatMessage({
|
|
1052
|
+
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1053
|
+
defaultMessage: "Group by"
|
|
1054
|
+
});
|
|
1055
|
+
const headers = [
|
|
1056
|
+
// ...displayedHeaders,
|
|
1057
|
+
{
|
|
1058
|
+
label: formatMessage({
|
|
1059
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1060
|
+
defaultMessage: "name"
|
|
1061
|
+
}),
|
|
1062
|
+
name: "name"
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
label: formatMessage({
|
|
1066
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1067
|
+
defaultMessage: "content-type"
|
|
1068
|
+
}),
|
|
1069
|
+
name: "content-type"
|
|
1070
|
+
},
|
|
1071
|
+
{
|
|
1072
|
+
label: formatMessage({
|
|
1073
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1074
|
+
defaultMessage: "action"
|
|
1075
|
+
}),
|
|
1076
|
+
name: "action"
|
|
1077
|
+
},
|
|
1078
|
+
...!release.releasedAt ? [
|
|
1079
|
+
{
|
|
1080
|
+
label: formatMessage({
|
|
1081
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1082
|
+
defaultMessage: "status"
|
|
1083
|
+
}),
|
|
1084
|
+
name: "status"
|
|
1085
|
+
}
|
|
1086
|
+
] : []
|
|
1087
|
+
];
|
|
1088
|
+
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1089
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1031
1090
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1032
1091
|
SingleSelect,
|
|
1033
1092
|
{
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
defaultMessage: "Group by"
|
|
1037
|
-
}),
|
|
1093
|
+
placeholder: groupByLabel,
|
|
1094
|
+
"aria-label": groupByLabel,
|
|
1038
1095
|
customizeContent: (value) => formatMessage(
|
|
1039
1096
|
{
|
|
1040
1097
|
id: `content-releases.pages.ReleaseDetails.groupBy.label`,
|
|
@@ -1046,7 +1103,7 @@ const ReleaseDetailsBody = () => {
|
|
|
1046
1103
|
),
|
|
1047
1104
|
value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
|
|
1048
1105
|
onChange: (value) => setQuery({ groupBy: value }),
|
|
1049
|
-
children:
|
|
1106
|
+
children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
|
|
1050
1107
|
}
|
|
1051
1108
|
) }),
|
|
1052
1109
|
Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
|
|
@@ -1058,72 +1115,15 @@ const ReleaseDetailsBody = () => {
|
|
|
1058
1115
|
...item,
|
|
1059
1116
|
id: Number(item.entry.id)
|
|
1060
1117
|
})),
|
|
1061
|
-
|
|
1062
|
-
isLoading,
|
|
1063
|
-
isFetching,
|
|
1118
|
+
headers,
|
|
1119
|
+
isLoading: isLoading || isFetching,
|
|
1064
1120
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1065
|
-
/* @__PURE__ */
|
|
1066
|
-
|
|
1067
|
-
Table.HeaderCell,
|
|
1068
|
-
{
|
|
1069
|
-
fieldSchemaType: "string",
|
|
1070
|
-
label: formatMessage({
|
|
1071
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1072
|
-
defaultMessage: "name"
|
|
1073
|
-
}),
|
|
1074
|
-
name: "name"
|
|
1075
|
-
}
|
|
1076
|
-
),
|
|
1077
|
-
/* @__PURE__ */ jsx(
|
|
1078
|
-
Table.HeaderCell,
|
|
1079
|
-
{
|
|
1080
|
-
fieldSchemaType: "string",
|
|
1081
|
-
label: formatMessage({
|
|
1082
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1083
|
-
defaultMessage: "locale"
|
|
1084
|
-
}),
|
|
1085
|
-
name: "locale"
|
|
1086
|
-
}
|
|
1087
|
-
),
|
|
1088
|
-
/* @__PURE__ */ jsx(
|
|
1089
|
-
Table.HeaderCell,
|
|
1090
|
-
{
|
|
1091
|
-
fieldSchemaType: "string",
|
|
1092
|
-
label: formatMessage({
|
|
1093
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1094
|
-
defaultMessage: "content-type"
|
|
1095
|
-
}),
|
|
1096
|
-
name: "content-type"
|
|
1097
|
-
}
|
|
1098
|
-
),
|
|
1099
|
-
/* @__PURE__ */ jsx(
|
|
1100
|
-
Table.HeaderCell,
|
|
1101
|
-
{
|
|
1102
|
-
fieldSchemaType: "string",
|
|
1103
|
-
label: formatMessage({
|
|
1104
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1105
|
-
defaultMessage: "action"
|
|
1106
|
-
}),
|
|
1107
|
-
name: "action"
|
|
1108
|
-
}
|
|
1109
|
-
),
|
|
1110
|
-
!release.releasedAt && /* @__PURE__ */ jsx(
|
|
1111
|
-
Table.HeaderCell,
|
|
1112
|
-
{
|
|
1113
|
-
fieldSchemaType: "string",
|
|
1114
|
-
label: formatMessage({
|
|
1115
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1116
|
-
defaultMessage: "status"
|
|
1117
|
-
}),
|
|
1118
|
-
name: "status"
|
|
1119
|
-
}
|
|
1120
|
-
)
|
|
1121
|
-
] }),
|
|
1122
|
-
/* @__PURE__ */ jsx(Table.LoadingBody, {}),
|
|
1121
|
+
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
|
|
1122
|
+
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1123
1123
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1124
1124
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1125
1125
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1126
|
-
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1126
|
+
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1127
1127
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
1128
1128
|
/* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
|
|
1129
1129
|
{
|
|
@@ -1177,34 +1177,39 @@ const ReleaseDetailsBody = () => {
|
|
|
1177
1177
|
}
|
|
1178
1178
|
)
|
|
1179
1179
|
] }, `releases-group-${key}`)),
|
|
1180
|
-
/* @__PURE__ */ jsxs(
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
}
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1180
|
+
/* @__PURE__ */ jsxs(
|
|
1181
|
+
Pagination.Root,
|
|
1182
|
+
{
|
|
1183
|
+
...releaseMeta?.pagination,
|
|
1184
|
+
defaultPageSize: releaseMeta?.pagination?.pageSize,
|
|
1185
|
+
children: [
|
|
1186
|
+
/* @__PURE__ */ jsx(Pagination.PageSize, {}),
|
|
1187
|
+
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
1188
|
+
]
|
|
1189
|
+
}
|
|
1190
|
+
)
|
|
1191
1191
|
] }) });
|
|
1192
1192
|
};
|
|
1193
1193
|
const ReleaseDetailsPage = () => {
|
|
1194
1194
|
const { formatMessage } = useIntl();
|
|
1195
1195
|
const { releaseId } = useParams();
|
|
1196
|
-
const toggleNotification = useNotification();
|
|
1196
|
+
const { toggleNotification } = useNotification();
|
|
1197
1197
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1198
|
-
const
|
|
1198
|
+
const navigate = useNavigate();
|
|
1199
1199
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1200
1200
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1201
1201
|
const {
|
|
1202
1202
|
isLoading: isLoadingDetails,
|
|
1203
1203
|
data,
|
|
1204
1204
|
isSuccess: isSuccessDetails
|
|
1205
|
-
} = useGetReleaseQuery(
|
|
1205
|
+
} = useGetReleaseQuery(
|
|
1206
|
+
{ id: releaseId },
|
|
1207
|
+
{
|
|
1208
|
+
skip: !releaseId
|
|
1209
|
+
}
|
|
1210
|
+
);
|
|
1206
1211
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1207
|
-
const [deleteRelease
|
|
1212
|
+
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1208
1213
|
const toggleEditReleaseModal = () => {
|
|
1209
1214
|
setReleaseModalShown((prev) => !prev);
|
|
1210
1215
|
};
|
|
@@ -1215,15 +1220,18 @@ const ReleaseDetailsPage = () => {
|
|
|
1215
1220
|
{
|
|
1216
1221
|
toggleEditReleaseModal,
|
|
1217
1222
|
toggleWarningSubmit,
|
|
1218
|
-
children: /* @__PURE__ */ jsx(
|
|
1223
|
+
children: /* @__PURE__ */ jsx(Page.Loading, {})
|
|
1219
1224
|
}
|
|
1220
1225
|
);
|
|
1221
1226
|
}
|
|
1227
|
+
if (!releaseId) {
|
|
1228
|
+
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1229
|
+
}
|
|
1222
1230
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1223
1231
|
const title = releaseData?.name || "";
|
|
1224
1232
|
const timezone = releaseData?.timezone ?? null;
|
|
1225
1233
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1226
|
-
const date = scheduledAt ?
|
|
1234
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
|
|
1227
1235
|
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1228
1236
|
const handleEditRelease = async (values) => {
|
|
1229
1237
|
const response = await updateRelease({
|
|
@@ -1240,33 +1248,33 @@ const ReleaseDetailsPage = () => {
|
|
|
1240
1248
|
defaultMessage: "Release updated."
|
|
1241
1249
|
})
|
|
1242
1250
|
});
|
|
1243
|
-
|
|
1251
|
+
toggleEditReleaseModal();
|
|
1252
|
+
} else if (isFetchError(response.error)) {
|
|
1244
1253
|
toggleNotification({
|
|
1245
|
-
type: "
|
|
1254
|
+
type: "danger",
|
|
1246
1255
|
message: formatAPIError(response.error)
|
|
1247
1256
|
});
|
|
1248
1257
|
} else {
|
|
1249
1258
|
toggleNotification({
|
|
1250
|
-
type: "
|
|
1259
|
+
type: "danger",
|
|
1251
1260
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1252
1261
|
});
|
|
1253
1262
|
}
|
|
1254
|
-
toggleEditReleaseModal();
|
|
1255
1263
|
};
|
|
1256
1264
|
const handleDeleteRelease = async () => {
|
|
1257
1265
|
const response = await deleteRelease({
|
|
1258
1266
|
id: releaseId
|
|
1259
1267
|
});
|
|
1260
1268
|
if ("data" in response) {
|
|
1261
|
-
|
|
1262
|
-
} else if (
|
|
1269
|
+
navigate("..");
|
|
1270
|
+
} else if (isFetchError(response.error)) {
|
|
1263
1271
|
toggleNotification({
|
|
1264
|
-
type: "
|
|
1272
|
+
type: "danger",
|
|
1265
1273
|
message: formatAPIError(response.error)
|
|
1266
1274
|
});
|
|
1267
1275
|
} else {
|
|
1268
1276
|
toggleNotification({
|
|
1269
|
-
type: "
|
|
1277
|
+
type: "danger",
|
|
1270
1278
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1271
1279
|
});
|
|
1272
1280
|
}
|
|
@@ -1277,10 +1285,11 @@ const ReleaseDetailsPage = () => {
|
|
|
1277
1285
|
toggleEditReleaseModal,
|
|
1278
1286
|
toggleWarningSubmit,
|
|
1279
1287
|
children: [
|
|
1280
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1281
|
-
|
|
1288
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1289
|
+
/* @__PURE__ */ jsx(
|
|
1282
1290
|
ReleaseModal,
|
|
1283
1291
|
{
|
|
1292
|
+
open: releaseModalShown,
|
|
1284
1293
|
handleClose: toggleEditReleaseModal,
|
|
1285
1294
|
handleSubmit: handleEditRelease,
|
|
1286
1295
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1294,30 +1303,21 @@ const ReleaseDetailsPage = () => {
|
|
|
1294
1303
|
}
|
|
1295
1304
|
}
|
|
1296
1305
|
),
|
|
1297
|
-
/* @__PURE__ */ jsx(
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
id: "content-releases.dialog.confirmation-message",
|
|
1302
|
-
defaultMessage: "Are you sure you want to delete this release?"
|
|
1303
|
-
},
|
|
1304
|
-
isOpen: showWarningSubmit,
|
|
1305
|
-
isConfirmButtonLoading: isDeletingRelease,
|
|
1306
|
-
onToggleDialog: toggleWarningSubmit,
|
|
1307
|
-
onConfirm: handleDeleteRelease
|
|
1308
|
-
}
|
|
1309
|
-
)
|
|
1306
|
+
/* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
|
|
1307
|
+
id: "content-releases.dialog.confirmation-message",
|
|
1308
|
+
defaultMessage: "Are you sure you want to delete this release?"
|
|
1309
|
+
}) }) })
|
|
1310
1310
|
]
|
|
1311
1311
|
}
|
|
1312
1312
|
);
|
|
1313
1313
|
};
|
|
1314
1314
|
const App = () => {
|
|
1315
|
-
return /* @__PURE__ */ jsx(
|
|
1316
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1317
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1315
|
+
return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
|
|
1316
|
+
/* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
|
|
1317
|
+
/* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
|
|
1318
1318
|
] }) });
|
|
1319
1319
|
};
|
|
1320
1320
|
export {
|
|
1321
1321
|
App
|
|
1322
1322
|
};
|
|
1323
|
-
//# sourceMappingURL=App-
|
|
1323
|
+
//# sourceMappingURL=App-Do-Rnv0A.mjs.map
|