@strapi/content-releases 0.0.0-experimental.defd8568ae03ef8d52f86e1f3541979f953c3941 → 0.0.0-experimental.e02b4637b3906c6d31048d00600d09a23a0edc3d
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-O0ZO-S35.mjs → App-BA2xDdy0.mjs} +431 -400
- package/dist/_chunks/App-BA2xDdy0.mjs.map +1 -0
- package/dist/_chunks/{App-C0DlH0im.js → App-D4Wira1X.js} +434 -405
- package/dist/_chunks/App-D4Wira1X.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-DAHdUpAA.js → PurchaseContentReleases-Be3acS2L.js} +4 -3
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Ex09YpKR.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +5 -4
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.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-DjDPK8kb.mjs → index-CCFFG3Zs.mjs} +723 -599
- package/dist/_chunks/index-CCFFG3Zs.mjs.map +1 -0
- package/dist/_chunks/{index-DoZNNtsb.js → index-DxkQGp4N.js} +714 -592
- 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/ReleaseAction.d.ts +1 -1
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
- 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 +3 -2
- 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 +53 -370
- package/dist/admin/src/utils/api.d.ts +6 -0
- 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 +19 -19
- package/dist/_chunks/App-C0DlH0im.js.map +0 -1
- package/dist/_chunks/App-O0ZO-S35.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-DAHdUpAA.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Ex09YpKR.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-DjDPK8kb.mjs.map +0 -1
- package/dist/_chunks/index-DoZNNtsb.js.map +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
- 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
|
-
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Pagination, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
|
-
import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
|
|
4
|
-
import { g as
|
|
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 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
|
-
import {
|
|
7
|
-
import {
|
|
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, SimpleMenu, Dialog, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
|
|
8
|
+
import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
|
|
8
9
|
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
9
|
-
import
|
|
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
|
-
import styled from "styled-components";
|
|
14
|
-
import { intervalToDuration, isPast, formatISO } from "date-fns";
|
|
13
|
+
import { styled } from "styled-components";
|
|
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}}"
|
|
@@ -115,133 +96,143 @@ const ReleaseModal = ({
|
|
|
115
96
|
},
|
|
116
97
|
validationSchema: RELEASE_SCHEMA,
|
|
117
98
|
validateOnChange: false,
|
|
118
|
-
children: ({ values, errors, handleChange, setFieldValue }) =>
|
|
119
|
-
|
|
120
|
-
/* @__PURE__ */ jsx(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
defaultMessage:
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
setFieldValue("
|
|
144
|
-
|
|
145
|
-
} else {
|
|
146
|
-
setFieldValue("date", initialValues.date);
|
|
147
|
-
setFieldValue("time", initialValues.time);
|
|
148
|
-
setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
children: /* @__PURE__ */ jsx(
|
|
152
|
-
Typography,
|
|
153
|
-
{
|
|
154
|
-
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
155
|
-
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
156
|
-
children: formatMessage({
|
|
157
|
-
id: "modal.form.input.label.schedule-release",
|
|
158
|
-
defaultMessage: "Schedule release"
|
|
159
|
-
})
|
|
160
|
-
}
|
|
161
|
-
)
|
|
162
|
-
}
|
|
163
|
-
) }),
|
|
164
|
-
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
165
|
-
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
166
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
167
|
-
DatePicker,
|
|
168
|
-
{
|
|
169
|
-
label: formatMessage({
|
|
170
|
-
id: "content-releases.modal.form.input.label.date",
|
|
171
|
-
defaultMessage: "Date"
|
|
172
|
-
}),
|
|
173
|
-
name: "date",
|
|
174
|
-
error: errors.date,
|
|
175
|
-
onChange: (date) => {
|
|
176
|
-
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
177
|
-
setFieldValue("date", isoFormatDate);
|
|
178
|
-
},
|
|
179
|
-
clearLabel: formatMessage({
|
|
180
|
-
id: "content-releases.modal.form.input.clearLabel",
|
|
181
|
-
defaultMessage: "Clear"
|
|
182
|
-
}),
|
|
183
|
-
onClear: () => {
|
|
99
|
+
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
100
|
+
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
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
|
+
),
|
|
118
|
+
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
119
|
+
Checkbox,
|
|
120
|
+
{
|
|
121
|
+
name: "isScheduled",
|
|
122
|
+
checked: values.isScheduled,
|
|
123
|
+
onCheckedChange: (checked) => {
|
|
124
|
+
setFieldValue("isScheduled", checked);
|
|
125
|
+
if (!checked) {
|
|
184
126
|
setFieldValue("date", null);
|
|
185
|
-
},
|
|
186
|
-
selectedDate: values.date || void 0,
|
|
187
|
-
required: true,
|
|
188
|
-
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
189
|
-
}
|
|
190
|
-
) }),
|
|
191
|
-
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
192
|
-
TimePicker,
|
|
193
|
-
{
|
|
194
|
-
label: formatMessage({
|
|
195
|
-
id: "content-releases.modal.form.input.label.time",
|
|
196
|
-
defaultMessage: "Time"
|
|
197
|
-
}),
|
|
198
|
-
name: "time",
|
|
199
|
-
error: errors.time,
|
|
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
127
|
setFieldValue("time", "");
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
128
|
+
setFieldValue("timezone", null);
|
|
129
|
+
} else {
|
|
130
|
+
setFieldValue("date", initialValues.date);
|
|
131
|
+
setFieldValue("time", initialValues.time);
|
|
132
|
+
setFieldValue(
|
|
133
|
+
"timezone",
|
|
134
|
+
initialValues.timezone ?? systemTimezone?.value
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
children: /* @__PURE__ */ jsx(
|
|
139
|
+
Typography,
|
|
140
|
+
{
|
|
141
|
+
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
142
|
+
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
143
|
+
children: formatMessage({
|
|
144
|
+
id: "modal.form.input.label.schedule-release",
|
|
145
|
+
defaultMessage: "Schedule release"
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
) }),
|
|
151
|
+
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
152
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
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
|
+
) })
|
|
217
|
+
] }),
|
|
218
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
219
|
+
] })
|
|
220
|
+
] }) }),
|
|
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(
|
|
223
224
|
{
|
|
224
225
|
id: "content-releases.modal.form.button.submit",
|
|
225
226
|
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
226
227
|
},
|
|
227
228
|
{ isCreatingRelease }
|
|
228
229
|
) })
|
|
229
|
-
}
|
|
230
|
-
)
|
|
231
|
-
|
|
230
|
+
] })
|
|
231
|
+
] });
|
|
232
|
+
}
|
|
232
233
|
}
|
|
233
234
|
)
|
|
234
|
-
] });
|
|
235
|
-
};
|
|
236
|
-
const getTimezones = (selectedDate) => {
|
|
237
|
-
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
238
|
-
const utcOffset = getTimezoneOffset(timezone, selectedDate);
|
|
239
|
-
return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
|
|
240
|
-
});
|
|
241
|
-
const systemTimezone = timezoneList.find(
|
|
242
|
-
(timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
243
|
-
);
|
|
244
|
-
return { timezoneList, systemTimezone };
|
|
235
|
+
] }) });
|
|
245
236
|
};
|
|
246
237
|
const TimezoneComponent = ({ timezoneOptions }) => {
|
|
247
238
|
const { values, errors, setFieldValue } = useFormikContext();
|
|
@@ -257,33 +248,44 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
257
248
|
}
|
|
258
249
|
}
|
|
259
250
|
}, [setFieldValue, values.date, values.timezone]);
|
|
260
|
-
return /* @__PURE__ */
|
|
261
|
-
|
|
251
|
+
return /* @__PURE__ */ jsxs(
|
|
252
|
+
Field.Root,
|
|
262
253
|
{
|
|
263
|
-
label: formatMessage({
|
|
264
|
-
id: "content-releases.modal.form.input.label.timezone",
|
|
265
|
-
defaultMessage: "Timezone"
|
|
266
|
-
}),
|
|
267
|
-
autocomplete: { type: "list", filter: "contains" },
|
|
268
254
|
name: "timezone",
|
|
269
|
-
|
|
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
|
-
error: errors.timezone,
|
|
255
|
+
error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
|
|
281
256
|
required: true,
|
|
282
|
-
children:
|
|
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
|
+
]
|
|
283
282
|
}
|
|
284
283
|
);
|
|
285
284
|
};
|
|
286
285
|
const useTypedDispatch = useDispatch;
|
|
286
|
+
const isBaseQueryError = (error) => {
|
|
287
|
+
return typeof error !== "undefined" && error.name !== void 0;
|
|
288
|
+
};
|
|
287
289
|
const LinkCard = styled(Link)`
|
|
288
290
|
display: block;
|
|
289
291
|
`;
|
|
@@ -340,7 +342,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
340
342
|
}
|
|
341
343
|
);
|
|
342
344
|
}
|
|
343
|
-
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(
|
|
344
346
|
Flex,
|
|
345
347
|
{
|
|
346
348
|
direction: "column",
|
|
@@ -355,7 +357,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
355
357
|
gap: 4,
|
|
356
358
|
children: [
|
|
357
359
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
358
|
-
/* @__PURE__ */ jsx(Typography, {
|
|
360
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
359
361
|
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
360
362
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
361
363
|
defaultMessage: "Not scheduled"
|
|
@@ -376,14 +378,13 @@ const StyledAlert = styled(Alert)`
|
|
|
376
378
|
`;
|
|
377
379
|
const INITIAL_FORM_VALUES = {
|
|
378
380
|
name: "",
|
|
379
|
-
date:
|
|
381
|
+
date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
|
|
380
382
|
time: "",
|
|
381
383
|
isScheduled: true,
|
|
382
384
|
scheduledAt: null,
|
|
383
385
|
timezone: null
|
|
384
386
|
};
|
|
385
387
|
const ReleasesPage = () => {
|
|
386
|
-
const tabRef = React.useRef(null);
|
|
387
388
|
const location = useLocation();
|
|
388
389
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
389
390
|
const { toggleNotification } = useNotification();
|
|
@@ -392,6 +393,7 @@ const ReleasesPage = () => {
|
|
|
392
393
|
const { formatAPIError } = useAPIErrorHandler();
|
|
393
394
|
const [{ query }, setQuery] = useQueryParams();
|
|
394
395
|
const response = useGetReleasesQuery(query);
|
|
396
|
+
const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
|
|
395
397
|
const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
|
|
396
398
|
const { getFeature } = useLicenseLimits();
|
|
397
399
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
@@ -399,9 +401,8 @@ const ReleasesPage = () => {
|
|
|
399
401
|
const {
|
|
400
402
|
allowedActions: { canCreate }
|
|
401
403
|
} = useRBAC(PERMISSIONS);
|
|
402
|
-
const { isLoading, isSuccess, isError } = response;
|
|
404
|
+
const { isLoading: isLoadingReleases, isSuccess, isError } = response;
|
|
403
405
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
404
|
-
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
405
406
|
React.useEffect(() => {
|
|
406
407
|
if (location?.state?.errors) {
|
|
407
408
|
toggleNotification({
|
|
@@ -418,27 +419,22 @@ const ReleasesPage = () => {
|
|
|
418
419
|
navigate("", { replace: true, state: null });
|
|
419
420
|
}
|
|
420
421
|
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
421
|
-
React.useEffect(() => {
|
|
422
|
-
if (tabRef.current) {
|
|
423
|
-
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
424
|
-
}
|
|
425
|
-
}, [activeTabIndex]);
|
|
426
422
|
const toggleAddReleaseModal = () => {
|
|
427
423
|
setReleaseModalShown((prev) => !prev);
|
|
428
424
|
};
|
|
429
|
-
if (
|
|
425
|
+
if (isLoadingReleases || isLoadingSettings) {
|
|
430
426
|
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
431
427
|
}
|
|
432
428
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
433
429
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
434
|
-
const handleTabChange = (
|
|
430
|
+
const handleTabChange = (tabValue) => {
|
|
435
431
|
setQuery({
|
|
436
432
|
...query,
|
|
437
433
|
page: 1,
|
|
438
434
|
pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
|
|
439
435
|
filters: {
|
|
440
436
|
releasedAt: {
|
|
441
|
-
$notNull:
|
|
437
|
+
$notNull: tabValue !== "pending"
|
|
442
438
|
}
|
|
443
439
|
}
|
|
444
440
|
});
|
|
@@ -459,7 +455,7 @@ const ReleasesPage = () => {
|
|
|
459
455
|
});
|
|
460
456
|
trackUsage("didCreateRelease");
|
|
461
457
|
navigate(response2.data.data.id.toString());
|
|
462
|
-
} else if (
|
|
458
|
+
} else if (isFetchError(response2.error)) {
|
|
463
459
|
toggleNotification({
|
|
464
460
|
type: "danger",
|
|
465
461
|
message: formatAPIError(response2.error)
|
|
@@ -471,9 +467,9 @@ const ReleasesPage = () => {
|
|
|
471
467
|
});
|
|
472
468
|
}
|
|
473
469
|
};
|
|
474
|
-
return /* @__PURE__ */ jsxs(Main, { "aria-busy":
|
|
470
|
+
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
|
|
475
471
|
/* @__PURE__ */ jsx(
|
|
476
|
-
|
|
472
|
+
Layouts.Header,
|
|
477
473
|
{
|
|
478
474
|
title: formatMessage({
|
|
479
475
|
id: "content-releases.pages.Releases.title",
|
|
@@ -497,7 +493,7 @@ const ReleasesPage = () => {
|
|
|
497
493
|
) : null
|
|
498
494
|
}
|
|
499
495
|
),
|
|
500
|
-
/* @__PURE__ */ jsx(
|
|
496
|
+
/* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
501
497
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
502
498
|
StyledAlert,
|
|
503
499
|
{
|
|
@@ -522,21 +518,17 @@ const ReleasesPage = () => {
|
|
|
522
518
|
})
|
|
523
519
|
}
|
|
524
520
|
),
|
|
525
|
-
/* @__PURE__ */ jsxs(
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
children: [
|
|
537
|
-
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
538
|
-
/* @__PURE__ */ jsxs(Tabs, { children: [
|
|
539
|
-
/* @__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(
|
|
540
532
|
{
|
|
541
533
|
id: "content-releases.pages.Releases.tab.pending",
|
|
542
534
|
defaultMessage: "Pending ({count})"
|
|
@@ -545,34 +537,32 @@ const ReleasesPage = () => {
|
|
|
545
537
|
count: totalPendingReleases
|
|
546
538
|
}
|
|
547
539
|
) }),
|
|
548
|
-
/* @__PURE__ */ jsx(
|
|
540
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
|
|
549
541
|
id: "content-releases.pages.Releases.tab.done",
|
|
550
542
|
defaultMessage: "Done"
|
|
551
543
|
}) })
|
|
552
|
-
]
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
}
|
|
575
|
-
),
|
|
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
|
+
] }),
|
|
576
566
|
/* @__PURE__ */ jsxs(
|
|
577
567
|
Pagination.Root,
|
|
578
568
|
{
|
|
@@ -585,13 +575,17 @@ const ReleasesPage = () => {
|
|
|
585
575
|
}
|
|
586
576
|
)
|
|
587
577
|
] }) }),
|
|
588
|
-
|
|
578
|
+
/* @__PURE__ */ jsx(
|
|
589
579
|
ReleaseModal,
|
|
590
580
|
{
|
|
581
|
+
open: releaseModalShown,
|
|
591
582
|
handleClose: toggleAddReleaseModal,
|
|
592
583
|
handleSubmit: handleAddRelease,
|
|
593
584
|
isLoading: isSubmittingForm,
|
|
594
|
-
initialValues:
|
|
585
|
+
initialValues: {
|
|
586
|
+
...INITIAL_FORM_VALUES,
|
|
587
|
+
timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
|
|
588
|
+
}
|
|
595
589
|
}
|
|
596
590
|
)
|
|
597
591
|
] });
|
|
@@ -602,7 +596,7 @@ const ReleaseInfoWrapper = styled(Flex)`
|
|
|
602
596
|
border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
|
|
603
597
|
border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
|
|
604
598
|
`;
|
|
605
|
-
const StyledMenuItem = styled(
|
|
599
|
+
const StyledMenuItem = styled(MenuItem)`
|
|
606
600
|
svg path {
|
|
607
601
|
fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
|
|
608
602
|
}
|
|
@@ -611,19 +605,19 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
611
605
|
}
|
|
612
606
|
|
|
613
607
|
&:hover {
|
|
614
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
608
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
615
609
|
}
|
|
616
610
|
`;
|
|
617
611
|
const PencilIcon = styled(Pencil)`
|
|
618
|
-
width: ${({ theme }) => theme.spaces[
|
|
619
|
-
height: ${({ theme }) => theme.spaces[
|
|
612
|
+
width: ${({ theme }) => theme.spaces[4]};
|
|
613
|
+
height: ${({ theme }) => theme.spaces[4]};
|
|
620
614
|
path {
|
|
621
615
|
fill: ${({ theme }) => theme.colors.neutral600};
|
|
622
616
|
}
|
|
623
617
|
`;
|
|
624
618
|
const TrashIcon = styled(Trash)`
|
|
625
|
-
width: ${({ theme }) => theme.spaces[
|
|
626
|
-
height: ${({ theme }) => theme.spaces[
|
|
619
|
+
width: ${({ theme }) => theme.spaces[4]};
|
|
620
|
+
height: ${({ theme }) => theme.spaces[4]};
|
|
627
621
|
path {
|
|
628
622
|
fill: ${({ theme }) => theme.colors.danger600};
|
|
629
623
|
}
|
|
@@ -631,41 +625,90 @@ const TrashIcon = styled(Trash)`
|
|
|
631
625
|
const TypographyMaxWidth = styled(Typography)`
|
|
632
626
|
max-width: 300px;
|
|
633
627
|
`;
|
|
634
|
-
const EntryValidationText = ({ action, schema, entry }) => {
|
|
628
|
+
const EntryValidationText = ({ action, schema, entry, status }) => {
|
|
635
629
|
const { formatMessage } = useIntl();
|
|
636
|
-
const { validate } = unstable_useDocument(
|
|
630
|
+
const { validate, isLoading } = unstable_useDocument(
|
|
637
631
|
{
|
|
638
632
|
collectionType: schema?.kind ?? "",
|
|
639
633
|
model: schema?.uid ?? ""
|
|
640
634
|
},
|
|
641
635
|
{
|
|
642
|
-
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
|
|
643
638
|
}
|
|
644
639
|
);
|
|
645
|
-
const
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
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;
|
|
657
666
|
}
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
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
|
+
}
|
|
669
712
|
}
|
|
670
713
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
671
714
|
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
@@ -688,7 +731,6 @@ const ReleaseDetailsLayout = ({
|
|
|
688
731
|
const {
|
|
689
732
|
data,
|
|
690
733
|
isLoading: isLoadingDetails,
|
|
691
|
-
isError,
|
|
692
734
|
error
|
|
693
735
|
} = useGetReleaseQuery(
|
|
694
736
|
{ id: releaseId },
|
|
@@ -720,7 +762,7 @@ const ReleaseDetailsLayout = ({
|
|
|
720
762
|
totalPublishedEntries,
|
|
721
763
|
totalUnpublishedEntries
|
|
722
764
|
});
|
|
723
|
-
} else if (
|
|
765
|
+
} else if (isFetchError(response.error)) {
|
|
724
766
|
toggleNotification({
|
|
725
767
|
type: "danger",
|
|
726
768
|
message: formatAPIError(response.error)
|
|
@@ -755,7 +797,7 @@ const ReleaseDetailsLayout = ({
|
|
|
755
797
|
if (isLoadingDetails) {
|
|
756
798
|
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
757
799
|
}
|
|
758
|
-
if (
|
|
800
|
+
if (isBaseQueryError(error) && "code" in error || !release) {
|
|
759
801
|
return /* @__PURE__ */ jsx(
|
|
760
802
|
Navigate,
|
|
761
803
|
{
|
|
@@ -763,6 +805,7 @@ const ReleaseDetailsLayout = ({
|
|
|
763
805
|
state: {
|
|
764
806
|
errors: [
|
|
765
807
|
{
|
|
808
|
+
// @ts-expect-error – TODO: fix this weird error flow
|
|
766
809
|
code: error?.code
|
|
767
810
|
}
|
|
768
811
|
]
|
|
@@ -802,7 +845,7 @@ const ReleaseDetailsLayout = ({
|
|
|
802
845
|
) : "";
|
|
803
846
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
804
847
|
/* @__PURE__ */ jsx(
|
|
805
|
-
|
|
848
|
+
Layouts.Header,
|
|
806
849
|
{
|
|
807
850
|
title: release.name,
|
|
808
851
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
@@ -811,84 +854,71 @@ const ReleaseDetailsLayout = ({
|
|
|
811
854
|
] }),
|
|
812
855
|
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
813
856
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
814
|
-
/* @__PURE__ */ jsxs(
|
|
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
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
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"
|
|
844
889
|
}) })
|
|
845
|
-
] }) }),
|
|
846
|
-
/* @__PURE__ */ jsx(
|
|
847
|
-
StyledMenuItem,
|
|
848
|
-
{
|
|
849
|
-
disabled: !canDelete,
|
|
850
|
-
onSelect: toggleWarningSubmit,
|
|
851
|
-
variant: "danger",
|
|
852
|
-
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
853
|
-
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
854
|
-
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
855
|
-
id: "content-releases.header.actions.delete",
|
|
856
|
-
defaultMessage: "Delete"
|
|
857
|
-
}) })
|
|
858
|
-
] })
|
|
859
|
-
}
|
|
860
|
-
)
|
|
861
|
-
]
|
|
862
|
-
}
|
|
863
|
-
),
|
|
864
|
-
/* @__PURE__ */ jsxs(
|
|
865
|
-
ReleaseInfoWrapper,
|
|
866
|
-
{
|
|
867
|
-
direction: "column",
|
|
868
|
-
justifyContent: "center",
|
|
869
|
-
alignItems: "flex-start",
|
|
870
|
-
gap: 1,
|
|
871
|
-
padding: 5,
|
|
872
|
-
children: [
|
|
873
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
874
|
-
id: "content-releases.header.actions.created",
|
|
875
|
-
defaultMessage: "Created"
|
|
876
|
-
}) }),
|
|
877
|
-
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
878
|
-
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
879
|
-
formatMessage(
|
|
880
|
-
{
|
|
881
|
-
id: "content-releases.header.actions.created.description",
|
|
882
|
-
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
883
|
-
},
|
|
884
|
-
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
885
|
-
)
|
|
886
890
|
] })
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
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
|
+
),
|
|
892
922
|
/* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
|
|
893
923
|
id: "content-releases.header.actions.refresh",
|
|
894
924
|
defaultMessage: "Refresh"
|
|
@@ -913,6 +943,11 @@ const ReleaseDetailsLayout = ({
|
|
|
913
943
|
children
|
|
914
944
|
] });
|
|
915
945
|
};
|
|
946
|
+
const SimpleMenuButton = styled(SimpleMenu)`
|
|
947
|
+
& > span {
|
|
948
|
+
display: flex;
|
|
949
|
+
}
|
|
950
|
+
`;
|
|
916
951
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
917
952
|
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
918
953
|
const getGroupByOptionLabel = (value) => {
|
|
@@ -941,26 +976,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
941
976
|
const {
|
|
942
977
|
data: releaseData,
|
|
943
978
|
isLoading: isReleaseLoading,
|
|
944
|
-
isError: isReleaseError,
|
|
945
979
|
error: releaseError
|
|
946
980
|
} = useGetReleaseQuery({ id: releaseId });
|
|
947
981
|
const {
|
|
948
982
|
allowedActions: { canUpdate }
|
|
949
983
|
} = useRBAC(PERMISSIONS);
|
|
950
984
|
const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
|
|
951
|
-
const { hasI18nEnabled } = runHookWaterfall(
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
);
|
|
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
|
+
});
|
|
964
997
|
const release = releaseData?.data;
|
|
965
998
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
966
999
|
const {
|
|
@@ -989,7 +1022,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
989
1022
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
990
1023
|
});
|
|
991
1024
|
if ("error" in response) {
|
|
992
|
-
if (
|
|
1025
|
+
if (isFetchError(response.error)) {
|
|
993
1026
|
toggleNotification({
|
|
994
1027
|
type: "danger",
|
|
995
1028
|
message: formatAPIError(response.error)
|
|
@@ -1009,14 +1042,14 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1009
1042
|
const releaseMeta = data?.meta;
|
|
1010
1043
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
1011
1044
|
const components = releaseMeta?.components || {};
|
|
1012
|
-
if (
|
|
1045
|
+
if (isBaseQueryError(releaseError) || !release) {
|
|
1013
1046
|
const errorsArray = [];
|
|
1014
|
-
if (releaseError) {
|
|
1047
|
+
if (releaseError && "code" in releaseError) {
|
|
1015
1048
|
errorsArray.push({
|
|
1016
1049
|
code: releaseError.code
|
|
1017
1050
|
});
|
|
1018
1051
|
}
|
|
1019
|
-
if (releaseActionsError) {
|
|
1052
|
+
if (releaseActionsError && "code" in releaseActionsError) {
|
|
1020
1053
|
errorsArray.push({
|
|
1021
1054
|
code: releaseActionsError.code
|
|
1022
1055
|
});
|
|
@@ -1035,13 +1068,13 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1035
1068
|
return /* @__PURE__ */ jsx(Page.Error, {});
|
|
1036
1069
|
}
|
|
1037
1070
|
if (Object.keys(releaseActions).length === 0) {
|
|
1038
|
-
return /* @__PURE__ */ jsx(
|
|
1071
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
|
|
1039
1072
|
EmptyStateLayout,
|
|
1040
1073
|
{
|
|
1041
1074
|
action: /* @__PURE__ */ jsx(
|
|
1042
1075
|
LinkButton,
|
|
1043
1076
|
{
|
|
1044
|
-
|
|
1077
|
+
tag: Link$1,
|
|
1045
1078
|
to: {
|
|
1046
1079
|
pathname: "/content-manager"
|
|
1047
1080
|
},
|
|
@@ -1066,40 +1099,33 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1066
1099
|
defaultMessage: "Group by"
|
|
1067
1100
|
});
|
|
1068
1101
|
const headers = [
|
|
1069
|
-
|
|
1070
|
-
{
|
|
1071
|
-
label: formatMessage({
|
|
1072
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1073
|
-
defaultMessage: "name"
|
|
1074
|
-
}),
|
|
1075
|
-
name: "name"
|
|
1076
|
-
},
|
|
1102
|
+
...displayedHeaders,
|
|
1077
1103
|
{
|
|
1078
|
-
label:
|
|
1104
|
+
label: {
|
|
1079
1105
|
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1080
1106
|
defaultMessage: "content-type"
|
|
1081
|
-
}
|
|
1107
|
+
},
|
|
1082
1108
|
name: "content-type"
|
|
1083
1109
|
},
|
|
1084
1110
|
{
|
|
1085
|
-
label:
|
|
1111
|
+
label: {
|
|
1086
1112
|
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1087
1113
|
defaultMessage: "action"
|
|
1088
|
-
}
|
|
1114
|
+
},
|
|
1089
1115
|
name: "action"
|
|
1090
1116
|
},
|
|
1091
1117
|
...!release.releasedAt ? [
|
|
1092
1118
|
{
|
|
1093
|
-
label:
|
|
1119
|
+
label: {
|
|
1094
1120
|
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1095
1121
|
defaultMessage: "status"
|
|
1096
|
-
}
|
|
1122
|
+
},
|
|
1097
1123
|
name: "status"
|
|
1098
1124
|
}
|
|
1099
1125
|
] : []
|
|
1100
1126
|
];
|
|
1101
1127
|
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1102
|
-
return /* @__PURE__ */ jsx(
|
|
1128
|
+
return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1103
1129
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1104
1130
|
SingleSelect,
|
|
1105
1131
|
{
|
|
@@ -1131,10 +1157,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1131
1157
|
headers,
|
|
1132
1158
|
isLoading: isLoading || isFetching,
|
|
1133
1159
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1134
|
-
/* @__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)) }),
|
|
1135
1161
|
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1136
1162
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1137
|
-
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1163
|
+
({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1138
1164
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1139
1165
|
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1140
1166
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
@@ -1163,7 +1189,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1163
1189
|
action: type,
|
|
1164
1190
|
schema: contentTypes?.[contentType.uid],
|
|
1165
1191
|
components,
|
|
1166
|
-
entry
|
|
1192
|
+
entry,
|
|
1193
|
+
status
|
|
1167
1194
|
}
|
|
1168
1195
|
) }),
|
|
1169
1196
|
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
|
|
@@ -1171,7 +1198,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1171
1198
|
ReleaseActionMenu.ReleaseActionEntryLinkItem,
|
|
1172
1199
|
{
|
|
1173
1200
|
contentTypeUid: contentType.uid,
|
|
1174
|
-
|
|
1201
|
+
documentId: entry.documentId,
|
|
1175
1202
|
locale: locale?.code
|
|
1176
1203
|
}
|
|
1177
1204
|
),
|
|
@@ -1221,13 +1248,24 @@ const ReleaseDetailsPage = () => {
|
|
|
1221
1248
|
skip: !releaseId
|
|
1222
1249
|
}
|
|
1223
1250
|
);
|
|
1251
|
+
const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
|
|
1224
1252
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1225
1253
|
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1226
1254
|
const toggleEditReleaseModal = () => {
|
|
1227
1255
|
setReleaseModalShown((prev) => !prev);
|
|
1228
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
|
+
};
|
|
1229
1267
|
const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
|
|
1230
|
-
if (isLoadingDetails) {
|
|
1268
|
+
if (isLoadingDetails || isLoadingTimezone) {
|
|
1231
1269
|
return /* @__PURE__ */ jsx(
|
|
1232
1270
|
ReleaseDetailsLayout,
|
|
1233
1271
|
{
|
|
@@ -1242,10 +1280,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1242
1280
|
}
|
|
1243
1281
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1244
1282
|
const title = releaseData?.name || "";
|
|
1245
|
-
const timezone =
|
|
1283
|
+
const timezone = getTimezoneValue();
|
|
1246
1284
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1247
|
-
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") :
|
|
1248
|
-
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") : "";
|
|
1249
1287
|
const handleEditRelease = async (values) => {
|
|
1250
1288
|
const response = await updateRelease({
|
|
1251
1289
|
id: releaseId,
|
|
@@ -1262,7 +1300,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1262
1300
|
})
|
|
1263
1301
|
});
|
|
1264
1302
|
toggleEditReleaseModal();
|
|
1265
|
-
} else if (
|
|
1303
|
+
} else if (isFetchError(response.error)) {
|
|
1266
1304
|
toggleNotification({
|
|
1267
1305
|
type: "danger",
|
|
1268
1306
|
message: formatAPIError(response.error)
|
|
@@ -1280,7 +1318,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1280
1318
|
});
|
|
1281
1319
|
if ("data" in response) {
|
|
1282
1320
|
navigate("..");
|
|
1283
|
-
} else if (
|
|
1321
|
+
} else if (isFetchError(response.error)) {
|
|
1284
1322
|
toggleNotification({
|
|
1285
1323
|
type: "danger",
|
|
1286
1324
|
message: formatAPIError(response.error)
|
|
@@ -1299,9 +1337,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1299
1337
|
toggleWarningSubmit,
|
|
1300
1338
|
children: [
|
|
1301
1339
|
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1302
|
-
|
|
1340
|
+
/* @__PURE__ */ jsx(
|
|
1303
1341
|
ReleaseModal,
|
|
1304
1342
|
{
|
|
1343
|
+
open: releaseModalShown,
|
|
1305
1344
|
handleClose: toggleEditReleaseModal,
|
|
1306
1345
|
handleSubmit: handleEditRelease,
|
|
1307
1346
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1315,18 +1354,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1315
1354
|
}
|
|
1316
1355
|
}
|
|
1317
1356
|
),
|
|
1318
|
-
/* @__PURE__ */ jsx(
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
onClose: toggleWarningSubmit,
|
|
1323
|
-
onConfirm: handleDeleteRelease,
|
|
1324
|
-
children: formatMessage({
|
|
1325
|
-
id: "content-releases.dialog.confirmation-message",
|
|
1326
|
-
defaultMessage: "Are you sure you want to delete this release?"
|
|
1327
|
-
})
|
|
1328
|
-
}
|
|
1329
|
-
)
|
|
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
|
+
}) }) })
|
|
1330
1361
|
]
|
|
1331
1362
|
}
|
|
1332
1363
|
);
|
|
@@ -1340,4 +1371,4 @@ const App = () => {
|
|
|
1340
1371
|
export {
|
|
1341
1372
|
App
|
|
1342
1373
|
};
|
|
1343
|
-
//# sourceMappingURL=App-
|
|
1374
|
+
//# sourceMappingURL=App-BA2xDdy0.mjs.map
|