@strapi/content-releases 4.20.4 → 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-6ugQxqYE.mjs → App-dbdAcsz_.mjs} +296 -296
- package/dist/_chunks/App-dbdAcsz_.mjs.map +1 -0
- package/dist/_chunks/{App-P1kyM3gT.js → App-zwe_jKPv.js} +301 -301
- 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-_eBuegHN.mjs → index-RBaVMtyr.mjs} +79 -70
- package/dist/_chunks/index-RBaVMtyr.mjs.map +1 -0
- package/dist/_chunks/{index-2xzbhaQP.js → index-TBrVNrv9.js} +77 -68
- 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 +327 -234
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +328 -234
- 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 +24 -30
- package/dist/_chunks/App-6ugQxqYE.mjs.map +0 -1
- package/dist/_chunks/App-P1kyM3gT.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-2xzbhaQP.js.map +0 -1
- package/dist/_chunks/index-_eBuegHN.mjs.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
|
-
import {
|
|
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
|
);
|
|
@@ -56,12 +81,12 @@ const ReleaseModal = ({
|
|
|
56
81
|
if (!date || !time || !timezone)
|
|
57
82
|
return null;
|
|
58
83
|
const formattedDate = parse(time, "HH:mm", new Date(date));
|
|
59
|
-
const timezoneWithoutOffset = timezone.split("
|
|
84
|
+
const timezoneWithoutOffset = timezone.split("&")[1];
|
|
60
85
|
return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
|
|
61
86
|
};
|
|
62
87
|
const getTimezoneWithOffset = () => {
|
|
63
88
|
const currentTimezone = timezoneList.find(
|
|
64
|
-
(timezone) => timezone.value.split("
|
|
89
|
+
(timezone) => timezone.value.split("&")[1] === initialValues.timezone
|
|
65
90
|
);
|
|
66
91
|
return currentTimezone?.value || systemTimezone.value;
|
|
67
92
|
};
|
|
@@ -79,7 +104,7 @@ const ReleaseModal = ({
|
|
|
79
104
|
onSubmit: (values) => {
|
|
80
105
|
handleSubmit({
|
|
81
106
|
...values,
|
|
82
|
-
timezone: values.timezone ? values.timezone.split("
|
|
107
|
+
timezone: values.timezone ? values.timezone.split("&")[1] : null,
|
|
83
108
|
scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
|
|
84
109
|
});
|
|
85
110
|
},
|
|
@@ -105,92 +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
|
-
}
|
|
167
|
-
) }),
|
|
168
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
169
|
-
TimePicker,
|
|
170
|
-
{
|
|
171
|
-
label: formatMessage({
|
|
172
|
-
id: "content-releases.modal.form.input.label.time",
|
|
173
|
-
defaultMessage: "Time"
|
|
174
|
-
}),
|
|
175
|
-
name: "time",
|
|
176
|
-
error: errors.time,
|
|
177
|
-
onChange: (time) => {
|
|
178
|
-
setFieldValue("time", time);
|
|
179
|
-
},
|
|
180
|
-
clearLabel: formatMessage({
|
|
181
|
-
id: "content-releases.modal.form.input.clearLabel",
|
|
182
|
-
defaultMessage: "Clear"
|
|
183
|
-
}),
|
|
184
|
-
onClear: () => {
|
|
185
|
-
setFieldValue("time", "");
|
|
186
|
-
},
|
|
187
|
-
value: values.time || void 0,
|
|
188
|
-
required: true
|
|
189
|
-
}
|
|
190
|
-
) })
|
|
191
|
-
] }),
|
|
192
|
-
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
193
|
-
] })
|
|
208
|
+
},
|
|
209
|
+
value: values.time || void 0,
|
|
210
|
+
required: true
|
|
211
|
+
}
|
|
212
|
+
) })
|
|
213
|
+
] }),
|
|
214
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
194
215
|
] })
|
|
195
216
|
] }) }),
|
|
196
217
|
/* @__PURE__ */ jsx(
|
|
@@ -214,10 +235,10 @@ const ReleaseModal = ({
|
|
|
214
235
|
const getTimezones = (selectedDate) => {
|
|
215
236
|
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
216
237
|
const utcOffset = getTimezoneOffset(timezone, selectedDate);
|
|
217
|
-
return { offset: utcOffset, value: `${utcOffset}
|
|
238
|
+
return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
|
|
218
239
|
});
|
|
219
240
|
const systemTimezone = timezoneList.find(
|
|
220
|
-
(timezone) => timezone.value.split("
|
|
241
|
+
(timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
221
242
|
);
|
|
222
243
|
return { timezoneList, systemTimezone };
|
|
223
244
|
};
|
|
@@ -229,7 +250,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
229
250
|
if (values.date) {
|
|
230
251
|
const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
|
|
231
252
|
setTimezoneList(timezoneList2);
|
|
232
|
-
const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("
|
|
253
|
+
const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
|
|
233
254
|
if (updatedTimezone) {
|
|
234
255
|
setFieldValue("timezone", updatedTimezone.value);
|
|
235
256
|
}
|
|
@@ -242,9 +263,10 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
242
263
|
id: "content-releases.modal.form.input.label.timezone",
|
|
243
264
|
defaultMessage: "Timezone"
|
|
244
265
|
}),
|
|
266
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
245
267
|
name: "timezone",
|
|
246
268
|
value: values.timezone || void 0,
|
|
247
|
-
textValue: values.timezone ? values.timezone.replace(
|
|
269
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
248
270
|
onChange: (timezone) => {
|
|
249
271
|
setFieldValue("timezone", timezone);
|
|
250
272
|
},
|
|
@@ -256,7 +278,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
256
278
|
},
|
|
257
279
|
error: errors.timezone,
|
|
258
280
|
required: true,
|
|
259
|
-
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(
|
|
281
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
260
282
|
}
|
|
261
283
|
);
|
|
262
284
|
};
|
|
@@ -293,9 +315,8 @@ const getBadgeProps = (status) => {
|
|
|
293
315
|
};
|
|
294
316
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
295
317
|
const { formatMessage } = useIntl();
|
|
296
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
297
318
|
if (isError) {
|
|
298
|
-
return /* @__PURE__ */ jsx(
|
|
319
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
299
320
|
}
|
|
300
321
|
if (releases?.length === 0) {
|
|
301
322
|
return /* @__PURE__ */ jsx(
|
|
@@ -314,7 +335,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
314
335
|
}
|
|
315
336
|
);
|
|
316
337
|
}
|
|
317
|
-
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(
|
|
318
339
|
Flex,
|
|
319
340
|
{
|
|
320
341
|
direction: "column",
|
|
@@ -330,16 +351,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
330
351
|
children: [
|
|
331
352
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
332
353
|
/* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
333
|
-
/* @__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({
|
|
334
355
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
335
356
|
defaultMessage: "Not scheduled"
|
|
336
|
-
})
|
|
337
|
-
{
|
|
338
|
-
id: "content-releases.page.Releases.release-item.entries",
|
|
339
|
-
defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
|
|
340
|
-
},
|
|
341
|
-
{ number: actions.meta.count }
|
|
342
|
-
) })
|
|
357
|
+
}) })
|
|
343
358
|
] }),
|
|
344
359
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
|
|
345
360
|
]
|
|
@@ -358,8 +373,7 @@ const INITIAL_FORM_VALUES = {
|
|
|
358
373
|
name: "",
|
|
359
374
|
date: null,
|
|
360
375
|
time: "",
|
|
361
|
-
|
|
362
|
-
isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
|
|
376
|
+
isScheduled: true,
|
|
363
377
|
scheduledAt: null,
|
|
364
378
|
timezone: null
|
|
365
379
|
};
|
|
@@ -367,9 +381,9 @@ const ReleasesPage = () => {
|
|
|
367
381
|
const tabRef = React.useRef(null);
|
|
368
382
|
const location = useLocation();
|
|
369
383
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
370
|
-
const toggleNotification = useNotification();
|
|
384
|
+
const { toggleNotification } = useNotification();
|
|
371
385
|
const { formatMessage } = useIntl();
|
|
372
|
-
const
|
|
386
|
+
const navigate = useNavigate();
|
|
373
387
|
const { formatAPIError } = useAPIErrorHandler();
|
|
374
388
|
const [{ query }, setQuery] = useQueryParams();
|
|
375
389
|
const response = useGetReleasesQuery(query);
|
|
@@ -377,13 +391,16 @@ const ReleasesPage = () => {
|
|
|
377
391
|
const { getFeature } = useLicenseLimits();
|
|
378
392
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
379
393
|
const { trackUsage } = useTracking();
|
|
394
|
+
const {
|
|
395
|
+
allowedActions: { canCreate }
|
|
396
|
+
} = useRBAC(PERMISSIONS);
|
|
380
397
|
const { isLoading, isSuccess, isError } = response;
|
|
381
398
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
382
399
|
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
383
400
|
React.useEffect(() => {
|
|
384
401
|
if (location?.state?.errors) {
|
|
385
402
|
toggleNotification({
|
|
386
|
-
type: "
|
|
403
|
+
type: "danger",
|
|
387
404
|
title: formatMessage({
|
|
388
405
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
389
406
|
defaultMessage: "Your request could not be processed."
|
|
@@ -393,9 +410,9 @@ const ReleasesPage = () => {
|
|
|
393
410
|
defaultMessage: "Please try again or open another release."
|
|
394
411
|
})
|
|
395
412
|
});
|
|
396
|
-
|
|
413
|
+
navigate("", { replace: true, state: null });
|
|
397
414
|
}
|
|
398
|
-
}, [formatMessage, location?.state?.errors,
|
|
415
|
+
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
399
416
|
React.useEffect(() => {
|
|
400
417
|
if (tabRef.current) {
|
|
401
418
|
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
@@ -405,7 +422,7 @@ const ReleasesPage = () => {
|
|
|
405
422
|
setReleaseModalShown((prev) => !prev);
|
|
406
423
|
};
|
|
407
424
|
if (isLoading) {
|
|
408
|
-
return /* @__PURE__ */ jsx(
|
|
425
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
409
426
|
}
|
|
410
427
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
411
428
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
@@ -436,15 +453,15 @@ const ReleasesPage = () => {
|
|
|
436
453
|
})
|
|
437
454
|
});
|
|
438
455
|
trackUsage("didCreateRelease");
|
|
439
|
-
|
|
456
|
+
navigate(response2.data.data.id.toString());
|
|
440
457
|
} else if (isAxiosError(response2.error)) {
|
|
441
458
|
toggleNotification({
|
|
442
|
-
type: "
|
|
459
|
+
type: "danger",
|
|
443
460
|
message: formatAPIError(response2.error)
|
|
444
461
|
});
|
|
445
462
|
} else {
|
|
446
463
|
toggleNotification({
|
|
447
|
-
type: "
|
|
464
|
+
type: "danger",
|
|
448
465
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
449
466
|
});
|
|
450
467
|
}
|
|
@@ -461,7 +478,7 @@ const ReleasesPage = () => {
|
|
|
461
478
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
462
479
|
defaultMessage: "Create and manage content updates"
|
|
463
480
|
}),
|
|
464
|
-
primaryAction:
|
|
481
|
+
primaryAction: canCreate ? /* @__PURE__ */ jsx(
|
|
465
482
|
Button,
|
|
466
483
|
{
|
|
467
484
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -472,7 +489,7 @@ const ReleasesPage = () => {
|
|
|
472
489
|
defaultMessage: "New release"
|
|
473
490
|
})
|
|
474
491
|
}
|
|
475
|
-
)
|
|
492
|
+
) : null
|
|
476
493
|
}
|
|
477
494
|
),
|
|
478
495
|
/* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -551,23 +568,17 @@ const ReleasesPage = () => {
|
|
|
551
568
|
]
|
|
552
569
|
}
|
|
553
570
|
),
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
pagination: {
|
|
566
|
-
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
)
|
|
570
|
-
] }) : 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
|
+
)
|
|
571
582
|
] }) }),
|
|
572
583
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
573
584
|
ReleaseModal,
|
|
@@ -615,14 +626,18 @@ const TrashIcon = styled(Trash)`
|
|
|
615
626
|
const TypographyMaxWidth = styled(Typography)`
|
|
616
627
|
max-width: 300px;
|
|
617
628
|
`;
|
|
618
|
-
const EntryValidationText = ({ action, schema,
|
|
629
|
+
const EntryValidationText = ({ action, schema, entry }) => {
|
|
619
630
|
const { formatMessage } = useIntl();
|
|
620
|
-
const { validate } = unstable_useDocument(
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
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) ?? {};
|
|
626
641
|
if (Object.keys(errors).length > 0) {
|
|
627
642
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
628
643
|
([key, value]) => formatMessage(
|
|
@@ -670,18 +685,22 @@ const ReleaseDetailsLayout = ({
|
|
|
670
685
|
isLoading: isLoadingDetails,
|
|
671
686
|
isError,
|
|
672
687
|
error
|
|
673
|
-
} = useGetReleaseQuery(
|
|
688
|
+
} = useGetReleaseQuery(
|
|
689
|
+
{ id: releaseId },
|
|
690
|
+
{
|
|
691
|
+
skip: !releaseId
|
|
692
|
+
}
|
|
693
|
+
);
|
|
674
694
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
675
|
-
const toggleNotification = useNotification();
|
|
695
|
+
const { toggleNotification } = useNotification();
|
|
676
696
|
const { formatAPIError } = useAPIErrorHandler();
|
|
677
|
-
const {
|
|
678
|
-
|
|
679
|
-
} = useRBAC(PERMISSIONS);
|
|
697
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
698
|
+
const { canUpdate, canDelete, canPublish } = allowedActions;
|
|
680
699
|
const dispatch = useTypedDispatch();
|
|
681
700
|
const { trackUsage } = useTracking();
|
|
682
701
|
const release = data?.data;
|
|
683
|
-
const handlePublishRelease = async () => {
|
|
684
|
-
const response = await publishRelease({ id
|
|
702
|
+
const handlePublishRelease = (id) => async () => {
|
|
703
|
+
const response = await publishRelease({ id });
|
|
685
704
|
if ("data" in response) {
|
|
686
705
|
toggleNotification({
|
|
687
706
|
type: "success",
|
|
@@ -698,12 +717,12 @@ const ReleaseDetailsLayout = ({
|
|
|
698
717
|
});
|
|
699
718
|
} else if (isAxiosError(response.error)) {
|
|
700
719
|
toggleNotification({
|
|
701
|
-
type: "
|
|
720
|
+
type: "danger",
|
|
702
721
|
message: formatAPIError(response.error)
|
|
703
722
|
});
|
|
704
723
|
} else {
|
|
705
724
|
toggleNotification({
|
|
706
|
-
type: "
|
|
725
|
+
type: "danger",
|
|
707
726
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
708
727
|
});
|
|
709
728
|
}
|
|
@@ -724,28 +743,25 @@ const ReleaseDetailsLayout = ({
|
|
|
724
743
|
return release.createdBy.email;
|
|
725
744
|
};
|
|
726
745
|
if (isLoadingDetails) {
|
|
727
|
-
return /* @__PURE__ */ jsx(
|
|
746
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
728
747
|
}
|
|
729
748
|
if (isError || !release) {
|
|
730
749
|
return /* @__PURE__ */ jsx(
|
|
731
|
-
|
|
750
|
+
Navigate,
|
|
732
751
|
{
|
|
733
|
-
to:
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
]
|
|
741
|
-
}
|
|
752
|
+
to: "..",
|
|
753
|
+
state: {
|
|
754
|
+
errors: [
|
|
755
|
+
{
|
|
756
|
+
code: error?.code
|
|
757
|
+
}
|
|
758
|
+
]
|
|
742
759
|
}
|
|
743
760
|
}
|
|
744
761
|
);
|
|
745
762
|
}
|
|
746
763
|
const totalEntries = release.actions.meta.count || 0;
|
|
747
764
|
const hasCreatedByUser = Boolean(getCreatedByUser());
|
|
748
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
749
765
|
const isScheduled = release.scheduledAt && release.timezone;
|
|
750
766
|
const numberOfEntriesText = formatMessage(
|
|
751
767
|
{
|
|
@@ -780,13 +796,10 @@ const ReleaseDetailsLayout = ({
|
|
|
780
796
|
{
|
|
781
797
|
title: release.name,
|
|
782
798
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
783
|
-
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (
|
|
799
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
784
800
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
785
801
|
] }),
|
|
786
|
-
navigationAction: /* @__PURE__ */ jsx(
|
|
787
|
-
id: "global.back",
|
|
788
|
-
defaultMessage: "Back"
|
|
789
|
-
}) }),
|
|
802
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
790
803
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
791
804
|
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
792
805
|
/* @__PURE__ */ jsx(
|
|
@@ -870,12 +883,12 @@ const ReleaseDetailsLayout = ({
|
|
|
870
883
|
id: "content-releases.header.actions.refresh",
|
|
871
884
|
defaultMessage: "Refresh"
|
|
872
885
|
}) }),
|
|
873
|
-
|
|
886
|
+
canPublish ? /* @__PURE__ */ jsx(
|
|
874
887
|
Button,
|
|
875
888
|
{
|
|
876
889
|
size: "S",
|
|
877
890
|
variant: "default",
|
|
878
|
-
onClick: handlePublishRelease,
|
|
891
|
+
onClick: handlePublishRelease(release.id.toString()),
|
|
879
892
|
loading: isPublishing,
|
|
880
893
|
disabled: release.actions.meta.count === 0,
|
|
881
894
|
children: formatMessage({
|
|
@@ -883,7 +896,7 @@ const ReleaseDetailsLayout = ({
|
|
|
883
896
|
defaultMessage: "Publish"
|
|
884
897
|
})
|
|
885
898
|
}
|
|
886
|
-
)
|
|
899
|
+
) : null
|
|
887
900
|
] })
|
|
888
901
|
}
|
|
889
902
|
),
|
|
@@ -909,11 +922,10 @@ const getGroupByOptionLabel = (value) => {
|
|
|
909
922
|
defaultMessage: "Content-Types"
|
|
910
923
|
};
|
|
911
924
|
};
|
|
912
|
-
const ReleaseDetailsBody = () => {
|
|
925
|
+
const ReleaseDetailsBody = ({ releaseId }) => {
|
|
913
926
|
const { formatMessage } = useIntl();
|
|
914
|
-
const { releaseId } = useParams();
|
|
915
927
|
const [{ query }, setQuery] = useQueryParams();
|
|
916
|
-
const toggleNotification = useNotification();
|
|
928
|
+
const { toggleNotification } = useNotification();
|
|
917
929
|
const { formatAPIError } = useAPIErrorHandler();
|
|
918
930
|
const {
|
|
919
931
|
data: releaseData,
|
|
@@ -954,19 +966,19 @@ const ReleaseDetailsBody = () => {
|
|
|
954
966
|
if ("error" in response) {
|
|
955
967
|
if (isAxiosError(response.error)) {
|
|
956
968
|
toggleNotification({
|
|
957
|
-
type: "
|
|
969
|
+
type: "danger",
|
|
958
970
|
message: formatAPIError(response.error)
|
|
959
971
|
});
|
|
960
972
|
} else {
|
|
961
973
|
toggleNotification({
|
|
962
|
-
type: "
|
|
974
|
+
type: "danger",
|
|
963
975
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
964
976
|
});
|
|
965
977
|
}
|
|
966
978
|
}
|
|
967
979
|
};
|
|
968
980
|
if (isLoading || isReleaseLoading) {
|
|
969
|
-
return /* @__PURE__ */ jsx(
|
|
981
|
+
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
970
982
|
}
|
|
971
983
|
const releaseActions = data?.data;
|
|
972
984
|
const releaseMeta = data?.meta;
|
|
@@ -985,32 +997,26 @@ const ReleaseDetailsBody = () => {
|
|
|
985
997
|
});
|
|
986
998
|
}
|
|
987
999
|
return /* @__PURE__ */ jsx(
|
|
988
|
-
|
|
1000
|
+
Navigate,
|
|
989
1001
|
{
|
|
990
|
-
to:
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
errors: errorsArray
|
|
994
|
-
}
|
|
1002
|
+
to: "..",
|
|
1003
|
+
state: {
|
|
1004
|
+
errors: errorsArray
|
|
995
1005
|
}
|
|
996
1006
|
}
|
|
997
1007
|
);
|
|
998
1008
|
}
|
|
999
1009
|
if (isError || !releaseActions) {
|
|
1000
|
-
return /* @__PURE__ */ jsx(
|
|
1010
|
+
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
1001
1011
|
}
|
|
1002
1012
|
if (Object.keys(releaseActions).length === 0) {
|
|
1003
1013
|
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
|
|
1004
|
-
|
|
1014
|
+
EmptyStateLayout,
|
|
1005
1015
|
{
|
|
1006
|
-
content: {
|
|
1007
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1008
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1009
|
-
},
|
|
1010
1016
|
action: /* @__PURE__ */ jsx(
|
|
1011
1017
|
LinkButton,
|
|
1012
1018
|
{
|
|
1013
|
-
as: Link$
|
|
1019
|
+
as: Link$1,
|
|
1014
1020
|
to: {
|
|
1015
1021
|
pathname: "/content-manager"
|
|
1016
1022
|
},
|
|
@@ -1021,10 +1027,54 @@ const ReleaseDetailsBody = () => {
|
|
|
1021
1027
|
defaultMessage: "Open the Content Manager"
|
|
1022
1028
|
})
|
|
1023
1029
|
}
|
|
1024
|
-
)
|
|
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
|
+
})
|
|
1025
1036
|
}
|
|
1026
1037
|
) });
|
|
1027
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
|
+
];
|
|
1028
1078
|
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1029
1079
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1030
1080
|
SingleSelect,
|
|
@@ -1056,68 +1106,11 @@ const ReleaseDetailsBody = () => {
|
|
|
1056
1106
|
...item,
|
|
1057
1107
|
id: Number(item.entry.id)
|
|
1058
1108
|
})),
|
|
1059
|
-
|
|
1060
|
-
isLoading,
|
|
1061
|
-
isFetching,
|
|
1109
|
+
headers,
|
|
1110
|
+
isLoading: isLoading || isFetching,
|
|
1062
1111
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1063
|
-
/* @__PURE__ */
|
|
1064
|
-
|
|
1065
|
-
Table.HeaderCell,
|
|
1066
|
-
{
|
|
1067
|
-
fieldSchemaType: "string",
|
|
1068
|
-
label: formatMessage({
|
|
1069
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1070
|
-
defaultMessage: "name"
|
|
1071
|
-
}),
|
|
1072
|
-
name: "name"
|
|
1073
|
-
}
|
|
1074
|
-
),
|
|
1075
|
-
/* @__PURE__ */ jsx(
|
|
1076
|
-
Table.HeaderCell,
|
|
1077
|
-
{
|
|
1078
|
-
fieldSchemaType: "string",
|
|
1079
|
-
label: formatMessage({
|
|
1080
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1081
|
-
defaultMessage: "locale"
|
|
1082
|
-
}),
|
|
1083
|
-
name: "locale"
|
|
1084
|
-
}
|
|
1085
|
-
),
|
|
1086
|
-
/* @__PURE__ */ jsx(
|
|
1087
|
-
Table.HeaderCell,
|
|
1088
|
-
{
|
|
1089
|
-
fieldSchemaType: "string",
|
|
1090
|
-
label: formatMessage({
|
|
1091
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1092
|
-
defaultMessage: "content-type"
|
|
1093
|
-
}),
|
|
1094
|
-
name: "content-type"
|
|
1095
|
-
}
|
|
1096
|
-
),
|
|
1097
|
-
/* @__PURE__ */ jsx(
|
|
1098
|
-
Table.HeaderCell,
|
|
1099
|
-
{
|
|
1100
|
-
fieldSchemaType: "string",
|
|
1101
|
-
label: formatMessage({
|
|
1102
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1103
|
-
defaultMessage: "action"
|
|
1104
|
-
}),
|
|
1105
|
-
name: "action"
|
|
1106
|
-
}
|
|
1107
|
-
),
|
|
1108
|
-
!release.releasedAt && /* @__PURE__ */ jsx(
|
|
1109
|
-
Table.HeaderCell,
|
|
1110
|
-
{
|
|
1111
|
-
fieldSchemaType: "string",
|
|
1112
|
-
label: formatMessage({
|
|
1113
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1114
|
-
defaultMessage: "status"
|
|
1115
|
-
}),
|
|
1116
|
-
name: "status"
|
|
1117
|
-
}
|
|
1118
|
-
)
|
|
1119
|
-
] }),
|
|
1120
|
-
/* @__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, {}),
|
|
1121
1114
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1122
1115
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1123
1116
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
@@ -1175,34 +1168,39 @@ const ReleaseDetailsBody = () => {
|
|
|
1175
1168
|
}
|
|
1176
1169
|
)
|
|
1177
1170
|
] }, `releases-group-${key}`)),
|
|
1178
|
-
/* @__PURE__ */ jsxs(
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
}
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
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
|
+
)
|
|
1189
1182
|
] }) });
|
|
1190
1183
|
};
|
|
1191
1184
|
const ReleaseDetailsPage = () => {
|
|
1192
1185
|
const { formatMessage } = useIntl();
|
|
1193
1186
|
const { releaseId } = useParams();
|
|
1194
|
-
const toggleNotification = useNotification();
|
|
1187
|
+
const { toggleNotification } = useNotification();
|
|
1195
1188
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1196
|
-
const
|
|
1189
|
+
const navigate = useNavigate();
|
|
1197
1190
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1198
1191
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1199
1192
|
const {
|
|
1200
1193
|
isLoading: isLoadingDetails,
|
|
1201
1194
|
data,
|
|
1202
1195
|
isSuccess: isSuccessDetails
|
|
1203
|
-
} = useGetReleaseQuery(
|
|
1196
|
+
} = useGetReleaseQuery(
|
|
1197
|
+
{ id: releaseId },
|
|
1198
|
+
{
|
|
1199
|
+
skip: !releaseId
|
|
1200
|
+
}
|
|
1201
|
+
);
|
|
1204
1202
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1205
|
-
const [deleteRelease
|
|
1203
|
+
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1206
1204
|
const toggleEditReleaseModal = () => {
|
|
1207
1205
|
setReleaseModalShown((prev) => !prev);
|
|
1208
1206
|
};
|
|
@@ -1213,10 +1211,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1213
1211
|
{
|
|
1214
1212
|
toggleEditReleaseModal,
|
|
1215
1213
|
toggleWarningSubmit,
|
|
1216
|
-
children: /* @__PURE__ */ jsx(
|
|
1214
|
+
children: /* @__PURE__ */ jsx(Page.Loading, {})
|
|
1217
1215
|
}
|
|
1218
1216
|
);
|
|
1219
1217
|
}
|
|
1218
|
+
if (!releaseId) {
|
|
1219
|
+
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1220
|
+
}
|
|
1220
1221
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1221
1222
|
const title = releaseData?.name || "";
|
|
1222
1223
|
const timezone = releaseData?.timezone ?? null;
|
|
@@ -1240,12 +1241,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1240
1241
|
});
|
|
1241
1242
|
} else if (isAxiosError(response.error)) {
|
|
1242
1243
|
toggleNotification({
|
|
1243
|
-
type: "
|
|
1244
|
+
type: "danger",
|
|
1244
1245
|
message: formatAPIError(response.error)
|
|
1245
1246
|
});
|
|
1246
1247
|
} else {
|
|
1247
1248
|
toggleNotification({
|
|
1248
|
-
type: "
|
|
1249
|
+
type: "danger",
|
|
1249
1250
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1250
1251
|
});
|
|
1251
1252
|
}
|
|
@@ -1256,15 +1257,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1256
1257
|
id: releaseId
|
|
1257
1258
|
});
|
|
1258
1259
|
if ("data" in response) {
|
|
1259
|
-
|
|
1260
|
+
navigate("..");
|
|
1260
1261
|
} else if (isAxiosError(response.error)) {
|
|
1261
1262
|
toggleNotification({
|
|
1262
|
-
type: "
|
|
1263
|
+
type: "danger",
|
|
1263
1264
|
message: formatAPIError(response.error)
|
|
1264
1265
|
});
|
|
1265
1266
|
} else {
|
|
1266
1267
|
toggleNotification({
|
|
1267
|
-
type: "
|
|
1268
|
+
type: "danger",
|
|
1268
1269
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1269
1270
|
});
|
|
1270
1271
|
}
|
|
@@ -1275,7 +1276,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1275
1276
|
toggleEditReleaseModal,
|
|
1276
1277
|
toggleWarningSubmit,
|
|
1277
1278
|
children: [
|
|
1278
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1279
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1279
1280
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1280
1281
|
ReleaseModal,
|
|
1281
1282
|
{
|
|
@@ -1295,14 +1296,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1295
1296
|
/* @__PURE__ */ jsx(
|
|
1296
1297
|
ConfirmDialog,
|
|
1297
1298
|
{
|
|
1298
|
-
|
|
1299
|
+
isOpen: showWarningSubmit,
|
|
1300
|
+
onClose: toggleWarningSubmit,
|
|
1301
|
+
onConfirm: handleDeleteRelease,
|
|
1302
|
+
children: formatMessage({
|
|
1299
1303
|
id: "content-releases.dialog.confirmation-message",
|
|
1300
1304
|
defaultMessage: "Are you sure you want to delete this release?"
|
|
1301
|
-
}
|
|
1302
|
-
isOpen: showWarningSubmit,
|
|
1303
|
-
isConfirmButtonLoading: isDeletingRelease,
|
|
1304
|
-
onToggleDialog: toggleWarningSubmit,
|
|
1305
|
-
onConfirm: handleDeleteRelease
|
|
1305
|
+
})
|
|
1306
1306
|
}
|
|
1307
1307
|
)
|
|
1308
1308
|
]
|
|
@@ -1310,12 +1310,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1310
1310
|
);
|
|
1311
1311
|
};
|
|
1312
1312
|
const App = () => {
|
|
1313
|
-
return /* @__PURE__ */ jsx(
|
|
1314
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1315
|
-
/* @__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, {}) })
|
|
1316
1316
|
] }) });
|
|
1317
1317
|
};
|
|
1318
1318
|
export {
|
|
1319
1319
|
App
|
|
1320
1320
|
};
|
|
1321
|
-
//# sourceMappingURL=App-
|
|
1321
|
+
//# sourceMappingURL=App-dbdAcsz_.mjs.map
|