@strapi/content-releases 0.0.0-experimental.dd3311938ac827f1fa8560c8840a9a394f5896c0 → 0.0.0-experimental.de2b94258659463e5ddc5992e9a9490d66d950dd
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/LICENSE +17 -1
- package/dist/_chunks/{App-D_6Y9N2F.mjs → App-BA2xDdy0.mjs} +381 -351
- package/dist/_chunks/App-BA2xDdy0.mjs.map +1 -0
- package/dist/_chunks/{App-DUmziQ17.js → App-D4Wira1X.js} +378 -349
- package/dist/_chunks/App-D4Wira1X.js.map +1 -0
- package/dist/_chunks/ReleasesSettingsPage-BAlbMWpw.mjs +178 -0
- package/dist/_chunks/ReleasesSettingsPage-BAlbMWpw.mjs.map +1 -0
- package/dist/_chunks/ReleasesSettingsPage-xhFyRXCM.js +178 -0
- package/dist/_chunks/ReleasesSettingsPage-xhFyRXCM.js.map +1 -0
- package/dist/_chunks/{en-DtFJ5ViE.js → en-CmYoEnA7.js} +9 -2
- package/dist/_chunks/en-CmYoEnA7.js.map +1 -0
- package/dist/_chunks/{en-B9Ur3VsE.mjs → en-D0yVZFqf.mjs} +9 -2
- package/dist/_chunks/en-D0yVZFqf.mjs.map +1 -0
- package/dist/_chunks/index-CCFFG3Zs.mjs +1365 -0
- package/dist/_chunks/index-CCFFG3Zs.mjs.map +1 -0
- package/dist/_chunks/{index-C5Hc767q.js → index-DxkQGp4N.js} +790 -443
- package/dist/_chunks/index-DxkQGp4N.js.map +1 -0
- package/dist/_chunks/schemas-BE1LxE9J.js +62 -0
- package/dist/_chunks/schemas-BE1LxE9J.js.map +1 -0
- package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
- package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +2 -2
- package/dist/admin/src/components/{CMReleasesContainer.d.ts → ReleaseActionModal.d.ts} +3 -1
- package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +2 -1
- package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
- package/dist/admin/src/constants.d.ts +18 -0
- package/dist/admin/src/modules/hooks.d.ts +7 -0
- package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
- package/dist/admin/src/services/release.d.ts +43 -36
- package/dist/admin/src/utils/time.d.ts +9 -0
- package/dist/admin/src/validation/schemas.d.ts +6 -0
- package/dist/server/index.js +782 -580
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +783 -581
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/constants.d.ts +11 -2
- package/dist/server/src/constants.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +3 -5
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/content-types/release-action/index.d.ts +3 -5
- package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
- package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +6 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/release-action.d.ts.map +1 -1
- package/dist/server/src/controllers/release.d.ts +7 -1
- package/dist/server/src/controllers/release.d.ts.map +1 -1
- package/dist/server/src/controllers/settings.d.ts +11 -0
- package/dist/server/src/controllers/settings.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
- package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/release.d.ts +2 -0
- package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/settings.d.ts +3 -0
- package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +68 -49
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/documents.d.ts +6 -0
- package/dist/server/src/middlewares/documents.d.ts.map +1 -0
- package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
- package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
- package/dist/server/src/migrations/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +16 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/routes/release.d.ts.map +1 -1
- package/dist/server/src/routes/settings.d.ts +18 -0
- package/dist/server/src/routes/settings.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +40 -38
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/release-action.d.ts +38 -0
- package/dist/server/src/services/release-action.d.ts.map +1 -0
- package/dist/server/src/services/release.d.ts +6 -41
- package/dist/server/src/services/release.d.ts.map +1 -1
- package/dist/server/src/services/settings.d.ts +13 -0
- package/dist/server/src/services/settings.d.ts.map +1 -0
- package/dist/server/src/services/validation.d.ts +1 -1
- package/dist/server/src/services/validation.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +29 -8
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/release-actions.d.ts +9 -10
- package/dist/shared/contracts/release-actions.d.ts.map +1 -1
- package/dist/shared/contracts/releases.d.ts +9 -7
- package/dist/shared/contracts/releases.d.ts.map +1 -1
- package/dist/shared/contracts/settings.d.ts +39 -0
- package/dist/shared/contracts/settings.d.ts.map +1 -0
- package/package.json +12 -10
- package/dist/_chunks/App-DUmziQ17.js.map +0 -1
- package/dist/_chunks/App-D_6Y9N2F.mjs.map +0 -1
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
- package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
- package/dist/_chunks/index-BomF0-yY.mjs +0 -1018
- package/dist/_chunks/index-BomF0-yY.mjs.map +0 -1
- package/dist/_chunks/index-C5Hc767q.js.map +0 -1
- package/dist/shared/validation-schemas.d.ts +0 -2
- package/dist/shared/validation-schemas.d.ts.map +0 -1
- package/strapi-server.js +0 -3
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
3
|
import { useLocation, useNavigate, NavLink, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
|
|
4
|
-
import { g as
|
|
4
|
+
import { g as getTimezones, p as pluginId, u as useGetReleasesQuery, a as useGetReleaseSettingsQuery, b as useCreateReleaseMutation, P as PERMISSIONS, c as useGetReleaseQuery, d as useUpdateReleaseMutation, e as useDeleteReleaseMutation, f as usePublishReleaseMutation, h as getTimezoneOffset, i as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-CCFFG3Zs.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
6
|
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
-
import {
|
|
8
|
-
import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
|
|
7
|
+
import { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, SimpleMenu, Dialog, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
|
|
8
|
+
import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
|
|
9
9
|
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
10
|
-
import format from "date-fns/format";
|
|
10
|
+
import format$1 from "date-fns/format";
|
|
11
11
|
import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
|
|
12
12
|
import { useIntl } from "react-intl";
|
|
13
13
|
import { styled } from "styled-components";
|
|
14
|
-
import { intervalToDuration, isPast, formatISO } from "date-fns";
|
|
14
|
+
import { intervalToDuration, isPast, formatISO, format } from "date-fns";
|
|
15
15
|
import { Formik, Form, useFormikContext } from "formik";
|
|
16
|
-
import
|
|
16
|
+
import { R as RELEASE_SCHEMA } from "./schemas-DdA2ic2U.mjs";
|
|
17
17
|
import { useDispatch } from "react-redux";
|
|
18
18
|
import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
|
|
19
19
|
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
@@ -46,28 +46,9 @@ const RelativeTime$1 = React.forwardRef(
|
|
|
46
46
|
);
|
|
47
47
|
}
|
|
48
48
|
);
|
|
49
|
-
const RELEASE_SCHEMA = yup.object().shape({
|
|
50
|
-
name: yup.string().trim().required(),
|
|
51
|
-
scheduledAt: yup.string().nullable(),
|
|
52
|
-
isScheduled: yup.boolean().optional(),
|
|
53
|
-
time: yup.string().when("isScheduled", {
|
|
54
|
-
is: true,
|
|
55
|
-
then: yup.string().trim().required(),
|
|
56
|
-
otherwise: yup.string().nullable()
|
|
57
|
-
}),
|
|
58
|
-
timezone: yup.string().when("isScheduled", {
|
|
59
|
-
is: true,
|
|
60
|
-
then: yup.string().required().nullable(),
|
|
61
|
-
otherwise: yup.string().nullable()
|
|
62
|
-
}),
|
|
63
|
-
date: yup.string().when("isScheduled", {
|
|
64
|
-
is: true,
|
|
65
|
-
then: yup.string().required().nullable(),
|
|
66
|
-
otherwise: yup.string().nullable()
|
|
67
|
-
})
|
|
68
|
-
}).required().noUnknown();
|
|
69
49
|
const ReleaseModal = ({
|
|
70
50
|
handleClose,
|
|
51
|
+
open,
|
|
71
52
|
handleSubmit,
|
|
72
53
|
initialValues,
|
|
73
54
|
isLoading = false
|
|
@@ -91,8 +72,8 @@ const ReleaseModal = ({
|
|
|
91
72
|
);
|
|
92
73
|
return currentTimezone?.value || systemTimezone.value;
|
|
93
74
|
};
|
|
94
|
-
return /* @__PURE__ */
|
|
95
|
-
/* @__PURE__ */ jsx(
|
|
75
|
+
return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
|
|
76
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
|
|
96
77
|
{
|
|
97
78
|
id: "content-releases.modal.title",
|
|
98
79
|
defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
|
|
@@ -117,23 +98,31 @@ const ReleaseModal = ({
|
|
|
117
98
|
validateOnChange: false,
|
|
118
99
|
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
119
100
|
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
120
|
-
/* @__PURE__ */ jsx(
|
|
121
|
-
/* @__PURE__ */ jsxs(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
101
|
+
/* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
|
102
|
+
/* @__PURE__ */ jsxs(
|
|
103
|
+
Field.Root,
|
|
104
|
+
{
|
|
105
|
+
name: "name",
|
|
106
|
+
error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
|
|
107
|
+
required: true,
|
|
108
|
+
children: [
|
|
109
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
110
|
+
id: "content-releases.modal.form.input.label.release-name",
|
|
111
|
+
defaultMessage: "Name"
|
|
112
|
+
}) }),
|
|
113
|
+
/* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
|
|
114
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
),
|
|
129
118
|
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
130
119
|
Checkbox,
|
|
131
120
|
{
|
|
132
121
|
name: "isScheduled",
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
setFieldValue("isScheduled",
|
|
136
|
-
if (!
|
|
122
|
+
checked: values.isScheduled,
|
|
123
|
+
onCheckedChange: (checked) => {
|
|
124
|
+
setFieldValue("isScheduled", checked);
|
|
125
|
+
if (!checked) {
|
|
137
126
|
setFieldValue("date", null);
|
|
138
127
|
setFieldValue("time", "");
|
|
139
128
|
setFieldValue("timezone", null);
|
|
@@ -161,86 +150,89 @@ const ReleaseModal = ({
|
|
|
161
150
|
) }),
|
|
162
151
|
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
163
152
|
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
164
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
153
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
|
|
154
|
+
Field.Root,
|
|
155
|
+
{
|
|
156
|
+
name: "date",
|
|
157
|
+
error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
|
|
158
|
+
required: true,
|
|
159
|
+
children: [
|
|
160
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
161
|
+
id: "content-releases.modal.form.input.label.date",
|
|
162
|
+
defaultMessage: "Date"
|
|
163
|
+
}) }),
|
|
164
|
+
/* @__PURE__ */ jsx(
|
|
165
|
+
DatePicker,
|
|
166
|
+
{
|
|
167
|
+
onChange: (date) => {
|
|
168
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
169
|
+
setFieldValue("date", isoFormatDate);
|
|
170
|
+
},
|
|
171
|
+
clearLabel: formatMessage({
|
|
172
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
173
|
+
defaultMessage: "Clear"
|
|
174
|
+
}),
|
|
175
|
+
onClear: () => {
|
|
176
|
+
setFieldValue("date", null);
|
|
177
|
+
},
|
|
178
|
+
value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
|
|
179
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
180
|
+
}
|
|
181
|
+
),
|
|
182
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
) }),
|
|
186
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
|
|
187
|
+
Field.Root,
|
|
188
|
+
{
|
|
189
|
+
name: "time",
|
|
190
|
+
error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
|
|
191
|
+
required: true,
|
|
192
|
+
children: [
|
|
193
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
194
|
+
id: "content-releases.modal.form.input.label.time",
|
|
195
|
+
defaultMessage: "Time"
|
|
196
|
+
}) }),
|
|
197
|
+
/* @__PURE__ */ jsx(
|
|
198
|
+
TimePicker,
|
|
199
|
+
{
|
|
200
|
+
onChange: (time) => {
|
|
201
|
+
setFieldValue("time", time);
|
|
202
|
+
},
|
|
203
|
+
clearLabel: formatMessage({
|
|
204
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
205
|
+
defaultMessage: "Clear"
|
|
206
|
+
}),
|
|
207
|
+
onClear: () => {
|
|
208
|
+
setFieldValue("time", "");
|
|
209
|
+
},
|
|
210
|
+
value: values.time || void 0
|
|
211
|
+
}
|
|
212
|
+
),
|
|
213
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
) })
|
|
212
217
|
] }),
|
|
213
218
|
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
214
219
|
] })
|
|
215
220
|
] }) }),
|
|
216
|
-
/* @__PURE__ */
|
|
217
|
-
|
|
218
|
-
{
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
{
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
) })
|
|
227
|
-
}
|
|
228
|
-
)
|
|
221
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
222
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
|
|
223
|
+
/* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
224
|
+
{
|
|
225
|
+
id: "content-releases.modal.form.button.submit",
|
|
226
|
+
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
227
|
+
},
|
|
228
|
+
{ isCreatingRelease }
|
|
229
|
+
) })
|
|
230
|
+
] })
|
|
229
231
|
] });
|
|
230
232
|
}
|
|
231
233
|
}
|
|
232
234
|
)
|
|
233
|
-
] });
|
|
234
|
-
};
|
|
235
|
-
const getTimezones = (selectedDate) => {
|
|
236
|
-
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
237
|
-
const utcOffset = getTimezoneOffset(timezone, selectedDate);
|
|
238
|
-
return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
|
|
239
|
-
});
|
|
240
|
-
const systemTimezone = timezoneList.find(
|
|
241
|
-
(timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
242
|
-
);
|
|
243
|
-
return { timezoneList, systemTimezone };
|
|
235
|
+
] }) });
|
|
244
236
|
};
|
|
245
237
|
const TimezoneComponent = ({ timezoneOptions }) => {
|
|
246
238
|
const { values, errors, setFieldValue } = useFormikContext();
|
|
@@ -256,31 +248,39 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
256
248
|
}
|
|
257
249
|
}
|
|
258
250
|
}, [setFieldValue, values.date, values.timezone]);
|
|
259
|
-
return /* @__PURE__ */ jsxs(
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
251
|
+
return /* @__PURE__ */ jsxs(
|
|
252
|
+
Field.Root,
|
|
253
|
+
{
|
|
254
|
+
name: "timezone",
|
|
255
|
+
error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
|
|
256
|
+
required: true,
|
|
257
|
+
children: [
|
|
258
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
259
|
+
id: "content-releases.modal.form.input.label.timezone",
|
|
260
|
+
defaultMessage: "Timezone"
|
|
261
|
+
}) }),
|
|
262
|
+
/* @__PURE__ */ jsx(
|
|
263
|
+
Combobox,
|
|
264
|
+
{
|
|
265
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
266
|
+
value: values.timezone || void 0,
|
|
267
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
268
|
+
onChange: (timezone) => {
|
|
269
|
+
setFieldValue("timezone", timezone);
|
|
270
|
+
},
|
|
271
|
+
onTextValueChange: (timezone) => {
|
|
272
|
+
setFieldValue("timezone", timezone);
|
|
273
|
+
},
|
|
274
|
+
onClear: () => {
|
|
275
|
+
setFieldValue("timezone", "");
|
|
276
|
+
},
|
|
277
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
278
|
+
}
|
|
279
|
+
),
|
|
280
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
);
|
|
284
284
|
};
|
|
285
285
|
const useTypedDispatch = useDispatch;
|
|
286
286
|
const isBaseQueryError = (error) => {
|
|
@@ -342,7 +342,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
342
342
|
}
|
|
343
343
|
);
|
|
344
344
|
}
|
|
345
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(
|
|
345
|
+
return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
|
|
346
346
|
Flex,
|
|
347
347
|
{
|
|
348
348
|
direction: "column",
|
|
@@ -357,7 +357,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
357
357
|
gap: 4,
|
|
358
358
|
children: [
|
|
359
359
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
360
|
-
/* @__PURE__ */ jsx(Typography, { tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
360
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
361
361
|
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
362
362
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
363
363
|
defaultMessage: "Not scheduled"
|
|
@@ -378,14 +378,13 @@ const StyledAlert = styled(Alert)`
|
|
|
378
378
|
`;
|
|
379
379
|
const INITIAL_FORM_VALUES = {
|
|
380
380
|
name: "",
|
|
381
|
-
date:
|
|
381
|
+
date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
|
|
382
382
|
time: "",
|
|
383
383
|
isScheduled: true,
|
|
384
384
|
scheduledAt: null,
|
|
385
385
|
timezone: null
|
|
386
386
|
};
|
|
387
387
|
const ReleasesPage = () => {
|
|
388
|
-
const tabRef = React.useRef(null);
|
|
389
388
|
const location = useLocation();
|
|
390
389
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
391
390
|
const { toggleNotification } = useNotification();
|
|
@@ -394,6 +393,7 @@ const ReleasesPage = () => {
|
|
|
394
393
|
const { formatAPIError } = useAPIErrorHandler();
|
|
395
394
|
const [{ query }, setQuery] = useQueryParams();
|
|
396
395
|
const response = useGetReleasesQuery(query);
|
|
396
|
+
const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
|
|
397
397
|
const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
|
|
398
398
|
const { getFeature } = useLicenseLimits();
|
|
399
399
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
@@ -401,9 +401,8 @@ const ReleasesPage = () => {
|
|
|
401
401
|
const {
|
|
402
402
|
allowedActions: { canCreate }
|
|
403
403
|
} = useRBAC(PERMISSIONS);
|
|
404
|
-
const { isLoading, isSuccess, isError } = response;
|
|
404
|
+
const { isLoading: isLoadingReleases, isSuccess, isError } = response;
|
|
405
405
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
406
|
-
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
407
406
|
React.useEffect(() => {
|
|
408
407
|
if (location?.state?.errors) {
|
|
409
408
|
toggleNotification({
|
|
@@ -420,27 +419,22 @@ const ReleasesPage = () => {
|
|
|
420
419
|
navigate("", { replace: true, state: null });
|
|
421
420
|
}
|
|
422
421
|
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
423
|
-
React.useEffect(() => {
|
|
424
|
-
if (tabRef.current) {
|
|
425
|
-
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
426
|
-
}
|
|
427
|
-
}, [activeTabIndex]);
|
|
428
422
|
const toggleAddReleaseModal = () => {
|
|
429
423
|
setReleaseModalShown((prev) => !prev);
|
|
430
424
|
};
|
|
431
|
-
if (
|
|
425
|
+
if (isLoadingReleases || isLoadingSettings) {
|
|
432
426
|
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
433
427
|
}
|
|
434
428
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
435
429
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
436
|
-
const handleTabChange = (
|
|
430
|
+
const handleTabChange = (tabValue) => {
|
|
437
431
|
setQuery({
|
|
438
432
|
...query,
|
|
439
433
|
page: 1,
|
|
440
434
|
pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
|
|
441
435
|
filters: {
|
|
442
436
|
releasedAt: {
|
|
443
|
-
$notNull:
|
|
437
|
+
$notNull: tabValue !== "pending"
|
|
444
438
|
}
|
|
445
439
|
}
|
|
446
440
|
});
|
|
@@ -473,7 +467,7 @@ const ReleasesPage = () => {
|
|
|
473
467
|
});
|
|
474
468
|
}
|
|
475
469
|
};
|
|
476
|
-
return /* @__PURE__ */ jsxs(Main, { "aria-busy":
|
|
470
|
+
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
|
|
477
471
|
/* @__PURE__ */ jsx(
|
|
478
472
|
Layouts.Header,
|
|
479
473
|
{
|
|
@@ -524,21 +518,17 @@ const ReleasesPage = () => {
|
|
|
524
518
|
})
|
|
525
519
|
}
|
|
526
520
|
),
|
|
527
|
-
/* @__PURE__ */ jsxs(
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
children: [
|
|
539
|
-
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
540
|
-
/* @__PURE__ */ jsxs(Tabs, { children: [
|
|
541
|
-
/* @__PURE__ */ jsx(Tab, { children: formatMessage(
|
|
521
|
+
/* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
|
|
522
|
+
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
523
|
+
/* @__PURE__ */ jsxs(
|
|
524
|
+
Tabs.List,
|
|
525
|
+
{
|
|
526
|
+
"aria-label": formatMessage({
|
|
527
|
+
id: "content-releases.pages.Releases.tab-group.label",
|
|
528
|
+
defaultMessage: "Releases list"
|
|
529
|
+
}),
|
|
530
|
+
children: [
|
|
531
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
|
|
542
532
|
{
|
|
543
533
|
id: "content-releases.pages.Releases.tab.pending",
|
|
544
534
|
defaultMessage: "Pending ({count})"
|
|
@@ -547,34 +537,32 @@ const ReleasesPage = () => {
|
|
|
547
537
|
count: totalPendingReleases
|
|
548
538
|
}
|
|
549
539
|
) }),
|
|
550
|
-
/* @__PURE__ */ jsx(
|
|
540
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
|
|
551
541
|
id: "content-releases.pages.Releases.tab.done",
|
|
552
542
|
defaultMessage: "Done"
|
|
553
543
|
}) })
|
|
554
|
-
]
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
}
|
|
577
|
-
),
|
|
544
|
+
]
|
|
545
|
+
}
|
|
546
|
+
),
|
|
547
|
+
/* @__PURE__ */ jsx(Divider, {})
|
|
548
|
+
] }),
|
|
549
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
|
|
550
|
+
ReleasesGrid,
|
|
551
|
+
{
|
|
552
|
+
sectionTitle: "pending",
|
|
553
|
+
releases: response?.currentData?.data,
|
|
554
|
+
isError
|
|
555
|
+
}
|
|
556
|
+
) }),
|
|
557
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
|
|
558
|
+
ReleasesGrid,
|
|
559
|
+
{
|
|
560
|
+
sectionTitle: "done",
|
|
561
|
+
releases: response?.currentData?.data,
|
|
562
|
+
isError
|
|
563
|
+
}
|
|
564
|
+
) })
|
|
565
|
+
] }),
|
|
578
566
|
/* @__PURE__ */ jsxs(
|
|
579
567
|
Pagination.Root,
|
|
580
568
|
{
|
|
@@ -587,13 +575,17 @@ const ReleasesPage = () => {
|
|
|
587
575
|
}
|
|
588
576
|
)
|
|
589
577
|
] }) }),
|
|
590
|
-
|
|
578
|
+
/* @__PURE__ */ jsx(
|
|
591
579
|
ReleaseModal,
|
|
592
580
|
{
|
|
581
|
+
open: releaseModalShown,
|
|
593
582
|
handleClose: toggleAddReleaseModal,
|
|
594
583
|
handleSubmit: handleAddRelease,
|
|
595
584
|
isLoading: isSubmittingForm,
|
|
596
|
-
initialValues:
|
|
585
|
+
initialValues: {
|
|
586
|
+
...INITIAL_FORM_VALUES,
|
|
587
|
+
timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
|
|
588
|
+
}
|
|
597
589
|
}
|
|
598
590
|
)
|
|
599
591
|
] });
|
|
@@ -604,7 +596,7 @@ const ReleaseInfoWrapper = styled(Flex)`
|
|
|
604
596
|
border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
|
|
605
597
|
border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
|
|
606
598
|
`;
|
|
607
|
-
const StyledMenuItem = styled(
|
|
599
|
+
const StyledMenuItem = styled(MenuItem)`
|
|
608
600
|
svg path {
|
|
609
601
|
fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
|
|
610
602
|
}
|
|
@@ -617,15 +609,15 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
617
609
|
}
|
|
618
610
|
`;
|
|
619
611
|
const PencilIcon = styled(Pencil)`
|
|
620
|
-
width: ${({ theme }) => theme.spaces[
|
|
621
|
-
height: ${({ theme }) => theme.spaces[
|
|
612
|
+
width: ${({ theme }) => theme.spaces[4]};
|
|
613
|
+
height: ${({ theme }) => theme.spaces[4]};
|
|
622
614
|
path {
|
|
623
615
|
fill: ${({ theme }) => theme.colors.neutral600};
|
|
624
616
|
}
|
|
625
617
|
`;
|
|
626
618
|
const TrashIcon = styled(Trash)`
|
|
627
|
-
width: ${({ theme }) => theme.spaces[
|
|
628
|
-
height: ${({ theme }) => theme.spaces[
|
|
619
|
+
width: ${({ theme }) => theme.spaces[4]};
|
|
620
|
+
height: ${({ theme }) => theme.spaces[4]};
|
|
629
621
|
path {
|
|
630
622
|
fill: ${({ theme }) => theme.colors.danger600};
|
|
631
623
|
}
|
|
@@ -633,42 +625,90 @@ const TrashIcon = styled(Trash)`
|
|
|
633
625
|
const TypographyMaxWidth = styled(Typography)`
|
|
634
626
|
max-width: 300px;
|
|
635
627
|
`;
|
|
636
|
-
const EntryValidationText = ({ action, schema, entry }) => {
|
|
628
|
+
const EntryValidationText = ({ action, schema, entry, status }) => {
|
|
637
629
|
const { formatMessage } = useIntl();
|
|
638
|
-
const { validate } = unstable_useDocument(
|
|
630
|
+
const { validate, isLoading } = unstable_useDocument(
|
|
639
631
|
{
|
|
640
632
|
collectionType: schema?.kind ?? "",
|
|
641
633
|
model: schema?.uid ?? ""
|
|
642
634
|
},
|
|
643
635
|
{
|
|
644
|
-
skip
|
|
636
|
+
// useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request
|
|
637
|
+
skip: true
|
|
645
638
|
}
|
|
646
639
|
);
|
|
647
|
-
const
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
640
|
+
const errorsToString = (errors2, prefix = "") => {
|
|
641
|
+
if (Object.keys(errors2).length === 0) {
|
|
642
|
+
return "";
|
|
643
|
+
}
|
|
644
|
+
return Object.entries(errors2).map(([key, value]) => {
|
|
645
|
+
if (value === void 0 || value === null) {
|
|
646
|
+
return "";
|
|
647
|
+
}
|
|
648
|
+
if (typeof value === "string") {
|
|
649
|
+
return formatMessage(
|
|
650
|
+
{ id: value, defaultMessage: value },
|
|
651
|
+
{ field: prefix ? `${prefix}.${key}` : key }
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
if (typeof value === "object" && value !== null && "id" in value && "defaultMessage" in value) {
|
|
655
|
+
return formatMessage(
|
|
656
|
+
// @ts-expect-error – TODO: default message will be a string
|
|
657
|
+
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
658
|
+
{ field: prefix ? `${prefix}.${key}` : key }
|
|
659
|
+
);
|
|
660
|
+
}
|
|
661
|
+
return errorsToString(value, key);
|
|
662
|
+
}).join(" ");
|
|
663
|
+
};
|
|
664
|
+
if (isLoading) {
|
|
665
|
+
return null;
|
|
660
666
|
}
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
667
|
+
const errors = validate(entry) ?? {};
|
|
668
|
+
if (action === "publish") {
|
|
669
|
+
if (Object.keys(errors).length > 0) {
|
|
670
|
+
const validationErrorsMessages = errorsToString(errors);
|
|
671
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
672
|
+
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
673
|
+
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(
|
|
674
|
+
TypographyMaxWidth,
|
|
675
|
+
{
|
|
676
|
+
textColor: "danger600",
|
|
677
|
+
variant: "omega",
|
|
678
|
+
fontWeight: "semiBold",
|
|
679
|
+
ellipsis: true,
|
|
680
|
+
children: validationErrorsMessages
|
|
681
|
+
}
|
|
682
|
+
) })
|
|
683
|
+
] });
|
|
684
|
+
}
|
|
685
|
+
if (status === "draft") {
|
|
686
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
687
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
688
|
+
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
689
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
|
|
690
|
+
defaultMessage: "Ready to publish"
|
|
691
|
+
}) })
|
|
692
|
+
] });
|
|
693
|
+
}
|
|
694
|
+
if (status === "modified") {
|
|
695
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
696
|
+
/* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
|
|
697
|
+
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
698
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
|
|
699
|
+
defaultMessage: "Ready to publish changes"
|
|
700
|
+
}) })
|
|
701
|
+
] });
|
|
702
|
+
}
|
|
703
|
+
if (status === "published") {
|
|
704
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
705
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
706
|
+
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
707
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
708
|
+
defaultMessage: "Already published"
|
|
709
|
+
}) })
|
|
710
|
+
] });
|
|
711
|
+
}
|
|
672
712
|
}
|
|
673
713
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
674
714
|
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
@@ -814,83 +854,71 @@ const ReleaseDetailsLayout = ({
|
|
|
814
854
|
] }),
|
|
815
855
|
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
816
856
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
817
|
-
/* @__PURE__ */ jsxs(
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
{
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
857
|
+
/* @__PURE__ */ jsxs(
|
|
858
|
+
SimpleMenuButton,
|
|
859
|
+
{
|
|
860
|
+
label: /* @__PURE__ */ jsx(More, {}),
|
|
861
|
+
variant: "tertiary",
|
|
862
|
+
endIcon: null,
|
|
863
|
+
paddingLeft: "7px",
|
|
864
|
+
paddingRight: "7px",
|
|
865
|
+
"aria-label": formatMessage({
|
|
866
|
+
id: "content-releases.header.actions.open-release-actions",
|
|
867
|
+
defaultMessage: "Release edit and delete menu"
|
|
868
|
+
}),
|
|
869
|
+
popoverPlacement: "bottom-end",
|
|
870
|
+
children: [
|
|
871
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
872
|
+
/* @__PURE__ */ jsx(PencilIcon, {}),
|
|
873
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
|
|
874
|
+
id: "content-releases.header.actions.edit",
|
|
875
|
+
defaultMessage: "Edit"
|
|
876
|
+
}) })
|
|
877
|
+
] }) }),
|
|
878
|
+
/* @__PURE__ */ jsx(
|
|
879
|
+
StyledMenuItem,
|
|
880
|
+
{
|
|
881
|
+
disabled: !canDelete,
|
|
882
|
+
onSelect: toggleWarningSubmit,
|
|
883
|
+
$variant: "danger",
|
|
884
|
+
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
885
|
+
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
886
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
887
|
+
id: "content-releases.header.actions.delete",
|
|
888
|
+
defaultMessage: "Delete"
|
|
846
889
|
}) })
|
|
847
|
-
] }) }),
|
|
848
|
-
/* @__PURE__ */ jsx(
|
|
849
|
-
StyledMenuItem,
|
|
850
|
-
{
|
|
851
|
-
disabled: !canDelete,
|
|
852
|
-
onSelect: toggleWarningSubmit,
|
|
853
|
-
$variant: "danger",
|
|
854
|
-
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
855
|
-
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
856
|
-
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
857
|
-
id: "content-releases.header.actions.delete",
|
|
858
|
-
defaultMessage: "Delete"
|
|
859
|
-
}) })
|
|
860
|
-
] })
|
|
861
|
-
}
|
|
862
|
-
)
|
|
863
|
-
]
|
|
864
|
-
}
|
|
865
|
-
),
|
|
866
|
-
/* @__PURE__ */ jsxs(
|
|
867
|
-
ReleaseInfoWrapper,
|
|
868
|
-
{
|
|
869
|
-
direction: "column",
|
|
870
|
-
justifyContent: "center",
|
|
871
|
-
alignItems: "flex-start",
|
|
872
|
-
gap: 1,
|
|
873
|
-
padding: 5,
|
|
874
|
-
children: [
|
|
875
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
876
|
-
id: "content-releases.header.actions.created",
|
|
877
|
-
defaultMessage: "Created"
|
|
878
|
-
}) }),
|
|
879
|
-
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
880
|
-
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
881
|
-
formatMessage(
|
|
882
|
-
{
|
|
883
|
-
id: "content-releases.header.actions.created.description",
|
|
884
|
-
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
885
|
-
},
|
|
886
|
-
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
887
|
-
)
|
|
888
890
|
] })
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
891
|
+
}
|
|
892
|
+
),
|
|
893
|
+
/* @__PURE__ */ jsxs(
|
|
894
|
+
ReleaseInfoWrapper,
|
|
895
|
+
{
|
|
896
|
+
direction: "column",
|
|
897
|
+
justifyContent: "center",
|
|
898
|
+
alignItems: "flex-start",
|
|
899
|
+
gap: 1,
|
|
900
|
+
padding: 4,
|
|
901
|
+
children: [
|
|
902
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
903
|
+
id: "content-releases.header.actions.created",
|
|
904
|
+
defaultMessage: "Created"
|
|
905
|
+
}) }),
|
|
906
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
907
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
908
|
+
formatMessage(
|
|
909
|
+
{
|
|
910
|
+
id: "content-releases.header.actions.created.description",
|
|
911
|
+
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
912
|
+
},
|
|
913
|
+
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
914
|
+
)
|
|
915
|
+
] })
|
|
916
|
+
]
|
|
917
|
+
}
|
|
918
|
+
)
|
|
919
|
+
]
|
|
920
|
+
}
|
|
921
|
+
),
|
|
894
922
|
/* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
|
|
895
923
|
id: "content-releases.header.actions.refresh",
|
|
896
924
|
defaultMessage: "Refresh"
|
|
@@ -915,6 +943,11 @@ const ReleaseDetailsLayout = ({
|
|
|
915
943
|
children
|
|
916
944
|
] });
|
|
917
945
|
};
|
|
946
|
+
const SimpleMenuButton = styled(SimpleMenu)`
|
|
947
|
+
& > span {
|
|
948
|
+
display: flex;
|
|
949
|
+
}
|
|
950
|
+
`;
|
|
918
951
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
919
952
|
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
920
953
|
const getGroupByOptionLabel = (value) => {
|
|
@@ -949,19 +982,18 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
949
982
|
allowedActions: { canUpdate }
|
|
950
983
|
} = useRBAC(PERMISSIONS);
|
|
951
984
|
const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
|
|
952
|
-
const { hasI18nEnabled } = runHookWaterfall(
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
);
|
|
985
|
+
const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
|
|
986
|
+
displayedHeaders: [
|
|
987
|
+
{
|
|
988
|
+
label: {
|
|
989
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
990
|
+
defaultMessage: "name"
|
|
991
|
+
},
|
|
992
|
+
name: "name"
|
|
993
|
+
}
|
|
994
|
+
],
|
|
995
|
+
hasI18nEnabled: false
|
|
996
|
+
});
|
|
965
997
|
const release = releaseData?.data;
|
|
966
998
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
967
999
|
const {
|
|
@@ -1067,34 +1099,27 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1067
1099
|
defaultMessage: "Group by"
|
|
1068
1100
|
});
|
|
1069
1101
|
const headers = [
|
|
1070
|
-
|
|
1102
|
+
...displayedHeaders,
|
|
1071
1103
|
{
|
|
1072
|
-
label:
|
|
1073
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1074
|
-
defaultMessage: "name"
|
|
1075
|
-
}),
|
|
1076
|
-
name: "name"
|
|
1077
|
-
},
|
|
1078
|
-
{
|
|
1079
|
-
label: formatMessage({
|
|
1104
|
+
label: {
|
|
1080
1105
|
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1081
1106
|
defaultMessage: "content-type"
|
|
1082
|
-
}
|
|
1107
|
+
},
|
|
1083
1108
|
name: "content-type"
|
|
1084
1109
|
},
|
|
1085
1110
|
{
|
|
1086
|
-
label:
|
|
1111
|
+
label: {
|
|
1087
1112
|
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1088
1113
|
defaultMessage: "action"
|
|
1089
|
-
}
|
|
1114
|
+
},
|
|
1090
1115
|
name: "action"
|
|
1091
1116
|
},
|
|
1092
1117
|
...!release.releasedAt ? [
|
|
1093
1118
|
{
|
|
1094
|
-
label:
|
|
1119
|
+
label: {
|
|
1095
1120
|
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1096
1121
|
defaultMessage: "status"
|
|
1097
|
-
}
|
|
1122
|
+
},
|
|
1098
1123
|
name: "status"
|
|
1099
1124
|
}
|
|
1100
1125
|
] : []
|
|
@@ -1132,10 +1157,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1132
1157
|
headers,
|
|
1133
1158
|
isLoading: isLoading || isFetching,
|
|
1134
1159
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1135
|
-
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((
|
|
1160
|
+
/* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
|
|
1136
1161
|
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1137
1162
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1138
|
-
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1163
|
+
({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1139
1164
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1140
1165
|
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1141
1166
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
@@ -1164,7 +1189,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1164
1189
|
action: type,
|
|
1165
1190
|
schema: contentTypes?.[contentType.uid],
|
|
1166
1191
|
components,
|
|
1167
|
-
entry
|
|
1192
|
+
entry,
|
|
1193
|
+
status
|
|
1168
1194
|
}
|
|
1169
1195
|
) }),
|
|
1170
1196
|
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
|
|
@@ -1172,7 +1198,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1172
1198
|
ReleaseActionMenu.ReleaseActionEntryLinkItem,
|
|
1173
1199
|
{
|
|
1174
1200
|
contentTypeUid: contentType.uid,
|
|
1175
|
-
|
|
1201
|
+
documentId: entry.documentId,
|
|
1176
1202
|
locale: locale?.code
|
|
1177
1203
|
}
|
|
1178
1204
|
),
|
|
@@ -1222,13 +1248,24 @@ const ReleaseDetailsPage = () => {
|
|
|
1222
1248
|
skip: !releaseId
|
|
1223
1249
|
}
|
|
1224
1250
|
);
|
|
1251
|
+
const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
|
|
1225
1252
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1226
1253
|
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1227
1254
|
const toggleEditReleaseModal = () => {
|
|
1228
1255
|
setReleaseModalShown((prev) => !prev);
|
|
1229
1256
|
};
|
|
1257
|
+
const getTimezoneValue = () => {
|
|
1258
|
+
if (releaseData?.timezone) {
|
|
1259
|
+
return releaseData.timezone;
|
|
1260
|
+
} else {
|
|
1261
|
+
if (dataTimezone?.data.defaultTimezone) {
|
|
1262
|
+
return dataTimezone.data.defaultTimezone;
|
|
1263
|
+
}
|
|
1264
|
+
return null;
|
|
1265
|
+
}
|
|
1266
|
+
};
|
|
1230
1267
|
const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
|
|
1231
|
-
if (isLoadingDetails) {
|
|
1268
|
+
if (isLoadingDetails || isLoadingTimezone) {
|
|
1232
1269
|
return /* @__PURE__ */ jsx(
|
|
1233
1270
|
ReleaseDetailsLayout,
|
|
1234
1271
|
{
|
|
@@ -1243,10 +1280,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1243
1280
|
}
|
|
1244
1281
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1245
1282
|
const title = releaseData?.name || "";
|
|
1246
|
-
const timezone =
|
|
1283
|
+
const timezone = getTimezoneValue();
|
|
1247
1284
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1248
|
-
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
|
|
1249
|
-
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1285
|
+
const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
|
|
1286
|
+
const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
|
|
1250
1287
|
const handleEditRelease = async (values) => {
|
|
1251
1288
|
const response = await updateRelease({
|
|
1252
1289
|
id: releaseId,
|
|
@@ -1300,9 +1337,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1300
1337
|
toggleWarningSubmit,
|
|
1301
1338
|
children: [
|
|
1302
1339
|
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1303
|
-
|
|
1340
|
+
/* @__PURE__ */ jsx(
|
|
1304
1341
|
ReleaseModal,
|
|
1305
1342
|
{
|
|
1343
|
+
open: releaseModalShown,
|
|
1306
1344
|
handleClose: toggleEditReleaseModal,
|
|
1307
1345
|
handleSubmit: handleEditRelease,
|
|
1308
1346
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1316,18 +1354,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1316
1354
|
}
|
|
1317
1355
|
}
|
|
1318
1356
|
),
|
|
1319
|
-
/* @__PURE__ */ jsx(
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
onClose: toggleWarningSubmit,
|
|
1324
|
-
onConfirm: handleDeleteRelease,
|
|
1325
|
-
children: formatMessage({
|
|
1326
|
-
id: "content-releases.dialog.confirmation-message",
|
|
1327
|
-
defaultMessage: "Are you sure you want to delete this release?"
|
|
1328
|
-
})
|
|
1329
|
-
}
|
|
1330
|
-
)
|
|
1357
|
+
/* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
|
|
1358
|
+
id: "content-releases.dialog.confirmation-message",
|
|
1359
|
+
defaultMessage: "Are you sure you want to delete this release?"
|
|
1360
|
+
}) }) })
|
|
1331
1361
|
]
|
|
1332
1362
|
}
|
|
1333
1363
|
);
|
|
@@ -1341,4 +1371,4 @@ const App = () => {
|
|
|
1341
1371
|
export {
|
|
1342
1372
|
App
|
|
1343
1373
|
};
|
|
1344
|
-
//# sourceMappingURL=App-
|
|
1374
|
+
//# sourceMappingURL=App-BA2xDdy0.mjs.map
|