@strapi/content-releases 4.20.5 → 5.0.0-alpha.0
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-bpzO2Ljh.mjs → App-dbdAcsz_.mjs} +286 -288
- package/dist/_chunks/App-dbdAcsz_.mjs.map +1 -0
- package/dist/_chunks/{App-p8aKBitd.js → App-zwe_jKPv.js} +292 -294
- package/dist/_chunks/App-zwe_jKPv.js.map +1 -0
- package/dist/_chunks/{en-WuuhP6Bn.mjs → en-RdapH-9X.mjs} +1 -2
- package/dist/_chunks/en-RdapH-9X.mjs.map +1 -0
- package/dist/_chunks/{en-gcJJ5htG.js → en-faJDuv3q.js} +1 -2
- package/dist/_chunks/en-faJDuv3q.js.map +1 -0
- package/dist/_chunks/{index-AECgcaDa.mjs → index-RBaVMtyr.mjs} +78 -69
- package/dist/_chunks/index-RBaVMtyr.mjs.map +1 -0
- package/dist/_chunks/{index-fP3qoWZ4.js → index-TBrVNrv9.js} +76 -67
- package/dist/_chunks/index-TBrVNrv9.js.map +1 -0
- package/dist/admin/index.js +1 -14
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -14
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +1 -0
- package/dist/admin/src/components/RelativeTime.d.ts +28 -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/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 +369 -0
- package/dist/admin/src/store/hooks.d.ts +7 -0
- package/dist/admin/src/utils/time.d.ts +1 -0
- package/dist/server/index.js +277 -232
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +278 -232
- 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 +19 -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 +11 -0
- package/dist/server/src/controllers/release.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release-action.d.ts +3 -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 +2095 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/migrations/index.d.ts +12 -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 +166 -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 +22 -28
- package/dist/_chunks/App-bpzO2Ljh.mjs.map +0 -1
- package/dist/_chunks/App-p8aKBitd.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,49 @@
|
|
|
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 useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useNotification, useAPIErrorHandler, useLicenseLimits, useTracking, Page, Pagination, ConfirmDialog, BackButton, Table, unstable_useDocument } 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 useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-RBaVMtyr.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, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Link as Link$1, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
|
|
6
|
+
import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Alert, Main, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
|
|
8
7
|
import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
|
|
9
|
-
import {
|
|
8
|
+
import { useQueryParams, useRBAC } from "@strapi/helper-plugin";
|
|
9
|
+
import { Plus, EmptyDocuments, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
|
|
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, parse } from "date-fns";
|
|
14
|
+
import { intervalToDuration, isPast, formatISO, parse } from "date-fns";
|
|
15
15
|
import { Formik, Form, useFormikContext } from "formik";
|
|
16
16
|
import * as yup from "yup";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
18
|
+
const RelativeTime = React.forwardRef(
|
|
19
|
+
({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
|
|
20
|
+
const { formatRelativeTime, formatDate, formatTime } = useIntl();
|
|
21
|
+
const interval = intervalToDuration({
|
|
22
|
+
start: timestamp,
|
|
23
|
+
end: Date.now()
|
|
24
|
+
// see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
|
|
25
|
+
});
|
|
26
|
+
const unit = intervals.find((intervalUnit) => {
|
|
27
|
+
return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
|
|
28
|
+
});
|
|
29
|
+
const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
|
|
30
|
+
const customInterval = customIntervals.find(
|
|
31
|
+
(custom) => interval[custom.unit] < custom.threshold
|
|
32
|
+
);
|
|
33
|
+
const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
"time",
|
|
36
|
+
{
|
|
37
|
+
ref: forwardedRef,
|
|
38
|
+
dateTime: timestamp.toISOString(),
|
|
39
|
+
role: "time",
|
|
40
|
+
title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
|
|
41
|
+
...restProps,
|
|
42
|
+
children: displayText
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
);
|
|
21
47
|
const RELEASE_SCHEMA = yup.object().shape({
|
|
22
48
|
name: yup.string().trim().required(),
|
|
23
49
|
scheduledAt: yup.string().nullable(),
|
|
@@ -47,7 +73,6 @@ const ReleaseModal = ({
|
|
|
47
73
|
const { formatMessage } = useIntl();
|
|
48
74
|
const { pathname } = useLocation();
|
|
49
75
|
const isCreatingRelease = pathname === `/plugins/${pluginId}`;
|
|
50
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
51
76
|
const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
|
|
52
77
|
initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
|
|
53
78
|
);
|
|
@@ -105,93 +130,88 @@ const ReleaseModal = ({
|
|
|
105
130
|
required: true
|
|
106
131
|
}
|
|
107
132
|
),
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
133
|
+
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
134
|
+
Checkbox,
|
|
135
|
+
{
|
|
136
|
+
name: "isScheduled",
|
|
137
|
+
value: values.isScheduled,
|
|
138
|
+
onChange: (event) => {
|
|
139
|
+
setFieldValue("isScheduled", event.target.checked);
|
|
140
|
+
if (!event.target.checked) {
|
|
141
|
+
setFieldValue("date", null);
|
|
142
|
+
setFieldValue("time", "");
|
|
143
|
+
setFieldValue("timezone", null);
|
|
144
|
+
} else {
|
|
145
|
+
setFieldValue("date", initialValues.date);
|
|
146
|
+
setFieldValue("time", initialValues.time);
|
|
147
|
+
setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
children: /* @__PURE__ */ jsx(
|
|
151
|
+
Typography,
|
|
152
|
+
{
|
|
153
|
+
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
154
|
+
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
155
|
+
children: formatMessage({
|
|
156
|
+
id: "modal.form.input.label.schedule-release",
|
|
157
|
+
defaultMessage: "Schedule release"
|
|
158
|
+
})
|
|
159
|
+
}
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
) }),
|
|
163
|
+
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
164
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
165
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
166
|
+
DatePicker,
|
|
167
|
+
{
|
|
168
|
+
label: formatMessage({
|
|
169
|
+
id: "content-releases.modal.form.input.label.date",
|
|
170
|
+
defaultMessage: "Date"
|
|
171
|
+
}),
|
|
172
|
+
name: "date",
|
|
173
|
+
error: errors.date,
|
|
174
|
+
onChange: (date) => {
|
|
175
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
176
|
+
setFieldValue("date", isoFormatDate);
|
|
177
|
+
},
|
|
178
|
+
clearLabel: formatMessage({
|
|
179
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
180
|
+
defaultMessage: "Clear"
|
|
181
|
+
}),
|
|
182
|
+
onClear: () => {
|
|
117
183
|
setFieldValue("date", null);
|
|
184
|
+
},
|
|
185
|
+
selectedDate: values.date || void 0,
|
|
186
|
+
required: true,
|
|
187
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
188
|
+
}
|
|
189
|
+
) }),
|
|
190
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
191
|
+
TimePicker,
|
|
192
|
+
{
|
|
193
|
+
label: formatMessage({
|
|
194
|
+
id: "content-releases.modal.form.input.label.time",
|
|
195
|
+
defaultMessage: "Time"
|
|
196
|
+
}),
|
|
197
|
+
name: "time",
|
|
198
|
+
error: errors.time,
|
|
199
|
+
onChange: (time) => {
|
|
200
|
+
setFieldValue("time", time);
|
|
201
|
+
},
|
|
202
|
+
clearLabel: formatMessage({
|
|
203
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
204
|
+
defaultMessage: "Clear"
|
|
205
|
+
}),
|
|
206
|
+
onClear: () => {
|
|
118
207
|
setFieldValue("time", "");
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
children: /* @__PURE__ */ jsx(
|
|
130
|
-
Typography,
|
|
131
|
-
{
|
|
132
|
-
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
133
|
-
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
134
|
-
children: formatMessage({
|
|
135
|
-
id: "modal.form.input.label.schedule-release",
|
|
136
|
-
defaultMessage: "Schedule release"
|
|
137
|
-
})
|
|
138
|
-
}
|
|
139
|
-
)
|
|
140
|
-
}
|
|
141
|
-
) }),
|
|
142
|
-
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
143
|
-
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
144
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
145
|
-
DatePicker,
|
|
146
|
-
{
|
|
147
|
-
label: formatMessage({
|
|
148
|
-
id: "content-releases.modal.form.input.label.date",
|
|
149
|
-
defaultMessage: "Date"
|
|
150
|
-
}),
|
|
151
|
-
name: "date",
|
|
152
|
-
error: errors.date,
|
|
153
|
-
onChange: (date) => {
|
|
154
|
-
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
155
|
-
setFieldValue("date", isoFormatDate);
|
|
156
|
-
},
|
|
157
|
-
clearLabel: formatMessage({
|
|
158
|
-
id: "content-releases.modal.form.input.clearLabel",
|
|
159
|
-
defaultMessage: "Clear"
|
|
160
|
-
}),
|
|
161
|
-
onClear: () => {
|
|
162
|
-
setFieldValue("date", null);
|
|
163
|
-
},
|
|
164
|
-
selectedDate: values.date || void 0,
|
|
165
|
-
required: true,
|
|
166
|
-
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
167
|
-
}
|
|
168
|
-
) }),
|
|
169
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
170
|
-
TimePicker,
|
|
171
|
-
{
|
|
172
|
-
label: formatMessage({
|
|
173
|
-
id: "content-releases.modal.form.input.label.time",
|
|
174
|
-
defaultMessage: "Time"
|
|
175
|
-
}),
|
|
176
|
-
name: "time",
|
|
177
|
-
error: errors.time,
|
|
178
|
-
onChange: (time) => {
|
|
179
|
-
setFieldValue("time", time);
|
|
180
|
-
},
|
|
181
|
-
clearLabel: formatMessage({
|
|
182
|
-
id: "content-releases.modal.form.input.clearLabel",
|
|
183
|
-
defaultMessage: "Clear"
|
|
184
|
-
}),
|
|
185
|
-
onClear: () => {
|
|
186
|
-
setFieldValue("time", "");
|
|
187
|
-
},
|
|
188
|
-
value: values.time || void 0,
|
|
189
|
-
required: true
|
|
190
|
-
}
|
|
191
|
-
) })
|
|
192
|
-
] }),
|
|
193
|
-
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
194
|
-
] })
|
|
208
|
+
},
|
|
209
|
+
value: values.time || void 0,
|
|
210
|
+
required: true
|
|
211
|
+
}
|
|
212
|
+
) })
|
|
213
|
+
] }),
|
|
214
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
195
215
|
] })
|
|
196
216
|
] }) }),
|
|
197
217
|
/* @__PURE__ */ jsx(
|
|
@@ -295,9 +315,8 @@ const getBadgeProps = (status) => {
|
|
|
295
315
|
};
|
|
296
316
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
297
317
|
const { formatMessage } = useIntl();
|
|
298
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
299
318
|
if (isError) {
|
|
300
|
-
return /* @__PURE__ */ jsx(
|
|
319
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
301
320
|
}
|
|
302
321
|
if (releases?.length === 0) {
|
|
303
322
|
return /* @__PURE__ */ jsx(
|
|
@@ -316,7 +335,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
316
335
|
}
|
|
317
336
|
);
|
|
318
337
|
}
|
|
319
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name,
|
|
338
|
+
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
|
|
320
339
|
Flex,
|
|
321
340
|
{
|
|
322
341
|
direction: "column",
|
|
@@ -332,16 +351,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
332
351
|
children: [
|
|
333
352
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
334
353
|
/* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
335
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children:
|
|
354
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
336
355
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
337
356
|
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
|
-
) })
|
|
357
|
+
}) })
|
|
345
358
|
] }),
|
|
346
359
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
|
|
347
360
|
]
|
|
@@ -360,8 +373,7 @@ const INITIAL_FORM_VALUES = {
|
|
|
360
373
|
name: "",
|
|
361
374
|
date: null,
|
|
362
375
|
time: "",
|
|
363
|
-
|
|
364
|
-
isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
|
|
376
|
+
isScheduled: true,
|
|
365
377
|
scheduledAt: null,
|
|
366
378
|
timezone: null
|
|
367
379
|
};
|
|
@@ -369,9 +381,9 @@ const ReleasesPage = () => {
|
|
|
369
381
|
const tabRef = React.useRef(null);
|
|
370
382
|
const location = useLocation();
|
|
371
383
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
372
|
-
const toggleNotification = useNotification();
|
|
384
|
+
const { toggleNotification } = useNotification();
|
|
373
385
|
const { formatMessage } = useIntl();
|
|
374
|
-
const
|
|
386
|
+
const navigate = useNavigate();
|
|
375
387
|
const { formatAPIError } = useAPIErrorHandler();
|
|
376
388
|
const [{ query }, setQuery] = useQueryParams();
|
|
377
389
|
const response = useGetReleasesQuery(query);
|
|
@@ -379,13 +391,16 @@ const ReleasesPage = () => {
|
|
|
379
391
|
const { getFeature } = useLicenseLimits();
|
|
380
392
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
381
393
|
const { trackUsage } = useTracking();
|
|
394
|
+
const {
|
|
395
|
+
allowedActions: { canCreate }
|
|
396
|
+
} = useRBAC(PERMISSIONS);
|
|
382
397
|
const { isLoading, isSuccess, isError } = response;
|
|
383
398
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
384
399
|
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
385
400
|
React.useEffect(() => {
|
|
386
401
|
if (location?.state?.errors) {
|
|
387
402
|
toggleNotification({
|
|
388
|
-
type: "
|
|
403
|
+
type: "danger",
|
|
389
404
|
title: formatMessage({
|
|
390
405
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
391
406
|
defaultMessage: "Your request could not be processed."
|
|
@@ -395,9 +410,9 @@ const ReleasesPage = () => {
|
|
|
395
410
|
defaultMessage: "Please try again or open another release."
|
|
396
411
|
})
|
|
397
412
|
});
|
|
398
|
-
|
|
413
|
+
navigate("", { replace: true, state: null });
|
|
399
414
|
}
|
|
400
|
-
}, [formatMessage, location?.state?.errors,
|
|
415
|
+
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
401
416
|
React.useEffect(() => {
|
|
402
417
|
if (tabRef.current) {
|
|
403
418
|
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
@@ -407,7 +422,7 @@ const ReleasesPage = () => {
|
|
|
407
422
|
setReleaseModalShown((prev) => !prev);
|
|
408
423
|
};
|
|
409
424
|
if (isLoading) {
|
|
410
|
-
return /* @__PURE__ */ jsx(
|
|
425
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
411
426
|
}
|
|
412
427
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
413
428
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
@@ -438,15 +453,15 @@ const ReleasesPage = () => {
|
|
|
438
453
|
})
|
|
439
454
|
});
|
|
440
455
|
trackUsage("didCreateRelease");
|
|
441
|
-
|
|
456
|
+
navigate(response2.data.data.id.toString());
|
|
442
457
|
} else if (isAxiosError(response2.error)) {
|
|
443
458
|
toggleNotification({
|
|
444
|
-
type: "
|
|
459
|
+
type: "danger",
|
|
445
460
|
message: formatAPIError(response2.error)
|
|
446
461
|
});
|
|
447
462
|
} else {
|
|
448
463
|
toggleNotification({
|
|
449
|
-
type: "
|
|
464
|
+
type: "danger",
|
|
450
465
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
451
466
|
});
|
|
452
467
|
}
|
|
@@ -463,7 +478,7 @@ const ReleasesPage = () => {
|
|
|
463
478
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
464
479
|
defaultMessage: "Create and manage content updates"
|
|
465
480
|
}),
|
|
466
|
-
primaryAction:
|
|
481
|
+
primaryAction: canCreate ? /* @__PURE__ */ jsx(
|
|
467
482
|
Button,
|
|
468
483
|
{
|
|
469
484
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -474,7 +489,7 @@ const ReleasesPage = () => {
|
|
|
474
489
|
defaultMessage: "New release"
|
|
475
490
|
})
|
|
476
491
|
}
|
|
477
|
-
)
|
|
492
|
+
) : null
|
|
478
493
|
}
|
|
479
494
|
),
|
|
480
495
|
/* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -553,23 +568,17 @@ const ReleasesPage = () => {
|
|
|
553
568
|
]
|
|
554
569
|
}
|
|
555
570
|
),
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
pagination: {
|
|
568
|
-
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
)
|
|
572
|
-
] }) : null
|
|
571
|
+
/* @__PURE__ */ jsxs(
|
|
572
|
+
Pagination.Root,
|
|
573
|
+
{
|
|
574
|
+
...response?.currentData?.meta?.pagination,
|
|
575
|
+
defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
|
|
576
|
+
children: [
|
|
577
|
+
/* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
|
|
578
|
+
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
)
|
|
573
582
|
] }) }),
|
|
574
583
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
575
584
|
ReleaseModal,
|
|
@@ -617,14 +626,18 @@ const TrashIcon = styled(Trash)`
|
|
|
617
626
|
const TypographyMaxWidth = styled(Typography)`
|
|
618
627
|
max-width: 300px;
|
|
619
628
|
`;
|
|
620
|
-
const EntryValidationText = ({ action, schema,
|
|
629
|
+
const EntryValidationText = ({ action, schema, entry }) => {
|
|
621
630
|
const { formatMessage } = useIntl();
|
|
622
|
-
const { validate } = unstable_useDocument(
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
631
|
+
const { validate } = unstable_useDocument(
|
|
632
|
+
{
|
|
633
|
+
collectionType: schema?.kind ?? "",
|
|
634
|
+
model: schema?.uid ?? ""
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
skip: !schema
|
|
638
|
+
}
|
|
639
|
+
);
|
|
640
|
+
const errors = validate(entry) ?? {};
|
|
628
641
|
if (Object.keys(errors).length > 0) {
|
|
629
642
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
630
643
|
([key, value]) => formatMessage(
|
|
@@ -672,18 +685,22 @@ const ReleaseDetailsLayout = ({
|
|
|
672
685
|
isLoading: isLoadingDetails,
|
|
673
686
|
isError,
|
|
674
687
|
error
|
|
675
|
-
} = useGetReleaseQuery(
|
|
688
|
+
} = useGetReleaseQuery(
|
|
689
|
+
{ id: releaseId },
|
|
690
|
+
{
|
|
691
|
+
skip: !releaseId
|
|
692
|
+
}
|
|
693
|
+
);
|
|
676
694
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
677
|
-
const toggleNotification = useNotification();
|
|
695
|
+
const { toggleNotification } = useNotification();
|
|
678
696
|
const { formatAPIError } = useAPIErrorHandler();
|
|
679
|
-
const {
|
|
680
|
-
|
|
681
|
-
} = useRBAC(PERMISSIONS);
|
|
697
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
698
|
+
const { canUpdate, canDelete, canPublish } = allowedActions;
|
|
682
699
|
const dispatch = useTypedDispatch();
|
|
683
700
|
const { trackUsage } = useTracking();
|
|
684
701
|
const release = data?.data;
|
|
685
|
-
const handlePublishRelease = async () => {
|
|
686
|
-
const response = await publishRelease({ id
|
|
702
|
+
const handlePublishRelease = (id) => async () => {
|
|
703
|
+
const response = await publishRelease({ id });
|
|
687
704
|
if ("data" in response) {
|
|
688
705
|
toggleNotification({
|
|
689
706
|
type: "success",
|
|
@@ -700,12 +717,12 @@ const ReleaseDetailsLayout = ({
|
|
|
700
717
|
});
|
|
701
718
|
} else if (isAxiosError(response.error)) {
|
|
702
719
|
toggleNotification({
|
|
703
|
-
type: "
|
|
720
|
+
type: "danger",
|
|
704
721
|
message: formatAPIError(response.error)
|
|
705
722
|
});
|
|
706
723
|
} else {
|
|
707
724
|
toggleNotification({
|
|
708
|
-
type: "
|
|
725
|
+
type: "danger",
|
|
709
726
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
710
727
|
});
|
|
711
728
|
}
|
|
@@ -726,28 +743,25 @@ const ReleaseDetailsLayout = ({
|
|
|
726
743
|
return release.createdBy.email;
|
|
727
744
|
};
|
|
728
745
|
if (isLoadingDetails) {
|
|
729
|
-
return /* @__PURE__ */ jsx(
|
|
746
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
730
747
|
}
|
|
731
748
|
if (isError || !release) {
|
|
732
749
|
return /* @__PURE__ */ jsx(
|
|
733
|
-
|
|
750
|
+
Navigate,
|
|
734
751
|
{
|
|
735
|
-
to:
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
]
|
|
743
|
-
}
|
|
752
|
+
to: "..",
|
|
753
|
+
state: {
|
|
754
|
+
errors: [
|
|
755
|
+
{
|
|
756
|
+
code: error?.code
|
|
757
|
+
}
|
|
758
|
+
]
|
|
744
759
|
}
|
|
745
760
|
}
|
|
746
761
|
);
|
|
747
762
|
}
|
|
748
763
|
const totalEntries = release.actions.meta.count || 0;
|
|
749
764
|
const hasCreatedByUser = Boolean(getCreatedByUser());
|
|
750
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
751
765
|
const isScheduled = release.scheduledAt && release.timezone;
|
|
752
766
|
const numberOfEntriesText = formatMessage(
|
|
753
767
|
{
|
|
@@ -782,13 +796,10 @@ const ReleaseDetailsLayout = ({
|
|
|
782
796
|
{
|
|
783
797
|
title: release.name,
|
|
784
798
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
785
|
-
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (
|
|
799
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
786
800
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
787
801
|
] }),
|
|
788
|
-
navigationAction: /* @__PURE__ */ jsx(
|
|
789
|
-
id: "global.back",
|
|
790
|
-
defaultMessage: "Back"
|
|
791
|
-
}) }),
|
|
802
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
792
803
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
793
804
|
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
794
805
|
/* @__PURE__ */ jsx(
|
|
@@ -872,12 +883,12 @@ const ReleaseDetailsLayout = ({
|
|
|
872
883
|
id: "content-releases.header.actions.refresh",
|
|
873
884
|
defaultMessage: "Refresh"
|
|
874
885
|
}) }),
|
|
875
|
-
|
|
886
|
+
canPublish ? /* @__PURE__ */ jsx(
|
|
876
887
|
Button,
|
|
877
888
|
{
|
|
878
889
|
size: "S",
|
|
879
890
|
variant: "default",
|
|
880
|
-
onClick: handlePublishRelease,
|
|
891
|
+
onClick: handlePublishRelease(release.id.toString()),
|
|
881
892
|
loading: isPublishing,
|
|
882
893
|
disabled: release.actions.meta.count === 0,
|
|
883
894
|
children: formatMessage({
|
|
@@ -885,7 +896,7 @@ const ReleaseDetailsLayout = ({
|
|
|
885
896
|
defaultMessage: "Publish"
|
|
886
897
|
})
|
|
887
898
|
}
|
|
888
|
-
)
|
|
899
|
+
) : null
|
|
889
900
|
] })
|
|
890
901
|
}
|
|
891
902
|
),
|
|
@@ -911,11 +922,10 @@ const getGroupByOptionLabel = (value) => {
|
|
|
911
922
|
defaultMessage: "Content-Types"
|
|
912
923
|
};
|
|
913
924
|
};
|
|
914
|
-
const ReleaseDetailsBody = () => {
|
|
925
|
+
const ReleaseDetailsBody = ({ releaseId }) => {
|
|
915
926
|
const { formatMessage } = useIntl();
|
|
916
|
-
const { releaseId } = useParams();
|
|
917
927
|
const [{ query }, setQuery] = useQueryParams();
|
|
918
|
-
const toggleNotification = useNotification();
|
|
928
|
+
const { toggleNotification } = useNotification();
|
|
919
929
|
const { formatAPIError } = useAPIErrorHandler();
|
|
920
930
|
const {
|
|
921
931
|
data: releaseData,
|
|
@@ -956,19 +966,19 @@ const ReleaseDetailsBody = () => {
|
|
|
956
966
|
if ("error" in response) {
|
|
957
967
|
if (isAxiosError(response.error)) {
|
|
958
968
|
toggleNotification({
|
|
959
|
-
type: "
|
|
969
|
+
type: "danger",
|
|
960
970
|
message: formatAPIError(response.error)
|
|
961
971
|
});
|
|
962
972
|
} else {
|
|
963
973
|
toggleNotification({
|
|
964
|
-
type: "
|
|
974
|
+
type: "danger",
|
|
965
975
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
966
976
|
});
|
|
967
977
|
}
|
|
968
978
|
}
|
|
969
979
|
};
|
|
970
980
|
if (isLoading || isReleaseLoading) {
|
|
971
|
-
return /* @__PURE__ */ jsx(
|
|
981
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
972
982
|
}
|
|
973
983
|
const releaseActions = data?.data;
|
|
974
984
|
const releaseMeta = data?.meta;
|
|
@@ -987,32 +997,26 @@ const ReleaseDetailsBody = () => {
|
|
|
987
997
|
});
|
|
988
998
|
}
|
|
989
999
|
return /* @__PURE__ */ jsx(
|
|
990
|
-
|
|
1000
|
+
Navigate,
|
|
991
1001
|
{
|
|
992
|
-
to:
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
errors: errorsArray
|
|
996
|
-
}
|
|
1002
|
+
to: "..",
|
|
1003
|
+
state: {
|
|
1004
|
+
errors: errorsArray
|
|
997
1005
|
}
|
|
998
1006
|
}
|
|
999
1007
|
);
|
|
1000
1008
|
}
|
|
1001
1009
|
if (isError || !releaseActions) {
|
|
1002
|
-
return /* @__PURE__ */ jsx(
|
|
1010
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
1003
1011
|
}
|
|
1004
1012
|
if (Object.keys(releaseActions).length === 0) {
|
|
1005
1013
|
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
|
|
1006
|
-
|
|
1014
|
+
EmptyStateLayout,
|
|
1007
1015
|
{
|
|
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
1016
|
action: /* @__PURE__ */ jsx(
|
|
1013
1017
|
LinkButton,
|
|
1014
1018
|
{
|
|
1015
|
-
as: Link$
|
|
1019
|
+
as: Link$1,
|
|
1016
1020
|
to: {
|
|
1017
1021
|
pathname: "/content-manager"
|
|
1018
1022
|
},
|
|
@@ -1023,10 +1027,54 @@ const ReleaseDetailsBody = () => {
|
|
|
1023
1027
|
defaultMessage: "Open the Content Manager"
|
|
1024
1028
|
})
|
|
1025
1029
|
}
|
|
1026
|
-
)
|
|
1030
|
+
),
|
|
1031
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
|
|
1032
|
+
content: formatMessage({
|
|
1033
|
+
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1034
|
+
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1035
|
+
})
|
|
1027
1036
|
}
|
|
1028
1037
|
) });
|
|
1029
1038
|
}
|
|
1039
|
+
const headers = [
|
|
1040
|
+
{
|
|
1041
|
+
label: formatMessage({
|
|
1042
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1043
|
+
defaultMessage: "name"
|
|
1044
|
+
}),
|
|
1045
|
+
name: "name"
|
|
1046
|
+
},
|
|
1047
|
+
{
|
|
1048
|
+
label: formatMessage({
|
|
1049
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1050
|
+
defaultMessage: "locale"
|
|
1051
|
+
}),
|
|
1052
|
+
name: "locale"
|
|
1053
|
+
},
|
|
1054
|
+
{
|
|
1055
|
+
label: formatMessage({
|
|
1056
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1057
|
+
defaultMessage: "content-type"
|
|
1058
|
+
}),
|
|
1059
|
+
name: "content-type"
|
|
1060
|
+
},
|
|
1061
|
+
{
|
|
1062
|
+
label: formatMessage({
|
|
1063
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1064
|
+
defaultMessage: "action"
|
|
1065
|
+
}),
|
|
1066
|
+
name: "action"
|
|
1067
|
+
},
|
|
1068
|
+
...!release.releasedAt ? [
|
|
1069
|
+
{
|
|
1070
|
+
label: formatMessage({
|
|
1071
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1072
|
+
defaultMessage: "status"
|
|
1073
|
+
}),
|
|
1074
|
+
name: "status"
|
|
1075
|
+
}
|
|
1076
|
+
] : []
|
|
1077
|
+
];
|
|
1030
1078
|
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1031
1079
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1032
1080
|
SingleSelect,
|
|
@@ -1058,68 +1106,11 @@ const ReleaseDetailsBody = () => {
|
|
|
1058
1106
|
...item,
|
|
1059
1107
|
id: Number(item.entry.id)
|
|
1060
1108
|
})),
|
|
1061
|
-
|
|
1062
|
-
isLoading,
|
|
1063
|
-
isFetching,
|
|
1109
|
+
headers,
|
|
1110
|
+
isLoading: isLoading || isFetching,
|
|
1064
1111
|
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, {}),
|
|
1112
|
+
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
|
|
1113
|
+
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1123
1114
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1124
1115
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1125
1116
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
@@ -1177,34 +1168,39 @@ const ReleaseDetailsBody = () => {
|
|
|
1177
1168
|
}
|
|
1178
1169
|
)
|
|
1179
1170
|
] }, `releases-group-${key}`)),
|
|
1180
|
-
/* @__PURE__ */ jsxs(
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
}
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1171
|
+
/* @__PURE__ */ jsxs(
|
|
1172
|
+
Pagination.Root,
|
|
1173
|
+
{
|
|
1174
|
+
...releaseMeta?.pagination,
|
|
1175
|
+
defaultPageSize: releaseMeta?.pagination?.pageSize,
|
|
1176
|
+
children: [
|
|
1177
|
+
/* @__PURE__ */ jsx(Pagination.PageSize, {}),
|
|
1178
|
+
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
1179
|
+
]
|
|
1180
|
+
}
|
|
1181
|
+
)
|
|
1191
1182
|
] }) });
|
|
1192
1183
|
};
|
|
1193
1184
|
const ReleaseDetailsPage = () => {
|
|
1194
1185
|
const { formatMessage } = useIntl();
|
|
1195
1186
|
const { releaseId } = useParams();
|
|
1196
|
-
const toggleNotification = useNotification();
|
|
1187
|
+
const { toggleNotification } = useNotification();
|
|
1197
1188
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1198
|
-
const
|
|
1189
|
+
const navigate = useNavigate();
|
|
1199
1190
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1200
1191
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1201
1192
|
const {
|
|
1202
1193
|
isLoading: isLoadingDetails,
|
|
1203
1194
|
data,
|
|
1204
1195
|
isSuccess: isSuccessDetails
|
|
1205
|
-
} = useGetReleaseQuery(
|
|
1196
|
+
} = useGetReleaseQuery(
|
|
1197
|
+
{ id: releaseId },
|
|
1198
|
+
{
|
|
1199
|
+
skip: !releaseId
|
|
1200
|
+
}
|
|
1201
|
+
);
|
|
1206
1202
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1207
|
-
const [deleteRelease
|
|
1203
|
+
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1208
1204
|
const toggleEditReleaseModal = () => {
|
|
1209
1205
|
setReleaseModalShown((prev) => !prev);
|
|
1210
1206
|
};
|
|
@@ -1215,10 +1211,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1215
1211
|
{
|
|
1216
1212
|
toggleEditReleaseModal,
|
|
1217
1213
|
toggleWarningSubmit,
|
|
1218
|
-
children: /* @__PURE__ */ jsx(
|
|
1214
|
+
children: /* @__PURE__ */ jsx(Page.Loading, {})
|
|
1219
1215
|
}
|
|
1220
1216
|
);
|
|
1221
1217
|
}
|
|
1218
|
+
if (!releaseId) {
|
|
1219
|
+
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1220
|
+
}
|
|
1222
1221
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1223
1222
|
const title = releaseData?.name || "";
|
|
1224
1223
|
const timezone = releaseData?.timezone ?? null;
|
|
@@ -1242,12 +1241,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1242
1241
|
});
|
|
1243
1242
|
} else if (isAxiosError(response.error)) {
|
|
1244
1243
|
toggleNotification({
|
|
1245
|
-
type: "
|
|
1244
|
+
type: "danger",
|
|
1246
1245
|
message: formatAPIError(response.error)
|
|
1247
1246
|
});
|
|
1248
1247
|
} else {
|
|
1249
1248
|
toggleNotification({
|
|
1250
|
-
type: "
|
|
1249
|
+
type: "danger",
|
|
1251
1250
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1252
1251
|
});
|
|
1253
1252
|
}
|
|
@@ -1258,15 +1257,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1258
1257
|
id: releaseId
|
|
1259
1258
|
});
|
|
1260
1259
|
if ("data" in response) {
|
|
1261
|
-
|
|
1260
|
+
navigate("..");
|
|
1262
1261
|
} else if (isAxiosError(response.error)) {
|
|
1263
1262
|
toggleNotification({
|
|
1264
|
-
type: "
|
|
1263
|
+
type: "danger",
|
|
1265
1264
|
message: formatAPIError(response.error)
|
|
1266
1265
|
});
|
|
1267
1266
|
} else {
|
|
1268
1267
|
toggleNotification({
|
|
1269
|
-
type: "
|
|
1268
|
+
type: "danger",
|
|
1270
1269
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1271
1270
|
});
|
|
1272
1271
|
}
|
|
@@ -1277,7 +1276,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1277
1276
|
toggleEditReleaseModal,
|
|
1278
1277
|
toggleWarningSubmit,
|
|
1279
1278
|
children: [
|
|
1280
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1279
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1281
1280
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1282
1281
|
ReleaseModal,
|
|
1283
1282
|
{
|
|
@@ -1297,14 +1296,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1297
1296
|
/* @__PURE__ */ jsx(
|
|
1298
1297
|
ConfirmDialog,
|
|
1299
1298
|
{
|
|
1300
|
-
|
|
1299
|
+
isOpen: showWarningSubmit,
|
|
1300
|
+
onClose: toggleWarningSubmit,
|
|
1301
|
+
onConfirm: handleDeleteRelease,
|
|
1302
|
+
children: formatMessage({
|
|
1301
1303
|
id: "content-releases.dialog.confirmation-message",
|
|
1302
1304
|
defaultMessage: "Are you sure you want to delete this release?"
|
|
1303
|
-
}
|
|
1304
|
-
isOpen: showWarningSubmit,
|
|
1305
|
-
isConfirmButtonLoading: isDeletingRelease,
|
|
1306
|
-
onToggleDialog: toggleWarningSubmit,
|
|
1307
|
-
onConfirm: handleDeleteRelease
|
|
1305
|
+
})
|
|
1308
1306
|
}
|
|
1309
1307
|
)
|
|
1310
1308
|
]
|
|
@@ -1312,12 +1310,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1312
1310
|
);
|
|
1313
1311
|
};
|
|
1314
1312
|
const App = () => {
|
|
1315
|
-
return /* @__PURE__ */ jsx(
|
|
1316
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1317
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1313
|
+
return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
|
|
1314
|
+
/* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
|
|
1315
|
+
/* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
|
|
1318
1316
|
] }) });
|
|
1319
1317
|
};
|
|
1320
1318
|
export {
|
|
1321
1319
|
App
|
|
1322
1320
|
};
|
|
1323
|
-
//# sourceMappingURL=App-
|
|
1321
|
+
//# sourceMappingURL=App-dbdAcsz_.mjs.map
|