@strapi/content-releases 0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011 → 0.0.0-experimental.fea7af0bd6b406e4648e4c6669829249f73eb60f
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-C768ulk4.js → App-HjWtUYmc.js} +233 -261
- package/dist/_chunks/App-HjWtUYmc.js.map +1 -0
- package/dist/_chunks/{App-0Er6xxcq.mjs → App-gu1aiP6i.mjs} +237 -265
- package/dist/_chunks/App-gu1aiP6i.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +2 -2
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-bpIYXOfu.js} +2 -2
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
- package/dist/_chunks/{en-gcJJ5htG.js → en-HrREghh3.js} +11 -3
- package/dist/_chunks/en-HrREghh3.js.map +1 -0
- package/dist/_chunks/{en-WuuhP6Bn.mjs → en-ltT1TlKQ.mjs} +11 -3
- package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
- package/dist/_chunks/{index-BLSMpbpZ.js → index-ZNwxYN8H.js} +338 -31
- package/dist/_chunks/index-ZNwxYN8H.js.map +1 -0
- package/dist/_chunks/{index-fJx1up7m.mjs → index-mvj9PSKd.mjs} +345 -38
- package/dist/_chunks/index-mvj9PSKd.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/server/index.js +380 -172
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +380 -173
- package/dist/server/index.mjs.map +1 -1
- package/package.json +22 -15
- package/dist/_chunks/App-0Er6xxcq.mjs.map +0 -1
- package/dist/_chunks/App-C768ulk4.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-BLSMpbpZ.js.map +0 -1
- package/dist/_chunks/index-fJx1up7m.mjs.map +0 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
- package/dist/admin/src/components/RelativeTime.d.ts +0 -28
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
- package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
- package/dist/admin/src/constants.d.ts +0 -58
- package/dist/admin/src/index.d.ts +0 -3
- package/dist/admin/src/pages/App.d.ts +0 -1
- package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
- package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
- package/dist/admin/src/pluginId.d.ts +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
- package/dist/admin/src/services/release.d.ts +0 -369
- package/dist/admin/src/store/hooks.d.ts +0 -7
- package/dist/admin/src/utils/time.d.ts +0 -1
- package/dist/server/src/bootstrap.d.ts +0 -5
- package/dist/server/src/bootstrap.d.ts.map +0 -1
- package/dist/server/src/constants.d.ts +0 -12
- package/dist/server/src/constants.d.ts.map +0 -1
- package/dist/server/src/content-types/index.d.ts +0 -99
- package/dist/server/src/content-types/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/index.d.ts +0 -48
- package/dist/server/src/content-types/release/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/schema.d.ts +0 -47
- package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/index.d.ts +0 -50
- package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
- package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
- package/dist/server/src/controllers/index.d.ts +0 -18
- package/dist/server/src/controllers/index.d.ts.map +0 -1
- package/dist/server/src/controllers/release-action.d.ts +0 -9
- package/dist/server/src/controllers/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/release.d.ts +0 -11
- package/dist/server/src/controllers/release.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
- package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release.d.ts +0 -2
- package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
- package/dist/server/src/destroy.d.ts +0 -5
- package/dist/server/src/destroy.d.ts.map +0 -1
- package/dist/server/src/index.d.ts +0 -3838
- package/dist/server/src/index.d.ts.map +0 -1
- package/dist/server/src/migrations/index.d.ts +0 -10
- package/dist/server/src/migrations/index.d.ts.map +0 -1
- package/dist/server/src/register.d.ts +0 -5
- package/dist/server/src/register.d.ts.map +0 -1
- package/dist/server/src/routes/index.d.ts +0 -35
- package/dist/server/src/routes/index.d.ts.map +0 -1
- package/dist/server/src/routes/release-action.d.ts +0 -18
- package/dist/server/src/routes/release-action.d.ts.map +0 -1
- package/dist/server/src/routes/release.d.ts +0 -18
- package/dist/server/src/routes/release.d.ts.map +0 -1
- package/dist/server/src/services/index.d.ts +0 -3572
- package/dist/server/src/services/index.d.ts.map +0 -1
- package/dist/server/src/services/release.d.ts +0 -1812
- package/dist/server/src/services/release.d.ts.map +0 -1
- package/dist/server/src/services/scheduling.d.ts +0 -18
- package/dist/server/src/services/scheduling.d.ts.map +0 -1
- package/dist/server/src/services/validation.d.ts +0 -14
- package/dist/server/src/services/validation.d.ts.map +0 -1
- package/dist/server/src/utils/index.d.ts +0 -18
- package/dist/server/src/utils/index.d.ts.map +0 -1
- package/dist/shared/contracts/release-actions.d.ts +0 -105
- package/dist/shared/contracts/release-actions.d.ts.map +0 -1
- package/dist/shared/contracts/releases.d.ts +0 -166
- package/dist/shared/contracts/releases.d.ts.map +0 -1
- package/dist/shared/types.d.ts +0 -24
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/validation-schemas.d.ts +0 -2
- package/dist/shared/validation-schemas.d.ts.map +0 -1
|
@@ -1,53 +1,23 @@
|
|
|
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 { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { RelativeTime as RelativeTime$1, useNotification, useAPIErrorHandler, useQueryParams, useTracking, LoadingIndicatorPage, CheckPermissions, PageSizeURLQuery, PaginationURLQuery, AnErrorOccurred, ConfirmDialog, useRBAC, useStrapiApp, NoContent, Table, CheckPagePermissions } from "@strapi/helper-plugin";
|
|
3
|
+
import { useLocation, useHistory, useParams, Redirect, Link as Link$2, Switch, 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-mvj9PSKd.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
+
import { useLicenseLimits, unstable_useDocument } from "@strapi/admin/strapi-admin";
|
|
6
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";
|
|
7
8
|
import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
|
|
8
|
-
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, CheckPermissions, ConfirmDialog, useRBAC, Table } from "@strapi/helper-plugin";
|
|
9
9
|
import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, 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 {
|
|
14
|
+
import { formatISO } from "date-fns";
|
|
15
15
|
import { Formik, Form, useFormikContext } from "formik";
|
|
16
16
|
import * as yup from "yup";
|
|
17
17
|
import "@reduxjs/toolkit/query";
|
|
18
18
|
import "axios";
|
|
19
19
|
import "@reduxjs/toolkit/query/react";
|
|
20
20
|
import "react-redux";
|
|
21
|
-
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
22
|
-
const RelativeTime = React.forwardRef(
|
|
23
|
-
({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
|
|
24
|
-
const { formatRelativeTime, formatDate, formatTime } = useIntl();
|
|
25
|
-
const interval = intervalToDuration({
|
|
26
|
-
start: timestamp,
|
|
27
|
-
end: Date.now()
|
|
28
|
-
// see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
|
|
29
|
-
});
|
|
30
|
-
const unit = intervals.find((intervalUnit) => {
|
|
31
|
-
return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
|
|
32
|
-
});
|
|
33
|
-
const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
|
|
34
|
-
const customInterval = customIntervals.find(
|
|
35
|
-
(custom) => interval[custom.unit] < custom.threshold
|
|
36
|
-
);
|
|
37
|
-
const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
|
|
38
|
-
return /* @__PURE__ */ jsx(
|
|
39
|
-
"time",
|
|
40
|
-
{
|
|
41
|
-
ref: forwardedRef,
|
|
42
|
-
dateTime: timestamp.toISOString(),
|
|
43
|
-
role: "time",
|
|
44
|
-
title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
|
|
45
|
-
...restProps,
|
|
46
|
-
children: displayText
|
|
47
|
-
}
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
21
|
const RELEASE_SCHEMA = yup.object().shape({
|
|
52
22
|
name: yup.string().trim().required(),
|
|
53
23
|
scheduledAt: yup.string().nullable(),
|
|
@@ -77,7 +47,6 @@ const ReleaseModal = ({
|
|
|
77
47
|
const { formatMessage } = useIntl();
|
|
78
48
|
const { pathname } = useLocation();
|
|
79
49
|
const isCreatingRelease = pathname === `/plugins/${pluginId}`;
|
|
80
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
81
50
|
const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
|
|
82
51
|
initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
|
|
83
52
|
);
|
|
@@ -85,13 +54,12 @@ const ReleaseModal = ({
|
|
|
85
54
|
const { date, time, timezone } = values;
|
|
86
55
|
if (!date || !time || !timezone)
|
|
87
56
|
return null;
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
|
|
57
|
+
const timezoneWithoutOffset = timezone.split("&")[1];
|
|
58
|
+
return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
|
|
91
59
|
};
|
|
92
60
|
const getTimezoneWithOffset = () => {
|
|
93
61
|
const currentTimezone = timezoneList.find(
|
|
94
|
-
(timezone) => timezone.value.split("
|
|
62
|
+
(timezone) => timezone.value.split("&")[1] === initialValues.timezone
|
|
95
63
|
);
|
|
96
64
|
return currentTimezone?.value || systemTimezone.value;
|
|
97
65
|
};
|
|
@@ -109,7 +77,7 @@ const ReleaseModal = ({
|
|
|
109
77
|
onSubmit: (values) => {
|
|
110
78
|
handleSubmit({
|
|
111
79
|
...values,
|
|
112
|
-
timezone: values.timezone ? values.timezone.split("
|
|
80
|
+
timezone: values.timezone ? values.timezone.split("&")[1] : null,
|
|
113
81
|
scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
|
|
114
82
|
});
|
|
115
83
|
},
|
|
@@ -135,92 +103,88 @@ const ReleaseModal = ({
|
|
|
135
103
|
required: true
|
|
136
104
|
}
|
|
137
105
|
),
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
106
|
+
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
107
|
+
Checkbox,
|
|
108
|
+
{
|
|
109
|
+
name: "isScheduled",
|
|
110
|
+
value: values.isScheduled,
|
|
111
|
+
onChange: (event) => {
|
|
112
|
+
setFieldValue("isScheduled", event.target.checked);
|
|
113
|
+
if (!event.target.checked) {
|
|
114
|
+
setFieldValue("date", null);
|
|
115
|
+
setFieldValue("time", "");
|
|
116
|
+
setFieldValue("timezone", null);
|
|
117
|
+
} else {
|
|
118
|
+
setFieldValue("date", initialValues.date);
|
|
119
|
+
setFieldValue("time", initialValues.time);
|
|
120
|
+
setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
children: /* @__PURE__ */ jsx(
|
|
124
|
+
Typography,
|
|
125
|
+
{
|
|
126
|
+
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
127
|
+
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
128
|
+
children: formatMessage({
|
|
129
|
+
id: "modal.form.input.label.schedule-release",
|
|
130
|
+
defaultMessage: "Schedule release"
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
) }),
|
|
136
|
+
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
137
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
138
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
139
|
+
DatePicker,
|
|
140
|
+
{
|
|
141
|
+
label: formatMessage({
|
|
142
|
+
id: "content-releases.modal.form.input.label.date",
|
|
143
|
+
defaultMessage: "Date"
|
|
144
|
+
}),
|
|
145
|
+
name: "date",
|
|
146
|
+
error: errors.date,
|
|
147
|
+
onChange: (date) => {
|
|
148
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
149
|
+
setFieldValue("date", isoFormatDate);
|
|
150
|
+
},
|
|
151
|
+
clearLabel: formatMessage({
|
|
152
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
153
|
+
defaultMessage: "Clear"
|
|
154
|
+
}),
|
|
155
|
+
onClear: () => {
|
|
147
156
|
setFieldValue("date", null);
|
|
157
|
+
},
|
|
158
|
+
selectedDate: values.date || void 0,
|
|
159
|
+
required: true,
|
|
160
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
161
|
+
}
|
|
162
|
+
) }),
|
|
163
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
164
|
+
TimePicker,
|
|
165
|
+
{
|
|
166
|
+
label: formatMessage({
|
|
167
|
+
id: "content-releases.modal.form.input.label.time",
|
|
168
|
+
defaultMessage: "Time"
|
|
169
|
+
}),
|
|
170
|
+
name: "time",
|
|
171
|
+
error: errors.time,
|
|
172
|
+
onChange: (time) => {
|
|
173
|
+
setFieldValue("time", time);
|
|
174
|
+
},
|
|
175
|
+
clearLabel: formatMessage({
|
|
176
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
177
|
+
defaultMessage: "Clear"
|
|
178
|
+
}),
|
|
179
|
+
onClear: () => {
|
|
148
180
|
setFieldValue("time", "");
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
children: /* @__PURE__ */ jsx(
|
|
160
|
-
Typography,
|
|
161
|
-
{
|
|
162
|
-
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
163
|
-
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
164
|
-
children: formatMessage({
|
|
165
|
-
id: "modal.form.input.label.schedule-release",
|
|
166
|
-
defaultMessage: "Schedule release"
|
|
167
|
-
})
|
|
168
|
-
}
|
|
169
|
-
)
|
|
170
|
-
}
|
|
171
|
-
) }),
|
|
172
|
-
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
173
|
-
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
174
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
175
|
-
DatePicker,
|
|
176
|
-
{
|
|
177
|
-
label: formatMessage({
|
|
178
|
-
id: "content-releases.modal.form.input.label.date",
|
|
179
|
-
defaultMessage: "Date"
|
|
180
|
-
}),
|
|
181
|
-
name: "date",
|
|
182
|
-
error: errors.date,
|
|
183
|
-
onChange: (date) => {
|
|
184
|
-
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
185
|
-
setFieldValue("date", isoFormatDate);
|
|
186
|
-
},
|
|
187
|
-
clearLabel: formatMessage({
|
|
188
|
-
id: "content-releases.modal.form.input.clearLabel",
|
|
189
|
-
defaultMessage: "Clear"
|
|
190
|
-
}),
|
|
191
|
-
onClear: () => {
|
|
192
|
-
setFieldValue("date", null);
|
|
193
|
-
},
|
|
194
|
-
selectedDate: values.date || void 0,
|
|
195
|
-
required: true
|
|
196
|
-
}
|
|
197
|
-
) }),
|
|
198
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
199
|
-
TimePicker,
|
|
200
|
-
{
|
|
201
|
-
label: formatMessage({
|
|
202
|
-
id: "content-releases.modal.form.input.label.time",
|
|
203
|
-
defaultMessage: "Time"
|
|
204
|
-
}),
|
|
205
|
-
name: "time",
|
|
206
|
-
error: errors.time,
|
|
207
|
-
onChange: (time) => {
|
|
208
|
-
setFieldValue("time", time);
|
|
209
|
-
},
|
|
210
|
-
clearLabel: formatMessage({
|
|
211
|
-
id: "content-releases.modal.form.input.clearLabel",
|
|
212
|
-
defaultMessage: "Clear"
|
|
213
|
-
}),
|
|
214
|
-
onClear: () => {
|
|
215
|
-
setFieldValue("time", "");
|
|
216
|
-
},
|
|
217
|
-
value: values.time || void 0,
|
|
218
|
-
required: true
|
|
219
|
-
}
|
|
220
|
-
) })
|
|
221
|
-
] }),
|
|
222
|
-
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
223
|
-
] })
|
|
181
|
+
},
|
|
182
|
+
value: values.time || void 0,
|
|
183
|
+
required: true
|
|
184
|
+
}
|
|
185
|
+
) })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
224
188
|
] })
|
|
225
189
|
] }) }),
|
|
226
190
|
/* @__PURE__ */ jsx(
|
|
@@ -244,10 +208,10 @@ const ReleaseModal = ({
|
|
|
244
208
|
const getTimezones = (selectedDate) => {
|
|
245
209
|
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
246
210
|
const utcOffset = getTimezoneOffset(timezone, selectedDate);
|
|
247
|
-
return { offset: utcOffset, value: `${utcOffset}
|
|
211
|
+
return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
|
|
248
212
|
});
|
|
249
213
|
const systemTimezone = timezoneList.find(
|
|
250
|
-
(timezone) => timezone.value.split("
|
|
214
|
+
(timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
251
215
|
);
|
|
252
216
|
return { timezoneList, systemTimezone };
|
|
253
217
|
};
|
|
@@ -259,7 +223,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
259
223
|
if (values.date) {
|
|
260
224
|
const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
|
|
261
225
|
setTimezoneList(timezoneList2);
|
|
262
|
-
const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("
|
|
226
|
+
const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
|
|
263
227
|
if (updatedTimezone) {
|
|
264
228
|
setFieldValue("timezone", updatedTimezone.value);
|
|
265
229
|
}
|
|
@@ -272,9 +236,10 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
272
236
|
id: "content-releases.modal.form.input.label.timezone",
|
|
273
237
|
defaultMessage: "Timezone"
|
|
274
238
|
}),
|
|
239
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
275
240
|
name: "timezone",
|
|
276
241
|
value: values.timezone || void 0,
|
|
277
|
-
textValue: values.timezone ? values.timezone.replace(
|
|
242
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
278
243
|
onChange: (timezone) => {
|
|
279
244
|
setFieldValue("timezone", timezone);
|
|
280
245
|
},
|
|
@@ -286,15 +251,18 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
286
251
|
},
|
|
287
252
|
error: errors.timezone,
|
|
288
253
|
required: true,
|
|
289
|
-
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(
|
|
254
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
290
255
|
}
|
|
291
256
|
);
|
|
292
257
|
};
|
|
293
258
|
const LinkCard = styled(Link)`
|
|
294
259
|
display: block;
|
|
295
260
|
`;
|
|
296
|
-
const
|
|
297
|
-
|
|
261
|
+
const RelativeTime = styled(RelativeTime$1)`
|
|
262
|
+
display: inline-block;
|
|
263
|
+
&::first-letter {
|
|
264
|
+
text-transform: uppercase;
|
|
265
|
+
}
|
|
298
266
|
`;
|
|
299
267
|
const getBadgeProps = (status) => {
|
|
300
268
|
let color;
|
|
@@ -323,9 +291,8 @@ const getBadgeProps = (status) => {
|
|
|
323
291
|
};
|
|
324
292
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
325
293
|
const { formatMessage } = useIntl();
|
|
326
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
327
294
|
if (isError) {
|
|
328
|
-
return /* @__PURE__ */ jsx(
|
|
295
|
+
return /* @__PURE__ */ jsx(AnErrorOccurred, {});
|
|
329
296
|
}
|
|
330
297
|
if (releases?.length === 0) {
|
|
331
298
|
return /* @__PURE__ */ jsx(
|
|
@@ -344,7 +311,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
344
311
|
}
|
|
345
312
|
);
|
|
346
313
|
}
|
|
347
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name,
|
|
314
|
+
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(
|
|
348
315
|
Flex,
|
|
349
316
|
{
|
|
350
317
|
direction: "column",
|
|
@@ -360,16 +327,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
360
327
|
children: [
|
|
361
328
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
362
329
|
/* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
363
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children:
|
|
330
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
364
331
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
365
332
|
defaultMessage: "Not scheduled"
|
|
366
|
-
})
|
|
367
|
-
{
|
|
368
|
-
id: "content-releases.page.Releases.release-item.entries",
|
|
369
|
-
defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
|
|
370
|
-
},
|
|
371
|
-
{ number: actions.meta.count }
|
|
372
|
-
) })
|
|
333
|
+
}) })
|
|
373
334
|
] }),
|
|
374
335
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
|
|
375
336
|
]
|
|
@@ -388,8 +349,7 @@ const INITIAL_FORM_VALUES = {
|
|
|
388
349
|
name: "",
|
|
389
350
|
date: null,
|
|
390
351
|
time: "",
|
|
391
|
-
|
|
392
|
-
isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
|
|
352
|
+
isScheduled: true,
|
|
393
353
|
scheduledAt: null,
|
|
394
354
|
timezone: null
|
|
395
355
|
};
|
|
@@ -399,7 +359,7 @@ const ReleasesPage = () => {
|
|
|
399
359
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
400
360
|
const toggleNotification = useNotification();
|
|
401
361
|
const { formatMessage } = useIntl();
|
|
402
|
-
const
|
|
362
|
+
const { push, replace } = useHistory();
|
|
403
363
|
const { formatAPIError } = useAPIErrorHandler();
|
|
404
364
|
const [{ query }, setQuery] = useQueryParams();
|
|
405
365
|
const response = useGetReleasesQuery(query);
|
|
@@ -423,9 +383,9 @@ const ReleasesPage = () => {
|
|
|
423
383
|
defaultMessage: "Please try again or open another release."
|
|
424
384
|
})
|
|
425
385
|
});
|
|
426
|
-
|
|
386
|
+
replace({ state: null });
|
|
427
387
|
}
|
|
428
|
-
}, [formatMessage, location?.state?.errors,
|
|
388
|
+
}, [formatMessage, location?.state?.errors, replace, toggleNotification]);
|
|
429
389
|
React.useEffect(() => {
|
|
430
390
|
if (tabRef.current) {
|
|
431
391
|
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
@@ -435,7 +395,7 @@ const ReleasesPage = () => {
|
|
|
435
395
|
setReleaseModalShown((prev) => !prev);
|
|
436
396
|
};
|
|
437
397
|
if (isLoading) {
|
|
438
|
-
return /* @__PURE__ */ jsx(
|
|
398
|
+
return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
439
399
|
}
|
|
440
400
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
441
401
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
@@ -466,7 +426,7 @@ const ReleasesPage = () => {
|
|
|
466
426
|
})
|
|
467
427
|
});
|
|
468
428
|
trackUsage("didCreateRelease");
|
|
469
|
-
|
|
429
|
+
push(`/plugins/content-releases/${response2.data.data.id}`);
|
|
470
430
|
} else if (isAxiosError(response2.error)) {
|
|
471
431
|
toggleNotification({
|
|
472
432
|
type: "warning",
|
|
@@ -581,17 +541,23 @@ const ReleasesPage = () => {
|
|
|
581
541
|
]
|
|
582
542
|
}
|
|
583
543
|
),
|
|
584
|
-
/* @__PURE__ */ jsxs(
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
544
|
+
response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
|
|
545
|
+
/* @__PURE__ */ jsx(
|
|
546
|
+
PageSizeURLQuery,
|
|
547
|
+
{
|
|
548
|
+
options: ["8", "16", "32", "64"],
|
|
549
|
+
defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
|
|
550
|
+
}
|
|
551
|
+
),
|
|
552
|
+
/* @__PURE__ */ jsx(
|
|
553
|
+
PaginationURLQuery,
|
|
554
|
+
{
|
|
555
|
+
pagination: {
|
|
556
|
+
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
)
|
|
560
|
+
] }) : null
|
|
595
561
|
] }) }),
|
|
596
562
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
597
563
|
ReleaseModal,
|
|
@@ -639,18 +605,14 @@ const TrashIcon = styled(Trash)`
|
|
|
639
605
|
const TypographyMaxWidth = styled(Typography)`
|
|
640
606
|
max-width: 300px;
|
|
641
607
|
`;
|
|
642
|
-
const EntryValidationText = ({ action, schema, entry }) => {
|
|
608
|
+
const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
643
609
|
const { formatMessage } = useIntl();
|
|
644
|
-
const { validate } = unstable_useDocument(
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
skip: !schema
|
|
651
|
-
}
|
|
652
|
-
);
|
|
653
|
-
const errors = validate(entry) ?? {};
|
|
610
|
+
const { validate } = unstable_useDocument();
|
|
611
|
+
const { errors } = validate(entry, {
|
|
612
|
+
contentType: schema,
|
|
613
|
+
components,
|
|
614
|
+
isCreatingEntry: false
|
|
615
|
+
});
|
|
654
616
|
if (Object.keys(errors).length > 0) {
|
|
655
617
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
656
618
|
([key, value]) => formatMessage(
|
|
@@ -698,12 +660,7 @@ const ReleaseDetailsLayout = ({
|
|
|
698
660
|
isLoading: isLoadingDetails,
|
|
699
661
|
isError,
|
|
700
662
|
error
|
|
701
|
-
} = useGetReleaseQuery(
|
|
702
|
-
{ id: releaseId },
|
|
703
|
-
{
|
|
704
|
-
skip: !releaseId
|
|
705
|
-
}
|
|
706
|
-
);
|
|
663
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
707
664
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
708
665
|
const toggleNotification = useNotification();
|
|
709
666
|
const { formatAPIError } = useAPIErrorHandler();
|
|
@@ -713,8 +670,8 @@ const ReleaseDetailsLayout = ({
|
|
|
713
670
|
const dispatch = useTypedDispatch();
|
|
714
671
|
const { trackUsage } = useTracking();
|
|
715
672
|
const release = data?.data;
|
|
716
|
-
const handlePublishRelease =
|
|
717
|
-
const response = await publishRelease({ id });
|
|
673
|
+
const handlePublishRelease = async () => {
|
|
674
|
+
const response = await publishRelease({ id: releaseId });
|
|
718
675
|
if ("data" in response) {
|
|
719
676
|
toggleNotification({
|
|
720
677
|
type: "success",
|
|
@@ -742,7 +699,12 @@ const ReleaseDetailsLayout = ({
|
|
|
742
699
|
}
|
|
743
700
|
};
|
|
744
701
|
const handleRefresh = () => {
|
|
745
|
-
dispatch(
|
|
702
|
+
dispatch(
|
|
703
|
+
releaseApi.util.invalidateTags([
|
|
704
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
705
|
+
{ type: "Release", id: releaseId }
|
|
706
|
+
])
|
|
707
|
+
);
|
|
746
708
|
};
|
|
747
709
|
const getCreatedByUser = () => {
|
|
748
710
|
if (!release?.createdBy) {
|
|
@@ -757,26 +719,27 @@ const ReleaseDetailsLayout = ({
|
|
|
757
719
|
return release.createdBy.email;
|
|
758
720
|
};
|
|
759
721
|
if (isLoadingDetails) {
|
|
760
|
-
return /* @__PURE__ */ jsx(
|
|
722
|
+
return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
761
723
|
}
|
|
762
724
|
if (isError || !release) {
|
|
763
725
|
return /* @__PURE__ */ jsx(
|
|
764
|
-
|
|
726
|
+
Redirect,
|
|
765
727
|
{
|
|
766
|
-
to:
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
728
|
+
to: {
|
|
729
|
+
pathname: "/plugins/content-releases",
|
|
730
|
+
state: {
|
|
731
|
+
errors: [
|
|
732
|
+
{
|
|
733
|
+
code: error?.code
|
|
734
|
+
}
|
|
735
|
+
]
|
|
736
|
+
}
|
|
773
737
|
}
|
|
774
738
|
}
|
|
775
739
|
);
|
|
776
740
|
}
|
|
777
741
|
const totalEntries = release.actions.meta.count || 0;
|
|
778
742
|
const hasCreatedByUser = Boolean(getCreatedByUser());
|
|
779
|
-
const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
|
|
780
743
|
const isScheduled = release.scheduledAt && release.timezone;
|
|
781
744
|
const numberOfEntriesText = formatMessage(
|
|
782
745
|
{
|
|
@@ -811,7 +774,7 @@ const ReleaseDetailsLayout = ({
|
|
|
811
774
|
{
|
|
812
775
|
title: release.name,
|
|
813
776
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
814
|
-
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (
|
|
777
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
815
778
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
816
779
|
] }),
|
|
817
780
|
navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
|
|
@@ -883,7 +846,7 @@ const ReleaseDetailsLayout = ({
|
|
|
883
846
|
defaultMessage: "Created"
|
|
884
847
|
}) }),
|
|
885
848
|
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
886
|
-
/* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
|
|
849
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
887
850
|
formatMessage(
|
|
888
851
|
{
|
|
889
852
|
id: "content-releases.header.actions.created.description",
|
|
@@ -906,7 +869,7 @@ const ReleaseDetailsLayout = ({
|
|
|
906
869
|
{
|
|
907
870
|
size: "S",
|
|
908
871
|
variant: "default",
|
|
909
|
-
onClick: handlePublishRelease
|
|
872
|
+
onClick: handlePublishRelease,
|
|
910
873
|
loading: isPublishing,
|
|
911
874
|
disabled: release.actions.meta.count === 0,
|
|
912
875
|
children: formatMessage({
|
|
@@ -922,6 +885,7 @@ const ReleaseDetailsLayout = ({
|
|
|
922
885
|
] });
|
|
923
886
|
};
|
|
924
887
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
888
|
+
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
925
889
|
const getGroupByOptionLabel = (value) => {
|
|
926
890
|
if (value === "locale") {
|
|
927
891
|
return {
|
|
@@ -940,8 +904,24 @@ const getGroupByOptionLabel = (value) => {
|
|
|
940
904
|
defaultMessage: "Content-Types"
|
|
941
905
|
};
|
|
942
906
|
};
|
|
943
|
-
const
|
|
907
|
+
const DEFAULT_RELEASE_DETAILS_HEADER = [
|
|
908
|
+
{
|
|
909
|
+
key: "__name__",
|
|
910
|
+
fieldSchema: { type: "string" },
|
|
911
|
+
metadatas: {
|
|
912
|
+
label: {
|
|
913
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
914
|
+
defaultMessage: "name"
|
|
915
|
+
},
|
|
916
|
+
searchable: false,
|
|
917
|
+
sortable: false
|
|
918
|
+
},
|
|
919
|
+
name: "name"
|
|
920
|
+
}
|
|
921
|
+
];
|
|
922
|
+
const ReleaseDetailsBody = () => {
|
|
944
923
|
const { formatMessage } = useIntl();
|
|
924
|
+
const { releaseId } = useParams();
|
|
945
925
|
const [{ query }, setQuery] = useQueryParams();
|
|
946
926
|
const toggleNotification = useNotification();
|
|
947
927
|
const { formatAPIError } = useAPIErrorHandler();
|
|
@@ -954,6 +934,17 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
954
934
|
const {
|
|
955
935
|
allowedActions: { canUpdate }
|
|
956
936
|
} = useRBAC(PERMISSIONS);
|
|
937
|
+
const { runHookWaterfall } = useStrapiApp();
|
|
938
|
+
const {
|
|
939
|
+
displayedHeaders,
|
|
940
|
+
hasI18nEnabled
|
|
941
|
+
} = runHookWaterfall(
|
|
942
|
+
"ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
|
|
943
|
+
{
|
|
944
|
+
displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
|
|
945
|
+
hasI18nEnabled: false
|
|
946
|
+
}
|
|
947
|
+
);
|
|
957
948
|
const release = releaseData?.data;
|
|
958
949
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
959
950
|
const {
|
|
@@ -996,7 +987,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
996
987
|
}
|
|
997
988
|
};
|
|
998
989
|
if (isLoading || isReleaseLoading) {
|
|
999
|
-
return /* @__PURE__ */ jsx(
|
|
990
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
1000
991
|
}
|
|
1001
992
|
const releaseActions = data?.data;
|
|
1002
993
|
const releaseMeta = data?.meta;
|
|
@@ -1015,22 +1006,28 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1015
1006
|
});
|
|
1016
1007
|
}
|
|
1017
1008
|
return /* @__PURE__ */ jsx(
|
|
1018
|
-
|
|
1009
|
+
Redirect,
|
|
1019
1010
|
{
|
|
1020
|
-
to:
|
|
1021
|
-
|
|
1022
|
-
|
|
1011
|
+
to: {
|
|
1012
|
+
pathname: "/plugins/content-releases",
|
|
1013
|
+
state: {
|
|
1014
|
+
errors: errorsArray
|
|
1015
|
+
}
|
|
1023
1016
|
}
|
|
1024
1017
|
}
|
|
1025
1018
|
);
|
|
1026
1019
|
}
|
|
1027
1020
|
if (isError || !releaseActions) {
|
|
1028
|
-
return /* @__PURE__ */ jsx(
|
|
1021
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
|
|
1029
1022
|
}
|
|
1030
1023
|
if (Object.keys(releaseActions).length === 0) {
|
|
1031
1024
|
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
|
|
1032
|
-
|
|
1025
|
+
NoContent,
|
|
1033
1026
|
{
|
|
1027
|
+
content: {
|
|
1028
|
+
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1029
|
+
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1030
|
+
},
|
|
1034
1031
|
action: /* @__PURE__ */ jsx(
|
|
1035
1032
|
LinkButton,
|
|
1036
1033
|
{
|
|
@@ -1045,15 +1042,11 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1045
1042
|
defaultMessage: "Open the Content Manager"
|
|
1046
1043
|
})
|
|
1047
1044
|
}
|
|
1048
|
-
)
|
|
1049
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
|
|
1050
|
-
content: formatMessage({
|
|
1051
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1052
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1053
|
-
})
|
|
1045
|
+
)
|
|
1054
1046
|
}
|
|
1055
1047
|
) });
|
|
1056
1048
|
}
|
|
1049
|
+
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1057
1050
|
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1058
1051
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1059
1052
|
SingleSelect,
|
|
@@ -1073,7 +1066,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1073
1066
|
),
|
|
1074
1067
|
value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
|
|
1075
1068
|
onChange: (value) => setQuery({ groupBy: value }),
|
|
1076
|
-
children:
|
|
1069
|
+
children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
|
|
1077
1070
|
}
|
|
1078
1071
|
) }),
|
|
1079
1072
|
Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
|
|
@@ -1090,32 +1083,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1090
1083
|
isFetching,
|
|
1091
1084
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1092
1085
|
/* @__PURE__ */ jsxs(Table.Head, { children: [
|
|
1093
|
-
/* @__PURE__ */ jsx(
|
|
1094
|
-
Table.HeaderCell,
|
|
1095
|
-
{
|
|
1096
|
-
attribute: { type: "string" },
|
|
1097
|
-
label: formatMessage({
|
|
1098
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1099
|
-
defaultMessage: "name"
|
|
1100
|
-
}),
|
|
1101
|
-
name: "name"
|
|
1102
|
-
}
|
|
1103
|
-
),
|
|
1104
|
-
/* @__PURE__ */ jsx(
|
|
1086
|
+
displayedHeaders.map(({ key: key2, fieldSchema, metadatas, name }) => /* @__PURE__ */ jsx(
|
|
1105
1087
|
Table.HeaderCell,
|
|
1106
1088
|
{
|
|
1107
|
-
|
|
1108
|
-
label: formatMessage(
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
}
|
|
1114
|
-
),
|
|
1089
|
+
fieldSchemaType: fieldSchema.type,
|
|
1090
|
+
label: formatMessage(metadatas.label),
|
|
1091
|
+
name
|
|
1092
|
+
},
|
|
1093
|
+
key2
|
|
1094
|
+
)),
|
|
1115
1095
|
/* @__PURE__ */ jsx(
|
|
1116
1096
|
Table.HeaderCell,
|
|
1117
1097
|
{
|
|
1118
|
-
|
|
1098
|
+
fieldSchemaType: "string",
|
|
1119
1099
|
label: formatMessage({
|
|
1120
1100
|
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1121
1101
|
defaultMessage: "content-type"
|
|
@@ -1126,7 +1106,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1126
1106
|
/* @__PURE__ */ jsx(
|
|
1127
1107
|
Table.HeaderCell,
|
|
1128
1108
|
{
|
|
1129
|
-
|
|
1109
|
+
fieldSchemaType: "string",
|
|
1130
1110
|
label: formatMessage({
|
|
1131
1111
|
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1132
1112
|
defaultMessage: "action"
|
|
@@ -1137,7 +1117,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1137
1117
|
!release.releasedAt && /* @__PURE__ */ jsx(
|
|
1138
1118
|
Table.HeaderCell,
|
|
1139
1119
|
{
|
|
1140
|
-
|
|
1120
|
+
fieldSchemaType: "string",
|
|
1141
1121
|
label: formatMessage({
|
|
1142
1122
|
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1143
1123
|
defaultMessage: "status"
|
|
@@ -1150,7 +1130,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1150
1130
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1151
1131
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1152
1132
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1153
|
-
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1133
|
+
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1154
1134
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
1155
1135
|
/* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
|
|
1156
1136
|
{
|
|
@@ -1204,17 +1184,17 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1204
1184
|
}
|
|
1205
1185
|
)
|
|
1206
1186
|
] }, `releases-group-${key}`)),
|
|
1207
|
-
/* @__PURE__ */ jsxs(
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
)
|
|
1187
|
+
/* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
|
|
1188
|
+
/* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
|
|
1189
|
+
/* @__PURE__ */ jsx(
|
|
1190
|
+
PaginationURLQuery,
|
|
1191
|
+
{
|
|
1192
|
+
pagination: {
|
|
1193
|
+
pageCount: releaseMeta?.pagination?.pageCount || 0
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
)
|
|
1197
|
+
] })
|
|
1218
1198
|
] }) });
|
|
1219
1199
|
};
|
|
1220
1200
|
const ReleaseDetailsPage = () => {
|
|
@@ -1222,19 +1202,14 @@ const ReleaseDetailsPage = () => {
|
|
|
1222
1202
|
const { releaseId } = useParams();
|
|
1223
1203
|
const toggleNotification = useNotification();
|
|
1224
1204
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1225
|
-
const
|
|
1205
|
+
const { replace } = useHistory();
|
|
1226
1206
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1227
1207
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1228
1208
|
const {
|
|
1229
1209
|
isLoading: isLoadingDetails,
|
|
1230
1210
|
data,
|
|
1231
1211
|
isSuccess: isSuccessDetails
|
|
1232
|
-
} = useGetReleaseQuery(
|
|
1233
|
-
{ id: releaseId },
|
|
1234
|
-
{
|
|
1235
|
-
skip: !releaseId
|
|
1236
|
-
}
|
|
1237
|
-
);
|
|
1212
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
1238
1213
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1239
1214
|
const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
|
|
1240
1215
|
const toggleEditReleaseModal = () => {
|
|
@@ -1247,18 +1222,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1247
1222
|
{
|
|
1248
1223
|
toggleEditReleaseModal,
|
|
1249
1224
|
toggleWarningSubmit,
|
|
1250
|
-
children: /* @__PURE__ */ jsx(
|
|
1225
|
+
children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
|
|
1251
1226
|
}
|
|
1252
1227
|
);
|
|
1253
1228
|
}
|
|
1254
|
-
if (!releaseId) {
|
|
1255
|
-
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1256
|
-
}
|
|
1257
1229
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1258
1230
|
const title = releaseData?.name || "";
|
|
1259
1231
|
const timezone = releaseData?.timezone ?? null;
|
|
1260
1232
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1261
|
-
const date = scheduledAt ?
|
|
1233
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
|
|
1262
1234
|
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1263
1235
|
const handleEditRelease = async (values) => {
|
|
1264
1236
|
const response = await updateRelease({
|
|
@@ -1275,6 +1247,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1275
1247
|
defaultMessage: "Release updated."
|
|
1276
1248
|
})
|
|
1277
1249
|
});
|
|
1250
|
+
toggleEditReleaseModal();
|
|
1278
1251
|
} else if (isAxiosError(response.error)) {
|
|
1279
1252
|
toggleNotification({
|
|
1280
1253
|
type: "warning",
|
|
@@ -1286,14 +1259,13 @@ const ReleaseDetailsPage = () => {
|
|
|
1286
1259
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1287
1260
|
});
|
|
1288
1261
|
}
|
|
1289
|
-
toggleEditReleaseModal();
|
|
1290
1262
|
};
|
|
1291
1263
|
const handleDeleteRelease = async () => {
|
|
1292
1264
|
const response = await deleteRelease({
|
|
1293
1265
|
id: releaseId
|
|
1294
1266
|
});
|
|
1295
1267
|
if ("data" in response) {
|
|
1296
|
-
|
|
1268
|
+
replace("/plugins/content-releases");
|
|
1297
1269
|
} else if (isAxiosError(response.error)) {
|
|
1298
1270
|
toggleNotification({
|
|
1299
1271
|
type: "warning",
|
|
@@ -1312,7 +1284,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1312
1284
|
toggleEditReleaseModal,
|
|
1313
1285
|
toggleWarningSubmit,
|
|
1314
1286
|
children: [
|
|
1315
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {
|
|
1287
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1316
1288
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1317
1289
|
ReleaseModal,
|
|
1318
1290
|
{
|
|
@@ -1347,12 +1319,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1347
1319
|
);
|
|
1348
1320
|
};
|
|
1349
1321
|
const App = () => {
|
|
1350
|
-
return /* @__PURE__ */ jsx(
|
|
1351
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1352
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1322
|
+
return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
|
|
1323
|
+
/* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
|
|
1324
|
+
/* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
|
|
1353
1325
|
] }) });
|
|
1354
1326
|
};
|
|
1355
1327
|
export {
|
|
1356
1328
|
App
|
|
1357
1329
|
};
|
|
1358
|
-
//# sourceMappingURL=App-
|
|
1330
|
+
//# sourceMappingURL=App-gu1aiP6i.mjs.map
|