@strapi/content-releases 5.0.0-beta.1 → 5.0.0-beta.11
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-1LckaIGY.js → App-B5UOQWbt.js} +375 -368
- package/dist/_chunks/App-B5UOQWbt.js.map +1 -0
- package/dist/_chunks/{App-X01LBg5V.mjs → App-DcXlnXrr.mjs} +371 -363
- package/dist/_chunks/App-DcXlnXrr.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/SettingsPage-ped5WZ6Q.js +40 -0
- package/dist/_chunks/SettingsPage-ped5WZ6Q.js.map +1 -0
- package/dist/_chunks/SettingsPage-w5dOMAtL.mjs +40 -0
- package/dist/_chunks/SettingsPage-w5dOMAtL.mjs.map +1 -0
- package/dist/_chunks/{en-faJDuv3q.js → en-aH5E5UNw.js} +12 -2
- package/dist/_chunks/en-aH5E5UNw.js.map +1 -0
- package/dist/_chunks/{en-RdapH-9X.mjs → en-ahPQUZv2.mjs} +12 -2
- package/dist/_chunks/en-ahPQUZv2.mjs.map +1 -0
- package/dist/_chunks/{index-cYWov2wa.js → index-BgID5UQ7.js} +549 -525
- package/dist/_chunks/index-BgID5UQ7.js.map +1 -0
- package/dist/_chunks/{index-OD9AlD-6.mjs → index-LUuvped4.mjs} +551 -525
- package/dist/_chunks/index-LUuvped4.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
- package/dist/admin/src/components/ReleaseActionModal.d.ts +24 -0
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
- package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
- package/dist/admin/src/pages/SettingsPage.d.ts +1 -0
- package/dist/admin/src/services/release.d.ts +51 -313
- package/dist/admin/src/utils/api.d.ts +6 -0
- package/dist/server/index.js +824 -579
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +825 -580
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +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 -2
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/release-action.d.ts +0 -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 +1 -0
- package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/settings.d.ts +2 -0
- package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
- package/dist/server/src/destroy.d.ts +1 -1
- package/dist/server/src/destroy.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +73 -57
- 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 +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-action.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 +41 -41
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/release-action.d.ts +36 -0
- package/dist/server/src/services/release-action.d.ts.map +1 -0
- package/dist/server/src/services/release.d.ts +7 -42
- package/dist/server/src/services/release.d.ts.map +1 -1
- package/dist/server/src/services/scheduling.d.ts +1 -1
- package/dist/server/src/services/scheduling.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 +2 -2
- package/dist/server/src/services/validation.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +33 -12
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/release-actions.d.ts +6 -5
- package/dist/shared/contracts/release-actions.d.ts.map +1 -1
- package/dist/shared/contracts/releases.d.ts +23 -6
- 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/dist/shared/validation-schemas.d.ts +1 -0
- package/dist/shared/validation-schemas.d.ts.map +1 -1
- package/package.json +19 -18
- package/dist/_chunks/App-1LckaIGY.js.map +0 -1
- package/dist/_chunks/App-X01LBg5V.mjs.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-RdapH-9X.mjs.map +0 -1
- package/dist/_chunks/en-faJDuv3q.js.map +0 -1
- package/dist/_chunks/index-OD9AlD-6.mjs.map +0 -1
- package/dist/_chunks/index-cYWov2wa.js.map +0 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useNotification, useAPIErrorHandler, useQueryParams,
|
|
3
|
-
import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
|
|
4
|
-
import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS,
|
|
2
|
+
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
|
+
import { useLocation, useNavigate, NavLink, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
|
|
4
|
+
import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, i as ReleaseActionMenu, r as releaseApi } from "./index-LUuvped4.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
-
import {
|
|
7
|
-
import { Link,
|
|
8
|
-
import { Plus,
|
|
6
|
+
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
+
import { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, Dialog, SimpleMenu, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
|
|
8
|
+
import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
|
|
9
|
+
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
9
10
|
import format from "date-fns/format";
|
|
10
11
|
import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
|
|
11
12
|
import { useIntl } from "react-intl";
|
|
12
|
-
import styled from "styled-components";
|
|
13
|
-
import { intervalToDuration, isPast, formatISO
|
|
13
|
+
import { styled } from "styled-components";
|
|
14
|
+
import { intervalToDuration, isPast, formatISO } from "date-fns";
|
|
14
15
|
import { Formik, Form, useFormikContext } from "formik";
|
|
15
16
|
import * as yup from "yup";
|
|
16
17
|
import { useDispatch } from "react-redux";
|
|
18
|
+
import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
|
|
17
19
|
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
18
|
-
const RelativeTime = React.forwardRef(
|
|
20
|
+
const RelativeTime$1 = React.forwardRef(
|
|
19
21
|
({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
|
|
20
22
|
const { formatRelativeTime, formatDate, formatTime } = useIntl();
|
|
21
23
|
const interval = intervalToDuration({
|
|
@@ -64,8 +66,12 @@ const RELEASE_SCHEMA = yup.object().shape({
|
|
|
64
66
|
otherwise: yup.string().nullable()
|
|
65
67
|
})
|
|
66
68
|
}).required().noUnknown();
|
|
69
|
+
yup.object().shape({
|
|
70
|
+
defaultTimezone: yup.string().nullable().default(null)
|
|
71
|
+
}).required().noUnknown();
|
|
67
72
|
const ReleaseModal = ({
|
|
68
73
|
handleClose,
|
|
74
|
+
open,
|
|
69
75
|
handleSubmit,
|
|
70
76
|
initialValues,
|
|
71
77
|
isLoading = false
|
|
@@ -80,9 +86,8 @@ const ReleaseModal = ({
|
|
|
80
86
|
const { date, time, timezone } = values;
|
|
81
87
|
if (!date || !time || !timezone)
|
|
82
88
|
return null;
|
|
83
|
-
const formattedDate = parse(time, "HH:mm", new Date(date));
|
|
84
89
|
const timezoneWithoutOffset = timezone.split("&")[1];
|
|
85
|
-
return zonedTimeToUtc(
|
|
90
|
+
return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
|
|
86
91
|
};
|
|
87
92
|
const getTimezoneWithOffset = () => {
|
|
88
93
|
const currentTimezone = timezoneList.find(
|
|
@@ -90,8 +95,8 @@ const ReleaseModal = ({
|
|
|
90
95
|
);
|
|
91
96
|
return currentTimezone?.value || systemTimezone.value;
|
|
92
97
|
};
|
|
93
|
-
return /* @__PURE__ */
|
|
94
|
-
/* @__PURE__ */ jsx(
|
|
98
|
+
return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
|
|
99
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
|
|
95
100
|
{
|
|
96
101
|
id: "content-releases.modal.title",
|
|
97
102
|
defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
|
|
@@ -114,123 +119,119 @@ const ReleaseModal = ({
|
|
|
114
119
|
},
|
|
115
120
|
validationSchema: RELEASE_SCHEMA,
|
|
116
121
|
validateOnChange: false,
|
|
117
|
-
children: ({ values, errors, handleChange, setFieldValue }) =>
|
|
118
|
-
|
|
119
|
-
/* @__PURE__ */ jsx(
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
label: formatMessage({
|
|
122
|
+
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
123
|
+
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
124
|
+
/* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
|
125
|
+
/* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
|
|
126
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
123
127
|
id: "content-releases.modal.form.input.label.release-name",
|
|
124
128
|
defaultMessage: "Name"
|
|
125
|
-
}),
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
DatePicker,
|
|
167
|
-
{
|
|
168
|
-
label: formatMessage({
|
|
129
|
+
}) }),
|
|
130
|
+
/* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
|
|
131
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
132
|
+
] }),
|
|
133
|
+
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
134
|
+
Checkbox,
|
|
135
|
+
{
|
|
136
|
+
name: "isScheduled",
|
|
137
|
+
checked: values.isScheduled,
|
|
138
|
+
onCheckedChange: (checked) => {
|
|
139
|
+
setFieldValue("isScheduled", checked);
|
|
140
|
+
if (!checked) {
|
|
141
|
+
setFieldValue("date", null);
|
|
142
|
+
setFieldValue("time", "");
|
|
143
|
+
setFieldValue("timezone", null);
|
|
144
|
+
} else {
|
|
145
|
+
setFieldValue("date", initialValues.date);
|
|
146
|
+
setFieldValue("time", initialValues.time);
|
|
147
|
+
setFieldValue(
|
|
148
|
+
"timezone",
|
|
149
|
+
initialValues.timezone ?? systemTimezone?.value
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
children: /* @__PURE__ */ jsx(
|
|
154
|
+
Typography,
|
|
155
|
+
{
|
|
156
|
+
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
157
|
+
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
158
|
+
children: formatMessage({
|
|
159
|
+
id: "modal.form.input.label.schedule-release",
|
|
160
|
+
defaultMessage: "Schedule release"
|
|
161
|
+
})
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
) }),
|
|
166
|
+
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
167
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
168
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
|
|
169
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
169
170
|
id: "content-releases.modal.form.input.label.date",
|
|
170
171
|
defaultMessage: "Date"
|
|
171
|
-
}),
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
{
|
|
193
|
-
|
|
172
|
+
}) }),
|
|
173
|
+
/* @__PURE__ */ jsx(
|
|
174
|
+
DatePicker,
|
|
175
|
+
{
|
|
176
|
+
onChange: (date) => {
|
|
177
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
178
|
+
setFieldValue("date", isoFormatDate);
|
|
179
|
+
},
|
|
180
|
+
clearLabel: formatMessage({
|
|
181
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
182
|
+
defaultMessage: "Clear"
|
|
183
|
+
}),
|
|
184
|
+
onClear: () => {
|
|
185
|
+
setFieldValue("date", null);
|
|
186
|
+
},
|
|
187
|
+
value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
|
|
188
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
189
|
+
}
|
|
190
|
+
),
|
|
191
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
192
|
+
] }) }),
|
|
193
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
|
|
194
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
194
195
|
id: "content-releases.modal.form.input.label.time",
|
|
195
196
|
defaultMessage: "Time"
|
|
196
|
-
}),
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
{
|
|
220
|
-
|
|
221
|
-
|
|
197
|
+
}) }),
|
|
198
|
+
/* @__PURE__ */ jsx(
|
|
199
|
+
TimePicker,
|
|
200
|
+
{
|
|
201
|
+
onChange: (time) => {
|
|
202
|
+
setFieldValue("time", time);
|
|
203
|
+
},
|
|
204
|
+
clearLabel: formatMessage({
|
|
205
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
206
|
+
defaultMessage: "Clear"
|
|
207
|
+
}),
|
|
208
|
+
onClear: () => {
|
|
209
|
+
setFieldValue("time", "");
|
|
210
|
+
},
|
|
211
|
+
value: values.time || void 0
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
215
|
+
] }) })
|
|
216
|
+
] }),
|
|
217
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
218
|
+
] })
|
|
219
|
+
] }) }),
|
|
220
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
221
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
|
|
222
|
+
/* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
222
223
|
{
|
|
223
224
|
id: "content-releases.modal.form.button.submit",
|
|
224
225
|
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
225
226
|
},
|
|
226
227
|
{ isCreatingRelease }
|
|
227
228
|
) })
|
|
228
|
-
}
|
|
229
|
-
)
|
|
230
|
-
|
|
229
|
+
] })
|
|
230
|
+
] });
|
|
231
|
+
}
|
|
231
232
|
}
|
|
232
233
|
)
|
|
233
|
-
] });
|
|
234
|
+
] }) });
|
|
234
235
|
};
|
|
235
236
|
const getTimezones = (selectedDate) => {
|
|
236
237
|
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
@@ -256,38 +257,44 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
256
257
|
}
|
|
257
258
|
}
|
|
258
259
|
}, [setFieldValue, values.date, values.timezone]);
|
|
259
|
-
return /* @__PURE__ */
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
);
|
|
260
|
+
return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, children: [
|
|
261
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
262
|
+
id: "content-releases.modal.form.input.label.timezone",
|
|
263
|
+
defaultMessage: "Timezone"
|
|
264
|
+
}) }),
|
|
265
|
+
/* @__PURE__ */ jsx(
|
|
266
|
+
Combobox,
|
|
267
|
+
{
|
|
268
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
269
|
+
value: values.timezone || void 0,
|
|
270
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
271
|
+
onChange: (timezone) => {
|
|
272
|
+
setFieldValue("timezone", timezone);
|
|
273
|
+
},
|
|
274
|
+
onTextValueChange: (timezone) => {
|
|
275
|
+
setFieldValue("timezone", timezone);
|
|
276
|
+
},
|
|
277
|
+
onClear: () => {
|
|
278
|
+
setFieldValue("timezone", "");
|
|
279
|
+
},
|
|
280
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
281
|
+
}
|
|
282
|
+
),
|
|
283
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
284
|
+
] });
|
|
284
285
|
};
|
|
285
286
|
const useTypedDispatch = useDispatch;
|
|
287
|
+
const isBaseQueryError = (error) => {
|
|
288
|
+
return typeof error !== "undefined" && error.name !== void 0;
|
|
289
|
+
};
|
|
286
290
|
const LinkCard = styled(Link)`
|
|
287
291
|
display: block;
|
|
288
292
|
`;
|
|
289
|
-
const
|
|
290
|
-
|
|
293
|
+
const RelativeTime = styled(RelativeTime$1)`
|
|
294
|
+
display: inline-block;
|
|
295
|
+
&::first-letter {
|
|
296
|
+
text-transform: uppercase;
|
|
297
|
+
}
|
|
291
298
|
`;
|
|
292
299
|
const getBadgeProps = (status) => {
|
|
293
300
|
let color;
|
|
@@ -332,11 +339,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
332
339
|
target: sectionTitle
|
|
333
340
|
}
|
|
334
341
|
),
|
|
335
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
342
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
|
|
336
343
|
}
|
|
337
344
|
);
|
|
338
345
|
}
|
|
339
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(
|
|
346
|
+
return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
|
|
340
347
|
Flex,
|
|
341
348
|
{
|
|
342
349
|
direction: "column",
|
|
@@ -351,8 +358,8 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
351
358
|
gap: 4,
|
|
352
359
|
children: [
|
|
353
360
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
354
|
-
/* @__PURE__ */ jsx(Typography, {
|
|
355
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(
|
|
361
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
362
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
356
363
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
357
364
|
defaultMessage: "Not scheduled"
|
|
358
365
|
}) })
|
|
@@ -372,14 +379,13 @@ const StyledAlert = styled(Alert)`
|
|
|
372
379
|
`;
|
|
373
380
|
const INITIAL_FORM_VALUES = {
|
|
374
381
|
name: "",
|
|
375
|
-
date:
|
|
382
|
+
date: void 0,
|
|
376
383
|
time: "",
|
|
377
384
|
isScheduled: true,
|
|
378
385
|
scheduledAt: null,
|
|
379
386
|
timezone: null
|
|
380
387
|
};
|
|
381
388
|
const ReleasesPage = () => {
|
|
382
|
-
const tabRef = React.useRef(null);
|
|
383
389
|
const location = useLocation();
|
|
384
390
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
385
391
|
const { toggleNotification } = useNotification();
|
|
@@ -397,7 +403,6 @@ const ReleasesPage = () => {
|
|
|
397
403
|
} = useRBAC(PERMISSIONS);
|
|
398
404
|
const { isLoading, isSuccess, isError } = response;
|
|
399
405
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
400
|
-
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
401
406
|
React.useEffect(() => {
|
|
402
407
|
if (location?.state?.errors) {
|
|
403
408
|
toggleNotification({
|
|
@@ -414,11 +419,6 @@ const ReleasesPage = () => {
|
|
|
414
419
|
navigate("", { replace: true, state: null });
|
|
415
420
|
}
|
|
416
421
|
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
417
|
-
React.useEffect(() => {
|
|
418
|
-
if (tabRef.current) {
|
|
419
|
-
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
420
|
-
}
|
|
421
|
-
}, [activeTabIndex]);
|
|
422
422
|
const toggleAddReleaseModal = () => {
|
|
423
423
|
setReleaseModalShown((prev) => !prev);
|
|
424
424
|
};
|
|
@@ -427,14 +427,14 @@ const ReleasesPage = () => {
|
|
|
427
427
|
}
|
|
428
428
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
429
429
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
430
|
-
const handleTabChange = (
|
|
430
|
+
const handleTabChange = (tabValue) => {
|
|
431
431
|
setQuery({
|
|
432
432
|
...query,
|
|
433
433
|
page: 1,
|
|
434
434
|
pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
|
|
435
435
|
filters: {
|
|
436
436
|
releasedAt: {
|
|
437
|
-
$notNull:
|
|
437
|
+
$notNull: tabValue !== "pending"
|
|
438
438
|
}
|
|
439
439
|
}
|
|
440
440
|
});
|
|
@@ -455,7 +455,7 @@ const ReleasesPage = () => {
|
|
|
455
455
|
});
|
|
456
456
|
trackUsage("didCreateRelease");
|
|
457
457
|
navigate(response2.data.data.id.toString());
|
|
458
|
-
} else if (
|
|
458
|
+
} else if (isFetchError(response2.error)) {
|
|
459
459
|
toggleNotification({
|
|
460
460
|
type: "danger",
|
|
461
461
|
message: formatAPIError(response2.error)
|
|
@@ -469,7 +469,7 @@ const ReleasesPage = () => {
|
|
|
469
469
|
};
|
|
470
470
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
|
|
471
471
|
/* @__PURE__ */ jsx(
|
|
472
|
-
|
|
472
|
+
Layouts.Header,
|
|
473
473
|
{
|
|
474
474
|
title: formatMessage({
|
|
475
475
|
id: "content-releases.pages.Releases.title",
|
|
@@ -493,7 +493,7 @@ const ReleasesPage = () => {
|
|
|
493
493
|
) : null
|
|
494
494
|
}
|
|
495
495
|
),
|
|
496
|
-
/* @__PURE__ */ jsx(
|
|
496
|
+
/* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
497
497
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
498
498
|
StyledAlert,
|
|
499
499
|
{
|
|
@@ -518,21 +518,17 @@ const ReleasesPage = () => {
|
|
|
518
518
|
})
|
|
519
519
|
}
|
|
520
520
|
),
|
|
521
|
-
/* @__PURE__ */ jsxs(
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
children: [
|
|
533
|
-
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
534
|
-
/* @__PURE__ */ jsxs(Tabs, { children: [
|
|
535
|
-
/* @__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(
|
|
536
532
|
{
|
|
537
533
|
id: "content-releases.pages.Releases.tab.pending",
|
|
538
534
|
defaultMessage: "Pending ({count})"
|
|
@@ -541,34 +537,32 @@ const ReleasesPage = () => {
|
|
|
541
537
|
count: totalPendingReleases
|
|
542
538
|
}
|
|
543
539
|
) }),
|
|
544
|
-
/* @__PURE__ */ jsx(
|
|
540
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
|
|
545
541
|
id: "content-releases.pages.Releases.tab.done",
|
|
546
542
|
defaultMessage: "Done"
|
|
547
543
|
}) })
|
|
548
|
-
]
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
}
|
|
571
|
-
),
|
|
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
|
+
] }),
|
|
572
566
|
/* @__PURE__ */ jsxs(
|
|
573
567
|
Pagination.Root,
|
|
574
568
|
{
|
|
@@ -581,9 +575,10 @@ const ReleasesPage = () => {
|
|
|
581
575
|
}
|
|
582
576
|
)
|
|
583
577
|
] }) }),
|
|
584
|
-
|
|
578
|
+
/* @__PURE__ */ jsx(
|
|
585
579
|
ReleaseModal,
|
|
586
580
|
{
|
|
581
|
+
open: releaseModalShown,
|
|
587
582
|
handleClose: toggleAddReleaseModal,
|
|
588
583
|
handleSubmit: handleAddRelease,
|
|
589
584
|
isLoading: isSubmittingForm,
|
|
@@ -598,7 +593,7 @@ const ReleaseInfoWrapper = styled(Flex)`
|
|
|
598
593
|
border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
|
|
599
594
|
border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
|
|
600
595
|
`;
|
|
601
|
-
const StyledMenuItem = styled(
|
|
596
|
+
const StyledMenuItem = styled(MenuItem)`
|
|
602
597
|
svg path {
|
|
603
598
|
fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
|
|
604
599
|
}
|
|
@@ -607,7 +602,7 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
607
602
|
}
|
|
608
603
|
|
|
609
604
|
&:hover {
|
|
610
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
605
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
611
606
|
}
|
|
612
607
|
`;
|
|
613
608
|
const PencilIcon = styled(Pencil)`
|
|
@@ -627,44 +622,75 @@ const TrashIcon = styled(Trash)`
|
|
|
627
622
|
const TypographyMaxWidth = styled(Typography)`
|
|
628
623
|
max-width: 300px;
|
|
629
624
|
`;
|
|
630
|
-
const EntryValidationText = ({ action, schema, entry }) => {
|
|
625
|
+
const EntryValidationText = ({ action, schema, entry, status }) => {
|
|
631
626
|
const { formatMessage } = useIntl();
|
|
632
|
-
const { validate } = unstable_useDocument(
|
|
627
|
+
const { validate, isLoading } = unstable_useDocument(
|
|
633
628
|
{
|
|
634
629
|
collectionType: schema?.kind ?? "",
|
|
635
630
|
model: schema?.uid ?? ""
|
|
636
631
|
},
|
|
637
632
|
{
|
|
638
|
-
skip
|
|
633
|
+
// 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
|
|
634
|
+
skip: true
|
|
639
635
|
}
|
|
640
636
|
);
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
const validationErrorsMessages = Object.entries(errors).map(
|
|
644
|
-
([key, value]) => formatMessage(
|
|
645
|
-
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
646
|
-
{ field: key }
|
|
647
|
-
)
|
|
648
|
-
).join(" ");
|
|
649
|
-
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
650
|
-
/* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
|
|
651
|
-
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
652
|
-
] });
|
|
637
|
+
if (isLoading) {
|
|
638
|
+
return null;
|
|
653
639
|
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
640
|
+
const errors = validate(entry) ?? {};
|
|
641
|
+
if (action === "publish") {
|
|
642
|
+
if (Object.keys(errors).length > 0) {
|
|
643
|
+
const validationErrorsMessages = Object.entries(errors).map(
|
|
644
|
+
([key, value]) => formatMessage(
|
|
645
|
+
// @ts-expect-error – TODO: fix this will better checks
|
|
646
|
+
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
647
|
+
{ field: key }
|
|
648
|
+
)
|
|
649
|
+
).join(" ");
|
|
650
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
651
|
+
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
652
|
+
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(
|
|
653
|
+
TypographyMaxWidth,
|
|
654
|
+
{
|
|
655
|
+
textColor: "danger600",
|
|
656
|
+
variant: "omega",
|
|
657
|
+
fontWeight: "semiBold",
|
|
658
|
+
ellipsis: true,
|
|
659
|
+
children: validationErrorsMessages
|
|
660
|
+
}
|
|
661
|
+
) })
|
|
662
|
+
] });
|
|
663
|
+
}
|
|
664
|
+
if (status === "draft") {
|
|
665
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
666
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
667
|
+
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
668
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
|
|
669
|
+
defaultMessage: "Ready to publish"
|
|
670
|
+
}) })
|
|
671
|
+
] });
|
|
672
|
+
}
|
|
673
|
+
if (status === "modified") {
|
|
674
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
675
|
+
/* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
|
|
676
|
+
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
677
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
|
|
678
|
+
defaultMessage: "Ready to publish changes"
|
|
679
|
+
}) })
|
|
680
|
+
] });
|
|
681
|
+
}
|
|
682
|
+
if (status === "published") {
|
|
683
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
684
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
685
|
+
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
686
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
687
|
+
defaultMessage: "Already published"
|
|
688
|
+
}) })
|
|
689
|
+
] });
|
|
690
|
+
}
|
|
665
691
|
}
|
|
666
692
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
667
|
-
/* @__PURE__ */ jsx(
|
|
693
|
+
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
668
694
|
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
669
695
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
670
696
|
defaultMessage: "Already unpublished"
|
|
@@ -684,7 +710,6 @@ const ReleaseDetailsLayout = ({
|
|
|
684
710
|
const {
|
|
685
711
|
data,
|
|
686
712
|
isLoading: isLoadingDetails,
|
|
687
|
-
isError,
|
|
688
713
|
error
|
|
689
714
|
} = useGetReleaseQuery(
|
|
690
715
|
{ id: releaseId },
|
|
@@ -716,7 +741,7 @@ const ReleaseDetailsLayout = ({
|
|
|
716
741
|
totalPublishedEntries,
|
|
717
742
|
totalUnpublishedEntries
|
|
718
743
|
});
|
|
719
|
-
} else if (
|
|
744
|
+
} else if (isFetchError(response.error)) {
|
|
720
745
|
toggleNotification({
|
|
721
746
|
type: "danger",
|
|
722
747
|
message: formatAPIError(response.error)
|
|
@@ -751,7 +776,7 @@ const ReleaseDetailsLayout = ({
|
|
|
751
776
|
if (isLoadingDetails) {
|
|
752
777
|
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
753
778
|
}
|
|
754
|
-
if (
|
|
779
|
+
if (isBaseQueryError(error) && "code" in error || !release) {
|
|
755
780
|
return /* @__PURE__ */ jsx(
|
|
756
781
|
Navigate,
|
|
757
782
|
{
|
|
@@ -759,6 +784,7 @@ const ReleaseDetailsLayout = ({
|
|
|
759
784
|
state: {
|
|
760
785
|
errors: [
|
|
761
786
|
{
|
|
787
|
+
// @ts-expect-error – TODO: fix this weird error flow
|
|
762
788
|
code: error?.code
|
|
763
789
|
}
|
|
764
790
|
]
|
|
@@ -798,7 +824,7 @@ const ReleaseDetailsLayout = ({
|
|
|
798
824
|
) : "";
|
|
799
825
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
800
826
|
/* @__PURE__ */ jsx(
|
|
801
|
-
|
|
827
|
+
Layouts.Header,
|
|
802
828
|
{
|
|
803
829
|
title: release.name,
|
|
804
830
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
@@ -807,84 +833,71 @@ const ReleaseDetailsLayout = ({
|
|
|
807
833
|
] }),
|
|
808
834
|
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
809
835
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
810
|
-
/* @__PURE__ */ jsxs(
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
{
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
836
|
+
/* @__PURE__ */ jsxs(
|
|
837
|
+
SimpleMenu,
|
|
838
|
+
{
|
|
839
|
+
label: /* @__PURE__ */ jsx(More, {}),
|
|
840
|
+
variant: "tertiary",
|
|
841
|
+
endIcon: null,
|
|
842
|
+
paddingLeft: 2,
|
|
843
|
+
paddingRight: 2,
|
|
844
|
+
"aria-label": formatMessage({
|
|
845
|
+
id: "content-releases.header.actions.open-release-actions",
|
|
846
|
+
defaultMessage: "Release edit and delete menu"
|
|
847
|
+
}),
|
|
848
|
+
popoverPlacement: "bottom-end",
|
|
849
|
+
children: [
|
|
850
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
851
|
+
/* @__PURE__ */ jsx(PencilIcon, {}),
|
|
852
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
|
|
853
|
+
id: "content-releases.header.actions.edit",
|
|
854
|
+
defaultMessage: "Edit"
|
|
855
|
+
}) })
|
|
856
|
+
] }) }),
|
|
857
|
+
/* @__PURE__ */ jsx(
|
|
858
|
+
StyledMenuItem,
|
|
859
|
+
{
|
|
860
|
+
disabled: !canDelete,
|
|
861
|
+
onSelect: toggleWarningSubmit,
|
|
862
|
+
$variant: "danger",
|
|
863
|
+
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
864
|
+
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
865
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
866
|
+
id: "content-releases.header.actions.delete",
|
|
867
|
+
defaultMessage: "Delete"
|
|
840
868
|
}) })
|
|
841
|
-
] }) }),
|
|
842
|
-
/* @__PURE__ */ jsx(
|
|
843
|
-
StyledMenuItem,
|
|
844
|
-
{
|
|
845
|
-
disabled: !canDelete,
|
|
846
|
-
onSelect: toggleWarningSubmit,
|
|
847
|
-
variant: "danger",
|
|
848
|
-
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
849
|
-
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
850
|
-
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
851
|
-
id: "content-releases.header.actions.delete",
|
|
852
|
-
defaultMessage: "Delete"
|
|
853
|
-
}) })
|
|
854
|
-
] })
|
|
855
|
-
}
|
|
856
|
-
)
|
|
857
|
-
]
|
|
858
|
-
}
|
|
859
|
-
),
|
|
860
|
-
/* @__PURE__ */ jsxs(
|
|
861
|
-
ReleaseInfoWrapper,
|
|
862
|
-
{
|
|
863
|
-
direction: "column",
|
|
864
|
-
justifyContent: "center",
|
|
865
|
-
alignItems: "flex-start",
|
|
866
|
-
gap: 1,
|
|
867
|
-
padding: 5,
|
|
868
|
-
children: [
|
|
869
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
870
|
-
id: "content-releases.header.actions.created",
|
|
871
|
-
defaultMessage: "Created"
|
|
872
|
-
}) }),
|
|
873
|
-
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
874
|
-
/* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
|
|
875
|
-
formatMessage(
|
|
876
|
-
{
|
|
877
|
-
id: "content-releases.header.actions.created.description",
|
|
878
|
-
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
879
|
-
},
|
|
880
|
-
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
881
|
-
)
|
|
882
869
|
] })
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
870
|
+
}
|
|
871
|
+
),
|
|
872
|
+
/* @__PURE__ */ jsxs(
|
|
873
|
+
ReleaseInfoWrapper,
|
|
874
|
+
{
|
|
875
|
+
direction: "column",
|
|
876
|
+
justifyContent: "center",
|
|
877
|
+
alignItems: "flex-start",
|
|
878
|
+
gap: 1,
|
|
879
|
+
padding: 5,
|
|
880
|
+
children: [
|
|
881
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
882
|
+
id: "content-releases.header.actions.created",
|
|
883
|
+
defaultMessage: "Created"
|
|
884
|
+
}) }),
|
|
885
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
886
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
887
|
+
formatMessage(
|
|
888
|
+
{
|
|
889
|
+
id: "content-releases.header.actions.created.description",
|
|
890
|
+
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
891
|
+
},
|
|
892
|
+
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
893
|
+
)
|
|
894
|
+
] })
|
|
895
|
+
]
|
|
896
|
+
}
|
|
897
|
+
)
|
|
898
|
+
]
|
|
899
|
+
}
|
|
900
|
+
),
|
|
888
901
|
/* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
|
|
889
902
|
id: "content-releases.header.actions.refresh",
|
|
890
903
|
defaultMessage: "Refresh"
|
|
@@ -910,6 +923,7 @@ const ReleaseDetailsLayout = ({
|
|
|
910
923
|
] });
|
|
911
924
|
};
|
|
912
925
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
926
|
+
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
913
927
|
const getGroupByOptionLabel = (value) => {
|
|
914
928
|
if (value === "locale") {
|
|
915
929
|
return {
|
|
@@ -936,12 +950,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
936
950
|
const {
|
|
937
951
|
data: releaseData,
|
|
938
952
|
isLoading: isReleaseLoading,
|
|
939
|
-
isError: isReleaseError,
|
|
940
953
|
error: releaseError
|
|
941
954
|
} = useGetReleaseQuery({ id: releaseId });
|
|
942
955
|
const {
|
|
943
956
|
allowedActions: { canUpdate }
|
|
944
957
|
} = useRBAC(PERMISSIONS);
|
|
958
|
+
const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
|
|
959
|
+
const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
|
|
960
|
+
displayedHeaders: [
|
|
961
|
+
{
|
|
962
|
+
label: {
|
|
963
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
964
|
+
defaultMessage: "name"
|
|
965
|
+
},
|
|
966
|
+
name: "name"
|
|
967
|
+
}
|
|
968
|
+
],
|
|
969
|
+
hasI18nEnabled: false
|
|
970
|
+
});
|
|
945
971
|
const release = releaseData?.data;
|
|
946
972
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
947
973
|
const {
|
|
@@ -970,7 +996,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
970
996
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
971
997
|
});
|
|
972
998
|
if ("error" in response) {
|
|
973
|
-
if (
|
|
999
|
+
if (isFetchError(response.error)) {
|
|
974
1000
|
toggleNotification({
|
|
975
1001
|
type: "danger",
|
|
976
1002
|
message: formatAPIError(response.error)
|
|
@@ -990,14 +1016,14 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
990
1016
|
const releaseMeta = data?.meta;
|
|
991
1017
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
992
1018
|
const components = releaseMeta?.components || {};
|
|
993
|
-
if (
|
|
1019
|
+
if (isBaseQueryError(releaseError) || !release) {
|
|
994
1020
|
const errorsArray = [];
|
|
995
|
-
if (releaseError) {
|
|
1021
|
+
if (releaseError && "code" in releaseError) {
|
|
996
1022
|
errorsArray.push({
|
|
997
1023
|
code: releaseError.code
|
|
998
1024
|
});
|
|
999
1025
|
}
|
|
1000
|
-
if (releaseActionsError) {
|
|
1026
|
+
if (releaseActionsError && "code" in releaseActionsError) {
|
|
1001
1027
|
errorsArray.push({
|
|
1002
1028
|
code: releaseActionsError.code
|
|
1003
1029
|
});
|
|
@@ -1016,13 +1042,13 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1016
1042
|
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
1017
1043
|
}
|
|
1018
1044
|
if (Object.keys(releaseActions).length === 0) {
|
|
1019
|
-
return /* @__PURE__ */ jsx(
|
|
1045
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
|
|
1020
1046
|
EmptyStateLayout,
|
|
1021
1047
|
{
|
|
1022
1048
|
action: /* @__PURE__ */ jsx(
|
|
1023
1049
|
LinkButton,
|
|
1024
1050
|
{
|
|
1025
|
-
|
|
1051
|
+
tag: Link$1,
|
|
1026
1052
|
to: {
|
|
1027
1053
|
pathname: "/content-manager"
|
|
1028
1054
|
},
|
|
@@ -1034,7 +1060,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1034
1060
|
})
|
|
1035
1061
|
}
|
|
1036
1062
|
),
|
|
1037
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
1063
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
1038
1064
|
content: formatMessage({
|
|
1039
1065
|
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1040
1066
|
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
@@ -1047,45 +1073,33 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1047
1073
|
defaultMessage: "Group by"
|
|
1048
1074
|
});
|
|
1049
1075
|
const headers = [
|
|
1076
|
+
...displayedHeaders,
|
|
1050
1077
|
{
|
|
1051
|
-
label:
|
|
1052
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1053
|
-
defaultMessage: "name"
|
|
1054
|
-
}),
|
|
1055
|
-
name: "name"
|
|
1056
|
-
},
|
|
1057
|
-
{
|
|
1058
|
-
label: formatMessage({
|
|
1059
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1060
|
-
defaultMessage: "locale"
|
|
1061
|
-
}),
|
|
1062
|
-
name: "locale"
|
|
1063
|
-
},
|
|
1064
|
-
{
|
|
1065
|
-
label: formatMessage({
|
|
1078
|
+
label: {
|
|
1066
1079
|
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1067
1080
|
defaultMessage: "content-type"
|
|
1068
|
-
}
|
|
1081
|
+
},
|
|
1069
1082
|
name: "content-type"
|
|
1070
1083
|
},
|
|
1071
1084
|
{
|
|
1072
|
-
label:
|
|
1085
|
+
label: {
|
|
1073
1086
|
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1074
1087
|
defaultMessage: "action"
|
|
1075
|
-
}
|
|
1088
|
+
},
|
|
1076
1089
|
name: "action"
|
|
1077
1090
|
},
|
|
1078
1091
|
...!release.releasedAt ? [
|
|
1079
1092
|
{
|
|
1080
|
-
label:
|
|
1093
|
+
label: {
|
|
1081
1094
|
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1082
1095
|
defaultMessage: "status"
|
|
1083
|
-
}
|
|
1096
|
+
},
|
|
1084
1097
|
name: "status"
|
|
1085
1098
|
}
|
|
1086
1099
|
] : []
|
|
1087
1100
|
];
|
|
1088
|
-
|
|
1101
|
+
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1102
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1089
1103
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1090
1104
|
SingleSelect,
|
|
1091
1105
|
{
|
|
@@ -1102,7 +1116,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1102
1116
|
),
|
|
1103
1117
|
value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
|
|
1104
1118
|
onChange: (value) => setQuery({ groupBy: value }),
|
|
1105
|
-
children:
|
|
1119
|
+
children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
|
|
1106
1120
|
}
|
|
1107
1121
|
) }),
|
|
1108
1122
|
Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
|
|
@@ -1117,12 +1131,12 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1117
1131
|
headers,
|
|
1118
1132
|
isLoading: isLoading || isFetching,
|
|
1119
1133
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1120
|
-
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((
|
|
1134
|
+
/* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
|
|
1121
1135
|
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1122
1136
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1123
|
-
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1137
|
+
({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1124
1138
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1125
|
-
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1139
|
+
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1126
1140
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
1127
1141
|
/* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
|
|
1128
1142
|
{
|
|
@@ -1149,7 +1163,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1149
1163
|
action: type,
|
|
1150
1164
|
schema: contentTypes?.[contentType.uid],
|
|
1151
1165
|
components,
|
|
1152
|
-
entry
|
|
1166
|
+
entry,
|
|
1167
|
+
status
|
|
1153
1168
|
}
|
|
1154
1169
|
) }),
|
|
1155
1170
|
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
|
|
@@ -1157,7 +1172,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1157
1172
|
ReleaseActionMenu.ReleaseActionEntryLinkItem,
|
|
1158
1173
|
{
|
|
1159
1174
|
contentTypeUid: contentType.uid,
|
|
1160
|
-
|
|
1175
|
+
documentId: entry.documentId,
|
|
1161
1176
|
locale: locale?.code
|
|
1162
1177
|
}
|
|
1163
1178
|
),
|
|
@@ -1230,7 +1245,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1230
1245
|
const title = releaseData?.name || "";
|
|
1231
1246
|
const timezone = releaseData?.timezone ?? null;
|
|
1232
1247
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1233
|
-
const date = scheduledAt ?
|
|
1248
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
|
|
1234
1249
|
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1235
1250
|
const handleEditRelease = async (values) => {
|
|
1236
1251
|
const response = await updateRelease({
|
|
@@ -1247,7 +1262,8 @@ const ReleaseDetailsPage = () => {
|
|
|
1247
1262
|
defaultMessage: "Release updated."
|
|
1248
1263
|
})
|
|
1249
1264
|
});
|
|
1250
|
-
|
|
1265
|
+
toggleEditReleaseModal();
|
|
1266
|
+
} else if (isFetchError(response.error)) {
|
|
1251
1267
|
toggleNotification({
|
|
1252
1268
|
type: "danger",
|
|
1253
1269
|
message: formatAPIError(response.error)
|
|
@@ -1258,7 +1274,6 @@ const ReleaseDetailsPage = () => {
|
|
|
1258
1274
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1259
1275
|
});
|
|
1260
1276
|
}
|
|
1261
|
-
toggleEditReleaseModal();
|
|
1262
1277
|
};
|
|
1263
1278
|
const handleDeleteRelease = async () => {
|
|
1264
1279
|
const response = await deleteRelease({
|
|
@@ -1266,7 +1281,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1266
1281
|
});
|
|
1267
1282
|
if ("data" in response) {
|
|
1268
1283
|
navigate("..");
|
|
1269
|
-
} else if (
|
|
1284
|
+
} else if (isFetchError(response.error)) {
|
|
1270
1285
|
toggleNotification({
|
|
1271
1286
|
type: "danger",
|
|
1272
1287
|
message: formatAPIError(response.error)
|
|
@@ -1285,9 +1300,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1285
1300
|
toggleWarningSubmit,
|
|
1286
1301
|
children: [
|
|
1287
1302
|
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1288
|
-
|
|
1303
|
+
/* @__PURE__ */ jsx(
|
|
1289
1304
|
ReleaseModal,
|
|
1290
1305
|
{
|
|
1306
|
+
open: releaseModalShown,
|
|
1291
1307
|
handleClose: toggleEditReleaseModal,
|
|
1292
1308
|
handleSubmit: handleEditRelease,
|
|
1293
1309
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1301,18 +1317,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1301
1317
|
}
|
|
1302
1318
|
}
|
|
1303
1319
|
),
|
|
1304
|
-
/* @__PURE__ */ jsx(
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
onClose: toggleWarningSubmit,
|
|
1309
|
-
onConfirm: handleDeleteRelease,
|
|
1310
|
-
children: formatMessage({
|
|
1311
|
-
id: "content-releases.dialog.confirmation-message",
|
|
1312
|
-
defaultMessage: "Are you sure you want to delete this release?"
|
|
1313
|
-
})
|
|
1314
|
-
}
|
|
1315
|
-
)
|
|
1320
|
+
/* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
|
|
1321
|
+
id: "content-releases.dialog.confirmation-message",
|
|
1322
|
+
defaultMessage: "Are you sure you want to delete this release?"
|
|
1323
|
+
}) }) })
|
|
1316
1324
|
]
|
|
1317
1325
|
}
|
|
1318
1326
|
);
|
|
@@ -1326,4 +1334,4 @@ const App = () => {
|
|
|
1326
1334
|
export {
|
|
1327
1335
|
App
|
|
1328
1336
|
};
|
|
1329
|
-
//# sourceMappingURL=App-
|
|
1337
|
+
//# sourceMappingURL=App-DcXlnXrr.mjs.map
|