@strapi/content-releases 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.eba25ec571b091c6bde1104eb6c753debdf15462
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-BsUSTHVD.mjs → App-FQyYFBJT.mjs} +642 -426
- package/dist/_chunks/App-FQyYFBJT.mjs.map +1 -0
- package/dist/_chunks/{App-CXRpb2hi.js → App-lx4Ucy9W.js} +680 -466
- package/dist/_chunks/App-lx4Ucy9W.js.map +1 -0
- package/dist/_chunks/ReleasesSettingsPage-DqBxvJ9i.mjs +178 -0
- package/dist/_chunks/ReleasesSettingsPage-DqBxvJ9i.mjs.map +1 -0
- package/dist/_chunks/ReleasesSettingsPage-T5VEAV03.js +178 -0
- package/dist/_chunks/ReleasesSettingsPage-T5VEAV03.js.map +1 -0
- package/dist/_chunks/{en-DtFJ5ViE.js → en-BWPPsSH-.js} +18 -2
- package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
- package/dist/_chunks/{en-B9Ur3VsE.mjs → en-D9Q4YW03.mjs} +18 -2
- package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
- package/dist/_chunks/{index-DJLIZdZv.mjs → index-CK9G80CL.mjs} +740 -600
- package/dist/_chunks/index-CK9G80CL.mjs.map +1 -0
- package/dist/_chunks/{index-B6-lic1Q.js → index-Cl3tM1YW.js} +731 -593
- package/dist/_chunks/index-Cl3tM1YW.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/EntryValidationPopover.d.ts +13 -0
- 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 +888 -612
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +889 -613
- 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 +64 -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 +36 -38
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/release-action.d.ts +34 -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 +17 -11
- 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 +23 -22
- package/dist/_chunks/App-BsUSTHVD.mjs.map +0 -1
- package/dist/_chunks/App-CXRpb2hi.js.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-B6-lic1Q.js.map +0 -1
- package/dist/_chunks/index-DJLIZdZv.mjs.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,21 +1,306 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
|
-
import { useLocation, useNavigate, useParams, Navigate,
|
|
4
|
-
import { g as
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
|
|
3
|
+
import { Link, useLocation, useNavigate, NavLink, useParams, Navigate, 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-CK9G80CL.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
|
|
6
|
+
import { Flex, Popover, Button, Typography, LinkButton, Modal, Field, TextInput, Box, Checkbox, DatePicker, TimePicker, Combobox, ComboboxOption, Link as Link$1, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, SimpleMenu, Dialog, SingleSelect, SingleSelectOption, Tr, Td } from "@strapi/design-system";
|
|
7
|
+
import { CrossCircle, CaretDown, CheckCircle, ArrowsCounterClockwise, Plus, Pencil, Trash, More } from "@strapi/icons";
|
|
9
8
|
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
10
|
-
import format from "date-fns/format";
|
|
9
|
+
import format$1 from "date-fns/format";
|
|
11
10
|
import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
|
|
12
11
|
import { useIntl } from "react-intl";
|
|
13
|
-
import styled from "styled-components";
|
|
14
|
-
import {
|
|
12
|
+
import { styled } from "styled-components";
|
|
13
|
+
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
14
|
+
import { stringify } from "qs";
|
|
15
|
+
import { intervalToDuration, isPast, formatISO, format } from "date-fns";
|
|
15
16
|
import { Formik, Form, useFormikContext } from "formik";
|
|
16
|
-
import
|
|
17
|
+
import { R as RELEASE_SCHEMA } from "./schemas-DdA2ic2U.mjs";
|
|
17
18
|
import { useDispatch } from "react-redux";
|
|
18
19
|
import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
|
|
20
|
+
const StyledPopoverFlex = styled(Flex)`
|
|
21
|
+
width: 100%;
|
|
22
|
+
max-width: 256px;
|
|
23
|
+
|
|
24
|
+
& > * {
|
|
25
|
+
border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
& > *:last-child {
|
|
29
|
+
border-bottom: none;
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
const EntryStatusTrigger = ({
|
|
33
|
+
action,
|
|
34
|
+
status,
|
|
35
|
+
hasErrors,
|
|
36
|
+
requiredStage,
|
|
37
|
+
entryStage
|
|
38
|
+
}) => {
|
|
39
|
+
const { formatMessage } = useIntl();
|
|
40
|
+
if (action === "publish") {
|
|
41
|
+
if (hasErrors || requiredStage && requiredStage.id !== entryStage?.id) {
|
|
42
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
|
|
43
|
+
Button,
|
|
44
|
+
{
|
|
45
|
+
variant: "ghost",
|
|
46
|
+
startIcon: /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
47
|
+
endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
|
|
48
|
+
children: /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", fontWeight: "bold", children: formatMessage({
|
|
49
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.not-ready",
|
|
50
|
+
defaultMessage: "Not ready to publish"
|
|
51
|
+
}) })
|
|
52
|
+
}
|
|
53
|
+
) });
|
|
54
|
+
}
|
|
55
|
+
if (status === "draft") {
|
|
56
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
|
|
57
|
+
Button,
|
|
58
|
+
{
|
|
59
|
+
variant: "ghost",
|
|
60
|
+
startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
61
|
+
endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
|
|
62
|
+
children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
|
|
63
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
|
|
64
|
+
defaultMessage: "Ready to publish"
|
|
65
|
+
}) })
|
|
66
|
+
}
|
|
67
|
+
) });
|
|
68
|
+
}
|
|
69
|
+
if (status === "modified") {
|
|
70
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
|
|
71
|
+
Button,
|
|
72
|
+
{
|
|
73
|
+
variant: "ghost",
|
|
74
|
+
startIcon: /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
|
|
75
|
+
endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
|
|
76
|
+
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", fontWeight: "bold", textColor: "alternative600", children: formatMessage({
|
|
77
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
|
|
78
|
+
defaultMessage: "Ready to publish changes"
|
|
79
|
+
}) })
|
|
80
|
+
}
|
|
81
|
+
) });
|
|
82
|
+
}
|
|
83
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
|
|
84
|
+
Button,
|
|
85
|
+
{
|
|
86
|
+
variant: "ghost",
|
|
87
|
+
startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
88
|
+
endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
|
|
89
|
+
children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
|
|
90
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
91
|
+
defaultMessage: "Already published"
|
|
92
|
+
}) })
|
|
93
|
+
}
|
|
94
|
+
) });
|
|
95
|
+
}
|
|
96
|
+
if (status === "published") {
|
|
97
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
|
|
98
|
+
Button,
|
|
99
|
+
{
|
|
100
|
+
variant: "ghost",
|
|
101
|
+
startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
102
|
+
endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
|
|
103
|
+
children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
|
|
104
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
|
|
105
|
+
defaultMessage: "Ready to unpublish"
|
|
106
|
+
}) })
|
|
107
|
+
}
|
|
108
|
+
) });
|
|
109
|
+
}
|
|
110
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }), endIcon: /* @__PURE__ */ jsx(CaretDown, {}), children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
|
|
111
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
112
|
+
defaultMessage: "Already unpublished"
|
|
113
|
+
}) }) }) });
|
|
114
|
+
};
|
|
115
|
+
const FieldsValidation = ({
|
|
116
|
+
hasErrors,
|
|
117
|
+
errors,
|
|
118
|
+
kind,
|
|
119
|
+
contentTypeUid,
|
|
120
|
+
documentId,
|
|
121
|
+
locale
|
|
122
|
+
}) => {
|
|
123
|
+
const { formatMessage } = useIntl();
|
|
124
|
+
return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 1, width: "100%", padding: 5, children: [
|
|
125
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
|
|
126
|
+
/* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: formatMessage({
|
|
127
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.fields",
|
|
128
|
+
defaultMessage: "Fields"
|
|
129
|
+
}) }),
|
|
130
|
+
hasErrors ? /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }) : /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" })
|
|
131
|
+
] }),
|
|
132
|
+
/* @__PURE__ */ jsx(Typography, { width: "100%", textColor: "neutral600", children: hasErrors ? formatMessage(
|
|
133
|
+
{
|
|
134
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.fields.error",
|
|
135
|
+
defaultMessage: "{errors} errors on fields."
|
|
136
|
+
},
|
|
137
|
+
{ errors: errors ? Object.keys(errors).length : 0 }
|
|
138
|
+
) : formatMessage({
|
|
139
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.fields.success",
|
|
140
|
+
defaultMessage: "All fields are filled correctly."
|
|
141
|
+
}) }),
|
|
142
|
+
hasErrors && /* @__PURE__ */ jsx(
|
|
143
|
+
LinkButton,
|
|
144
|
+
{
|
|
145
|
+
tag: Link,
|
|
146
|
+
to: {
|
|
147
|
+
pathname: `/content-manager/${kind === "collectionType" ? "collection-types" : "single-types"}/${contentTypeUid}/${documentId}`,
|
|
148
|
+
search: locale ? stringify({
|
|
149
|
+
plugins: {
|
|
150
|
+
i18n: {
|
|
151
|
+
locale
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}) : ""
|
|
155
|
+
},
|
|
156
|
+
variant: "secondary",
|
|
157
|
+
fullWidth: true,
|
|
158
|
+
state: { forceValidation: true },
|
|
159
|
+
children: formatMessage({
|
|
160
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors",
|
|
161
|
+
defaultMessage: "See errors"
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
] });
|
|
166
|
+
};
|
|
167
|
+
const getReviewStageIcon = ({
|
|
168
|
+
contentTypeHasReviewWorkflow,
|
|
169
|
+
requiredStage,
|
|
170
|
+
entryStage
|
|
171
|
+
}) => {
|
|
172
|
+
if (!contentTypeHasReviewWorkflow) {
|
|
173
|
+
return /* @__PURE__ */ jsx(CheckCircle, { fill: "neutral200" });
|
|
174
|
+
}
|
|
175
|
+
if (requiredStage && requiredStage.id !== entryStage?.id) {
|
|
176
|
+
return /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" });
|
|
177
|
+
}
|
|
178
|
+
return /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" });
|
|
179
|
+
};
|
|
180
|
+
const getReviewStageMessage = ({
|
|
181
|
+
contentTypeHasReviewWorkflow,
|
|
182
|
+
requiredStage,
|
|
183
|
+
entryStage,
|
|
184
|
+
formatMessage
|
|
185
|
+
}) => {
|
|
186
|
+
if (!contentTypeHasReviewWorkflow) {
|
|
187
|
+
return formatMessage({
|
|
188
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled",
|
|
189
|
+
defaultMessage: "This entry is not associated to any workflow."
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (requiredStage && requiredStage.id !== entryStage?.id) {
|
|
193
|
+
return formatMessage(
|
|
194
|
+
{
|
|
195
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready",
|
|
196
|
+
defaultMessage: "This entry is not at the required stage for publishing. ({stageName})"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
stageName: requiredStage?.name ?? ""
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
if (requiredStage && requiredStage.id === entryStage?.id) {
|
|
204
|
+
return formatMessage(
|
|
205
|
+
{
|
|
206
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready",
|
|
207
|
+
defaultMessage: "This entry is at the required stage for publishing. ({stageName})"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
stageName: requiredStage?.name ?? ""
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
return formatMessage({
|
|
215
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required",
|
|
216
|
+
defaultMessage: "No required stage for publication"
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
const ReviewStageValidation = ({
|
|
220
|
+
contentTypeHasReviewWorkflow,
|
|
221
|
+
requiredStage,
|
|
222
|
+
entryStage
|
|
223
|
+
}) => {
|
|
224
|
+
const { formatMessage } = useIntl();
|
|
225
|
+
const Icon = getReviewStageIcon({
|
|
226
|
+
contentTypeHasReviewWorkflow,
|
|
227
|
+
requiredStage,
|
|
228
|
+
entryStage
|
|
229
|
+
});
|
|
230
|
+
return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 1, width: "100%", padding: 5, children: [
|
|
231
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
|
|
232
|
+
/* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: formatMessage({
|
|
233
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage",
|
|
234
|
+
defaultMessage: "Review stage"
|
|
235
|
+
}) }),
|
|
236
|
+
Icon
|
|
237
|
+
] }),
|
|
238
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", children: getReviewStageMessage({
|
|
239
|
+
contentTypeHasReviewWorkflow,
|
|
240
|
+
requiredStage,
|
|
241
|
+
entryStage,
|
|
242
|
+
formatMessage
|
|
243
|
+
}) })
|
|
244
|
+
] });
|
|
245
|
+
};
|
|
246
|
+
const EntryValidationPopover = ({
|
|
247
|
+
schema,
|
|
248
|
+
entry,
|
|
249
|
+
status,
|
|
250
|
+
action
|
|
251
|
+
}) => {
|
|
252
|
+
const { validate, isLoading } = unstable_useDocument(
|
|
253
|
+
{
|
|
254
|
+
collectionType: schema?.kind ?? "",
|
|
255
|
+
model: schema?.uid ?? ""
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
// 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
|
|
259
|
+
skip: true
|
|
260
|
+
}
|
|
261
|
+
);
|
|
262
|
+
const errors = isLoading ? null : validate(entry);
|
|
263
|
+
const hasErrors = errors ? Object.keys(errors).length > 0 : false;
|
|
264
|
+
const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;
|
|
265
|
+
const requiredStage = schema?.stageRequiredToPublish;
|
|
266
|
+
const entryStage = entry.strapi_stage;
|
|
267
|
+
if (isLoading) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
return /* @__PURE__ */ jsxs(Popover.Root, { children: [
|
|
271
|
+
/* @__PURE__ */ jsx(
|
|
272
|
+
EntryStatusTrigger,
|
|
273
|
+
{
|
|
274
|
+
action,
|
|
275
|
+
status,
|
|
276
|
+
hasErrors,
|
|
277
|
+
requiredStage,
|
|
278
|
+
entryStage
|
|
279
|
+
}
|
|
280
|
+
),
|
|
281
|
+
/* @__PURE__ */ jsx(Popover.Content, { children: /* @__PURE__ */ jsxs(StyledPopoverFlex, { direction: "column", children: [
|
|
282
|
+
/* @__PURE__ */ jsx(
|
|
283
|
+
FieldsValidation,
|
|
284
|
+
{
|
|
285
|
+
hasErrors,
|
|
286
|
+
errors,
|
|
287
|
+
contentTypeUid: schema?.uid,
|
|
288
|
+
kind: schema?.kind,
|
|
289
|
+
documentId: entry.documentId,
|
|
290
|
+
locale: entry.locale
|
|
291
|
+
}
|
|
292
|
+
),
|
|
293
|
+
/* @__PURE__ */ jsx(
|
|
294
|
+
ReviewStageValidation,
|
|
295
|
+
{
|
|
296
|
+
contentTypeHasReviewWorkflow,
|
|
297
|
+
requiredStage,
|
|
298
|
+
entryStage
|
|
299
|
+
}
|
|
300
|
+
)
|
|
301
|
+
] }) })
|
|
302
|
+
] });
|
|
303
|
+
};
|
|
19
304
|
const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
20
305
|
const RelativeTime$1 = React.forwardRef(
|
|
21
306
|
({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
|
|
@@ -46,28 +331,9 @@ const RelativeTime$1 = React.forwardRef(
|
|
|
46
331
|
);
|
|
47
332
|
}
|
|
48
333
|
);
|
|
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
334
|
const ReleaseModal = ({
|
|
70
335
|
handleClose,
|
|
336
|
+
open,
|
|
71
337
|
handleSubmit,
|
|
72
338
|
initialValues,
|
|
73
339
|
isLoading = false
|
|
@@ -91,8 +357,8 @@ const ReleaseModal = ({
|
|
|
91
357
|
);
|
|
92
358
|
return currentTimezone?.value || systemTimezone.value;
|
|
93
359
|
};
|
|
94
|
-
return /* @__PURE__ */
|
|
95
|
-
/* @__PURE__ */ jsx(
|
|
360
|
+
return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
|
|
361
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
|
|
96
362
|
{
|
|
97
363
|
id: "content-releases.modal.title",
|
|
98
364
|
defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
|
|
@@ -115,133 +381,143 @@ const ReleaseModal = ({
|
|
|
115
381
|
},
|
|
116
382
|
validationSchema: RELEASE_SCHEMA,
|
|
117
383
|
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: () => {
|
|
384
|
+
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
385
|
+
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
386
|
+
/* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
|
387
|
+
/* @__PURE__ */ jsxs(
|
|
388
|
+
Field.Root,
|
|
389
|
+
{
|
|
390
|
+
name: "name",
|
|
391
|
+
error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
|
|
392
|
+
required: true,
|
|
393
|
+
children: [
|
|
394
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
395
|
+
id: "content-releases.modal.form.input.label.release-name",
|
|
396
|
+
defaultMessage: "Name"
|
|
397
|
+
}) }),
|
|
398
|
+
/* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
|
|
399
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
400
|
+
]
|
|
401
|
+
}
|
|
402
|
+
),
|
|
403
|
+
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
404
|
+
Checkbox,
|
|
405
|
+
{
|
|
406
|
+
name: "isScheduled",
|
|
407
|
+
checked: values.isScheduled,
|
|
408
|
+
onCheckedChange: (checked) => {
|
|
409
|
+
setFieldValue("isScheduled", checked);
|
|
410
|
+
if (!checked) {
|
|
184
411
|
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
412
|
setFieldValue("time", "");
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
413
|
+
setFieldValue("timezone", null);
|
|
414
|
+
} else {
|
|
415
|
+
setFieldValue("date", initialValues.date);
|
|
416
|
+
setFieldValue("time", initialValues.time);
|
|
417
|
+
setFieldValue(
|
|
418
|
+
"timezone",
|
|
419
|
+
initialValues.timezone ?? systemTimezone?.value
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
children: /* @__PURE__ */ jsx(
|
|
424
|
+
Typography,
|
|
425
|
+
{
|
|
426
|
+
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
427
|
+
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
428
|
+
children: formatMessage({
|
|
429
|
+
id: "modal.form.input.label.schedule-release",
|
|
430
|
+
defaultMessage: "Schedule release"
|
|
431
|
+
})
|
|
432
|
+
}
|
|
433
|
+
)
|
|
434
|
+
}
|
|
435
|
+
) }),
|
|
436
|
+
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
437
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
438
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
|
|
439
|
+
Field.Root,
|
|
440
|
+
{
|
|
441
|
+
name: "date",
|
|
442
|
+
error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
|
|
443
|
+
required: true,
|
|
444
|
+
children: [
|
|
445
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
446
|
+
id: "content-releases.modal.form.input.label.date",
|
|
447
|
+
defaultMessage: "Date"
|
|
448
|
+
}) }),
|
|
449
|
+
/* @__PURE__ */ jsx(
|
|
450
|
+
DatePicker,
|
|
451
|
+
{
|
|
452
|
+
onChange: (date) => {
|
|
453
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
454
|
+
setFieldValue("date", isoFormatDate);
|
|
455
|
+
},
|
|
456
|
+
clearLabel: formatMessage({
|
|
457
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
458
|
+
defaultMessage: "Clear"
|
|
459
|
+
}),
|
|
460
|
+
onClear: () => {
|
|
461
|
+
setFieldValue("date", null);
|
|
462
|
+
},
|
|
463
|
+
value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
|
|
464
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
465
|
+
}
|
|
466
|
+
),
|
|
467
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
468
|
+
]
|
|
469
|
+
}
|
|
470
|
+
) }),
|
|
471
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
|
|
472
|
+
Field.Root,
|
|
473
|
+
{
|
|
474
|
+
name: "time",
|
|
475
|
+
error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
|
|
476
|
+
required: true,
|
|
477
|
+
children: [
|
|
478
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
479
|
+
id: "content-releases.modal.form.input.label.time",
|
|
480
|
+
defaultMessage: "Time"
|
|
481
|
+
}) }),
|
|
482
|
+
/* @__PURE__ */ jsx(
|
|
483
|
+
TimePicker,
|
|
484
|
+
{
|
|
485
|
+
onChange: (time) => {
|
|
486
|
+
setFieldValue("time", time);
|
|
487
|
+
},
|
|
488
|
+
clearLabel: formatMessage({
|
|
489
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
490
|
+
defaultMessage: "Clear"
|
|
491
|
+
}),
|
|
492
|
+
onClear: () => {
|
|
493
|
+
setFieldValue("time", "");
|
|
494
|
+
},
|
|
495
|
+
value: values.time || void 0
|
|
496
|
+
}
|
|
497
|
+
),
|
|
498
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
499
|
+
]
|
|
500
|
+
}
|
|
501
|
+
) })
|
|
502
|
+
] }),
|
|
503
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
504
|
+
] })
|
|
505
|
+
] }) }),
|
|
506
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
507
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
|
|
508
|
+
/* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
223
509
|
{
|
|
224
510
|
id: "content-releases.modal.form.button.submit",
|
|
225
511
|
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
226
512
|
},
|
|
227
513
|
{ isCreatingRelease }
|
|
228
514
|
) })
|
|
229
|
-
}
|
|
230
|
-
)
|
|
231
|
-
|
|
515
|
+
] })
|
|
516
|
+
] });
|
|
517
|
+
}
|
|
232
518
|
}
|
|
233
519
|
)
|
|
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 };
|
|
520
|
+
] }) });
|
|
245
521
|
};
|
|
246
522
|
const TimezoneComponent = ({ timezoneOptions }) => {
|
|
247
523
|
const { values, errors, setFieldValue } = useFormikContext();
|
|
@@ -257,34 +533,45 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
257
533
|
}
|
|
258
534
|
}
|
|
259
535
|
}, [setFieldValue, values.date, values.timezone]);
|
|
260
|
-
return /* @__PURE__ */
|
|
261
|
-
|
|
536
|
+
return /* @__PURE__ */ jsxs(
|
|
537
|
+
Field.Root,
|
|
262
538
|
{
|
|
263
|
-
label: formatMessage({
|
|
264
|
-
id: "content-releases.modal.form.input.label.timezone",
|
|
265
|
-
defaultMessage: "Timezone"
|
|
266
|
-
}),
|
|
267
|
-
autocomplete: { type: "list", filter: "contains" },
|
|
268
539
|
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,
|
|
540
|
+
error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
|
|
281
541
|
required: true,
|
|
282
|
-
children:
|
|
542
|
+
children: [
|
|
543
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
544
|
+
id: "content-releases.modal.form.input.label.timezone",
|
|
545
|
+
defaultMessage: "Timezone"
|
|
546
|
+
}) }),
|
|
547
|
+
/* @__PURE__ */ jsx(
|
|
548
|
+
Combobox,
|
|
549
|
+
{
|
|
550
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
551
|
+
value: values.timezone || void 0,
|
|
552
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
553
|
+
onChange: (timezone) => {
|
|
554
|
+
setFieldValue("timezone", timezone);
|
|
555
|
+
},
|
|
556
|
+
onTextValueChange: (timezone) => {
|
|
557
|
+
setFieldValue("timezone", timezone);
|
|
558
|
+
},
|
|
559
|
+
onClear: () => {
|
|
560
|
+
setFieldValue("timezone", "");
|
|
561
|
+
},
|
|
562
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
563
|
+
}
|
|
564
|
+
),
|
|
565
|
+
/* @__PURE__ */ jsx(Field.Error, {})
|
|
566
|
+
]
|
|
283
567
|
}
|
|
284
568
|
);
|
|
285
569
|
};
|
|
286
570
|
const useTypedDispatch = useDispatch;
|
|
287
|
-
const
|
|
571
|
+
const isBaseQueryError = (error) => {
|
|
572
|
+
return typeof error !== "undefined" && error.name !== void 0;
|
|
573
|
+
};
|
|
574
|
+
const LinkCard = styled(Link$1)`
|
|
288
575
|
display: block;
|
|
289
576
|
`;
|
|
290
577
|
const RelativeTime = styled(RelativeTime$1)`
|
|
@@ -340,7 +627,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
340
627
|
}
|
|
341
628
|
);
|
|
342
629
|
}
|
|
343
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(
|
|
630
|
+
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
631
|
Flex,
|
|
345
632
|
{
|
|
346
633
|
direction: "column",
|
|
@@ -355,7 +642,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
355
642
|
gap: 4,
|
|
356
643
|
children: [
|
|
357
644
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
358
|
-
/* @__PURE__ */ jsx(Typography, {
|
|
645
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
359
646
|
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
360
647
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
361
648
|
defaultMessage: "Not scheduled"
|
|
@@ -376,14 +663,13 @@ const StyledAlert = styled(Alert)`
|
|
|
376
663
|
`;
|
|
377
664
|
const INITIAL_FORM_VALUES = {
|
|
378
665
|
name: "",
|
|
379
|
-
date:
|
|
666
|
+
date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
|
|
380
667
|
time: "",
|
|
381
668
|
isScheduled: true,
|
|
382
669
|
scheduledAt: null,
|
|
383
670
|
timezone: null
|
|
384
671
|
};
|
|
385
672
|
const ReleasesPage = () => {
|
|
386
|
-
const tabRef = React.useRef(null);
|
|
387
673
|
const location = useLocation();
|
|
388
674
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
389
675
|
const { toggleNotification } = useNotification();
|
|
@@ -392,6 +678,7 @@ const ReleasesPage = () => {
|
|
|
392
678
|
const { formatAPIError } = useAPIErrorHandler();
|
|
393
679
|
const [{ query }, setQuery] = useQueryParams();
|
|
394
680
|
const response = useGetReleasesQuery(query);
|
|
681
|
+
const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
|
|
395
682
|
const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
|
|
396
683
|
const { getFeature } = useLicenseLimits();
|
|
397
684
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
@@ -399,9 +686,8 @@ const ReleasesPage = () => {
|
|
|
399
686
|
const {
|
|
400
687
|
allowedActions: { canCreate }
|
|
401
688
|
} = useRBAC(PERMISSIONS);
|
|
402
|
-
const { isLoading, isSuccess, isError } = response;
|
|
689
|
+
const { isLoading: isLoadingReleases, isSuccess, isError } = response;
|
|
403
690
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
404
|
-
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
405
691
|
React.useEffect(() => {
|
|
406
692
|
if (location?.state?.errors) {
|
|
407
693
|
toggleNotification({
|
|
@@ -418,27 +704,22 @@ const ReleasesPage = () => {
|
|
|
418
704
|
navigate("", { replace: true, state: null });
|
|
419
705
|
}
|
|
420
706
|
}, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
|
|
421
|
-
React.useEffect(() => {
|
|
422
|
-
if (tabRef.current) {
|
|
423
|
-
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
424
|
-
}
|
|
425
|
-
}, [activeTabIndex]);
|
|
426
707
|
const toggleAddReleaseModal = () => {
|
|
427
708
|
setReleaseModalShown((prev) => !prev);
|
|
428
709
|
};
|
|
429
|
-
if (
|
|
710
|
+
if (isLoadingReleases || isLoadingSettings) {
|
|
430
711
|
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
431
712
|
}
|
|
432
713
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
433
714
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
434
|
-
const handleTabChange = (
|
|
715
|
+
const handleTabChange = (tabValue) => {
|
|
435
716
|
setQuery({
|
|
436
717
|
...query,
|
|
437
718
|
page: 1,
|
|
438
719
|
pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
|
|
439
720
|
filters: {
|
|
440
721
|
releasedAt: {
|
|
441
|
-
$notNull:
|
|
722
|
+
$notNull: tabValue !== "pending"
|
|
442
723
|
}
|
|
443
724
|
}
|
|
444
725
|
});
|
|
@@ -459,7 +740,7 @@ const ReleasesPage = () => {
|
|
|
459
740
|
});
|
|
460
741
|
trackUsage("didCreateRelease");
|
|
461
742
|
navigate(response2.data.data.id.toString());
|
|
462
|
-
} else if (
|
|
743
|
+
} else if (isFetchError(response2.error)) {
|
|
463
744
|
toggleNotification({
|
|
464
745
|
type: "danger",
|
|
465
746
|
message: formatAPIError(response2.error)
|
|
@@ -471,7 +752,7 @@ const ReleasesPage = () => {
|
|
|
471
752
|
});
|
|
472
753
|
}
|
|
473
754
|
};
|
|
474
|
-
return /* @__PURE__ */ jsxs(Main, { "aria-busy":
|
|
755
|
+
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
|
|
475
756
|
/* @__PURE__ */ jsx(
|
|
476
757
|
Layouts.Header,
|
|
477
758
|
{
|
|
@@ -502,7 +783,7 @@ const ReleasesPage = () => {
|
|
|
502
783
|
StyledAlert,
|
|
503
784
|
{
|
|
504
785
|
marginBottom: 6,
|
|
505
|
-
action: /* @__PURE__ */ jsx(Link, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
|
|
786
|
+
action: /* @__PURE__ */ jsx(Link$1, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
|
|
506
787
|
id: "content-releases.pages.Releases.max-limit-reached.action",
|
|
507
788
|
defaultMessage: "Explore plans"
|
|
508
789
|
}) }),
|
|
@@ -522,21 +803,17 @@ const ReleasesPage = () => {
|
|
|
522
803
|
})
|
|
523
804
|
}
|
|
524
805
|
),
|
|
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(
|
|
806
|
+
/* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
|
|
807
|
+
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
808
|
+
/* @__PURE__ */ jsxs(
|
|
809
|
+
Tabs.List,
|
|
810
|
+
{
|
|
811
|
+
"aria-label": formatMessage({
|
|
812
|
+
id: "content-releases.pages.Releases.tab-group.label",
|
|
813
|
+
defaultMessage: "Releases list"
|
|
814
|
+
}),
|
|
815
|
+
children: [
|
|
816
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
|
|
540
817
|
{
|
|
541
818
|
id: "content-releases.pages.Releases.tab.pending",
|
|
542
819
|
defaultMessage: "Pending ({count})"
|
|
@@ -545,34 +822,32 @@ const ReleasesPage = () => {
|
|
|
545
822
|
count: totalPendingReleases
|
|
546
823
|
}
|
|
547
824
|
) }),
|
|
548
|
-
/* @__PURE__ */ jsx(
|
|
825
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
|
|
549
826
|
id: "content-releases.pages.Releases.tab.done",
|
|
550
827
|
defaultMessage: "Done"
|
|
551
828
|
}) })
|
|
552
|
-
]
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
}
|
|
575
|
-
),
|
|
829
|
+
]
|
|
830
|
+
}
|
|
831
|
+
),
|
|
832
|
+
/* @__PURE__ */ jsx(Divider, {})
|
|
833
|
+
] }),
|
|
834
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
|
|
835
|
+
ReleasesGrid,
|
|
836
|
+
{
|
|
837
|
+
sectionTitle: "pending",
|
|
838
|
+
releases: response?.currentData?.data,
|
|
839
|
+
isError
|
|
840
|
+
}
|
|
841
|
+
) }),
|
|
842
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
|
|
843
|
+
ReleasesGrid,
|
|
844
|
+
{
|
|
845
|
+
sectionTitle: "done",
|
|
846
|
+
releases: response?.currentData?.data,
|
|
847
|
+
isError
|
|
848
|
+
}
|
|
849
|
+
) })
|
|
850
|
+
] }),
|
|
576
851
|
/* @__PURE__ */ jsxs(
|
|
577
852
|
Pagination.Root,
|
|
578
853
|
{
|
|
@@ -585,13 +860,17 @@ const ReleasesPage = () => {
|
|
|
585
860
|
}
|
|
586
861
|
)
|
|
587
862
|
] }) }),
|
|
588
|
-
|
|
863
|
+
/* @__PURE__ */ jsx(
|
|
589
864
|
ReleaseModal,
|
|
590
865
|
{
|
|
866
|
+
open: releaseModalShown,
|
|
591
867
|
handleClose: toggleAddReleaseModal,
|
|
592
868
|
handleSubmit: handleAddRelease,
|
|
593
869
|
isLoading: isSubmittingForm,
|
|
594
|
-
initialValues:
|
|
870
|
+
initialValues: {
|
|
871
|
+
...INITIAL_FORM_VALUES,
|
|
872
|
+
timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
|
|
873
|
+
}
|
|
595
874
|
}
|
|
596
875
|
)
|
|
597
876
|
] });
|
|
@@ -602,7 +881,7 @@ const ReleaseInfoWrapper = styled(Flex)`
|
|
|
602
881
|
border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
|
|
603
882
|
border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
|
|
604
883
|
`;
|
|
605
|
-
const StyledMenuItem = styled(
|
|
884
|
+
const StyledMenuItem = styled(MenuItem)`
|
|
606
885
|
svg path {
|
|
607
886
|
fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
|
|
608
887
|
}
|
|
@@ -611,73 +890,23 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
611
890
|
}
|
|
612
891
|
|
|
613
892
|
&:hover {
|
|
614
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
893
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
615
894
|
}
|
|
616
895
|
`;
|
|
617
896
|
const PencilIcon = styled(Pencil)`
|
|
618
|
-
width: ${({ theme }) => theme.spaces[
|
|
619
|
-
height: ${({ theme }) => theme.spaces[
|
|
897
|
+
width: ${({ theme }) => theme.spaces[4]};
|
|
898
|
+
height: ${({ theme }) => theme.spaces[4]};
|
|
620
899
|
path {
|
|
621
900
|
fill: ${({ theme }) => theme.colors.neutral600};
|
|
622
901
|
}
|
|
623
902
|
`;
|
|
624
903
|
const TrashIcon = styled(Trash)`
|
|
625
|
-
width: ${({ theme }) => theme.spaces[
|
|
626
|
-
height: ${({ theme }) => theme.spaces[
|
|
904
|
+
width: ${({ theme }) => theme.spaces[4]};
|
|
905
|
+
height: ${({ theme }) => theme.spaces[4]};
|
|
627
906
|
path {
|
|
628
907
|
fill: ${({ theme }) => theme.colors.danger600};
|
|
629
908
|
}
|
|
630
909
|
`;
|
|
631
|
-
const TypographyMaxWidth = styled(Typography)`
|
|
632
|
-
max-width: 300px;
|
|
633
|
-
`;
|
|
634
|
-
const EntryValidationText = ({ action, schema, entry }) => {
|
|
635
|
-
const { formatMessage } = useIntl();
|
|
636
|
-
const { validate } = unstable_useDocument(
|
|
637
|
-
{
|
|
638
|
-
collectionType: schema?.kind ?? "",
|
|
639
|
-
model: schema?.uid ?? ""
|
|
640
|
-
},
|
|
641
|
-
{
|
|
642
|
-
skip: !schema
|
|
643
|
-
}
|
|
644
|
-
);
|
|
645
|
-
const errors = validate(entry) ?? {};
|
|
646
|
-
if (Object.keys(errors).length > 0) {
|
|
647
|
-
const validationErrorsMessages = Object.entries(errors).map(
|
|
648
|
-
([key, value]) => formatMessage(
|
|
649
|
-
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
650
|
-
{ field: key }
|
|
651
|
-
)
|
|
652
|
-
).join(" ");
|
|
653
|
-
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
654
|
-
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
655
|
-
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
656
|
-
] });
|
|
657
|
-
}
|
|
658
|
-
if (action == "publish") {
|
|
659
|
-
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
660
|
-
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
661
|
-
entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
662
|
-
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
663
|
-
defaultMessage: "Already published"
|
|
664
|
-
}) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
665
|
-
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
|
|
666
|
-
defaultMessage: "Ready to publish"
|
|
667
|
-
}) })
|
|
668
|
-
] });
|
|
669
|
-
}
|
|
670
|
-
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
671
|
-
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
672
|
-
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
673
|
-
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
674
|
-
defaultMessage: "Already unpublished"
|
|
675
|
-
}) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
676
|
-
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
|
|
677
|
-
defaultMessage: "Ready to unpublish"
|
|
678
|
-
}) })
|
|
679
|
-
] });
|
|
680
|
-
};
|
|
681
910
|
const ReleaseDetailsLayout = ({
|
|
682
911
|
toggleEditReleaseModal,
|
|
683
912
|
toggleWarningSubmit,
|
|
@@ -688,7 +917,6 @@ const ReleaseDetailsLayout = ({
|
|
|
688
917
|
const {
|
|
689
918
|
data,
|
|
690
919
|
isLoading: isLoadingDetails,
|
|
691
|
-
isError,
|
|
692
920
|
error
|
|
693
921
|
} = useGetReleaseQuery(
|
|
694
922
|
{ id: releaseId },
|
|
@@ -720,7 +948,7 @@ const ReleaseDetailsLayout = ({
|
|
|
720
948
|
totalPublishedEntries,
|
|
721
949
|
totalUnpublishedEntries
|
|
722
950
|
});
|
|
723
|
-
} else if (
|
|
951
|
+
} else if (isFetchError(response.error)) {
|
|
724
952
|
toggleNotification({
|
|
725
953
|
type: "danger",
|
|
726
954
|
message: formatAPIError(response.error)
|
|
@@ -755,7 +983,7 @@ const ReleaseDetailsLayout = ({
|
|
|
755
983
|
if (isLoadingDetails) {
|
|
756
984
|
return /* @__PURE__ */ jsx(Page.Loading, {});
|
|
757
985
|
}
|
|
758
|
-
if (
|
|
986
|
+
if (isBaseQueryError(error) && "code" in error || !release) {
|
|
759
987
|
return /* @__PURE__ */ jsx(
|
|
760
988
|
Navigate,
|
|
761
989
|
{
|
|
@@ -763,6 +991,7 @@ const ReleaseDetailsLayout = ({
|
|
|
763
991
|
state: {
|
|
764
992
|
errors: [
|
|
765
993
|
{
|
|
994
|
+
// @ts-expect-error – TODO: fix this weird error flow
|
|
766
995
|
code: error?.code
|
|
767
996
|
}
|
|
768
997
|
]
|
|
@@ -809,86 +1038,73 @@ const ReleaseDetailsLayout = ({
|
|
|
809
1038
|
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
810
1039
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
811
1040
|
] }),
|
|
812
|
-
navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
|
|
1041
|
+
navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
|
|
813
1042
|
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
|
-
|
|
1043
|
+
/* @__PURE__ */ jsxs(
|
|
1044
|
+
SimpleMenuButton,
|
|
1045
|
+
{
|
|
1046
|
+
label: /* @__PURE__ */ jsx(More, {}),
|
|
1047
|
+
variant: "tertiary",
|
|
1048
|
+
endIcon: null,
|
|
1049
|
+
paddingLeft: "7px",
|
|
1050
|
+
paddingRight: "7px",
|
|
1051
|
+
"aria-label": formatMessage({
|
|
1052
|
+
id: "content-releases.header.actions.open-release-actions",
|
|
1053
|
+
defaultMessage: "Release edit and delete menu"
|
|
1054
|
+
}),
|
|
1055
|
+
popoverPlacement: "bottom-end",
|
|
1056
|
+
children: [
|
|
1057
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
1058
|
+
/* @__PURE__ */ jsx(PencilIcon, {}),
|
|
1059
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
|
|
1060
|
+
id: "content-releases.header.actions.edit",
|
|
1061
|
+
defaultMessage: "Edit"
|
|
1062
|
+
}) })
|
|
1063
|
+
] }) }),
|
|
1064
|
+
/* @__PURE__ */ jsx(
|
|
1065
|
+
StyledMenuItem,
|
|
1066
|
+
{
|
|
1067
|
+
disabled: !canDelete,
|
|
1068
|
+
onSelect: toggleWarningSubmit,
|
|
1069
|
+
$variant: "danger",
|
|
1070
|
+
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
1071
|
+
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
1072
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
1073
|
+
id: "content-releases.header.actions.delete",
|
|
1074
|
+
defaultMessage: "Delete"
|
|
844
1075
|
}) })
|
|
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
1076
|
] })
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
1077
|
+
}
|
|
1078
|
+
),
|
|
1079
|
+
/* @__PURE__ */ jsxs(
|
|
1080
|
+
ReleaseInfoWrapper,
|
|
1081
|
+
{
|
|
1082
|
+
direction: "column",
|
|
1083
|
+
justifyContent: "center",
|
|
1084
|
+
alignItems: "flex-start",
|
|
1085
|
+
gap: 1,
|
|
1086
|
+
padding: 4,
|
|
1087
|
+
children: [
|
|
1088
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
1089
|
+
id: "content-releases.header.actions.created",
|
|
1090
|
+
defaultMessage: "Created"
|
|
1091
|
+
}) }),
|
|
1092
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
1093
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
1094
|
+
formatMessage(
|
|
1095
|
+
{
|
|
1096
|
+
id: "content-releases.header.actions.created.description",
|
|
1097
|
+
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
1098
|
+
},
|
|
1099
|
+
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
1100
|
+
)
|
|
1101
|
+
] })
|
|
1102
|
+
]
|
|
1103
|
+
}
|
|
1104
|
+
)
|
|
1105
|
+
]
|
|
1106
|
+
}
|
|
1107
|
+
),
|
|
892
1108
|
/* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
|
|
893
1109
|
id: "content-releases.header.actions.refresh",
|
|
894
1110
|
defaultMessage: "Refresh"
|
|
@@ -913,6 +1129,11 @@ const ReleaseDetailsLayout = ({
|
|
|
913
1129
|
children
|
|
914
1130
|
] });
|
|
915
1131
|
};
|
|
1132
|
+
const SimpleMenuButton = styled(SimpleMenu)`
|
|
1133
|
+
& > span {
|
|
1134
|
+
display: flex;
|
|
1135
|
+
}
|
|
1136
|
+
`;
|
|
916
1137
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
917
1138
|
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
918
1139
|
const getGroupByOptionLabel = (value) => {
|
|
@@ -941,26 +1162,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
941
1162
|
const {
|
|
942
1163
|
data: releaseData,
|
|
943
1164
|
isLoading: isReleaseLoading,
|
|
944
|
-
isError: isReleaseError,
|
|
945
1165
|
error: releaseError
|
|
946
1166
|
} = useGetReleaseQuery({ id: releaseId });
|
|
947
1167
|
const {
|
|
948
1168
|
allowedActions: { canUpdate }
|
|
949
1169
|
} = useRBAC(PERMISSIONS);
|
|
950
1170
|
const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
|
|
951
|
-
const { hasI18nEnabled } = runHookWaterfall(
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
);
|
|
1171
|
+
const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
|
|
1172
|
+
displayedHeaders: [
|
|
1173
|
+
{
|
|
1174
|
+
label: {
|
|
1175
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1176
|
+
defaultMessage: "name"
|
|
1177
|
+
},
|
|
1178
|
+
name: "name"
|
|
1179
|
+
}
|
|
1180
|
+
],
|
|
1181
|
+
hasI18nEnabled: false
|
|
1182
|
+
});
|
|
964
1183
|
const release = releaseData?.data;
|
|
965
1184
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
966
1185
|
const {
|
|
@@ -989,7 +1208,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
989
1208
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
990
1209
|
});
|
|
991
1210
|
if ("error" in response) {
|
|
992
|
-
if (
|
|
1211
|
+
if (isFetchError(response.error)) {
|
|
993
1212
|
toggleNotification({
|
|
994
1213
|
type: "danger",
|
|
995
1214
|
message: formatAPIError(response.error)
|
|
@@ -1008,15 +1227,15 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1008
1227
|
const releaseActions = data?.data;
|
|
1009
1228
|
const releaseMeta = data?.meta;
|
|
1010
1229
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
1011
|
-
|
|
1012
|
-
if (
|
|
1230
|
+
releaseMeta?.components || {};
|
|
1231
|
+
if (isBaseQueryError(releaseError) || !release) {
|
|
1013
1232
|
const errorsArray = [];
|
|
1014
|
-
if (releaseError) {
|
|
1233
|
+
if (releaseError && "code" in releaseError) {
|
|
1015
1234
|
errorsArray.push({
|
|
1016
1235
|
code: releaseError.code
|
|
1017
1236
|
});
|
|
1018
1237
|
}
|
|
1019
|
-
if (releaseActionsError) {
|
|
1238
|
+
if (releaseActionsError && "code" in releaseActionsError) {
|
|
1020
1239
|
errorsArray.push({
|
|
1021
1240
|
code: releaseActionsError.code
|
|
1022
1241
|
});
|
|
@@ -1041,7 +1260,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1041
1260
|
action: /* @__PURE__ */ jsx(
|
|
1042
1261
|
LinkButton,
|
|
1043
1262
|
{
|
|
1044
|
-
|
|
1263
|
+
tag: Link,
|
|
1045
1264
|
to: {
|
|
1046
1265
|
pathname: "/content-manager"
|
|
1047
1266
|
},
|
|
@@ -1066,34 +1285,27 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1066
1285
|
defaultMessage: "Group by"
|
|
1067
1286
|
});
|
|
1068
1287
|
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
|
-
},
|
|
1288
|
+
...displayedHeaders,
|
|
1077
1289
|
{
|
|
1078
|
-
label:
|
|
1290
|
+
label: {
|
|
1079
1291
|
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1080
1292
|
defaultMessage: "content-type"
|
|
1081
|
-
}
|
|
1293
|
+
},
|
|
1082
1294
|
name: "content-type"
|
|
1083
1295
|
},
|
|
1084
1296
|
{
|
|
1085
|
-
label:
|
|
1297
|
+
label: {
|
|
1086
1298
|
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1087
1299
|
defaultMessage: "action"
|
|
1088
|
-
}
|
|
1300
|
+
},
|
|
1089
1301
|
name: "action"
|
|
1090
1302
|
},
|
|
1091
1303
|
...!release.releasedAt ? [
|
|
1092
1304
|
{
|
|
1093
|
-
label:
|
|
1305
|
+
label: {
|
|
1094
1306
|
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1095
1307
|
defaultMessage: "status"
|
|
1096
|
-
}
|
|
1308
|
+
},
|
|
1097
1309
|
name: "status"
|
|
1098
1310
|
}
|
|
1099
1311
|
] : []
|
|
@@ -1131,10 +1343,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1131
1343
|
headers,
|
|
1132
1344
|
isLoading: isLoading || isFetching,
|
|
1133
1345
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1134
|
-
/* @__PURE__ */ jsx(Table.Head, { children: headers.map((
|
|
1346
|
+
/* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
|
|
1135
1347
|
/* @__PURE__ */ jsx(Table.Loading, {}),
|
|
1136
1348
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1137
|
-
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1349
|
+
({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1138
1350
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1139
1351
|
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1140
1352
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
@@ -1158,12 +1370,12 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1158
1370
|
) }),
|
|
1159
1371
|
!release.releasedAt && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1160
1372
|
/* @__PURE__ */ jsx(Td, { width: "20%", minWidth: "200px", children: /* @__PURE__ */ jsx(
|
|
1161
|
-
|
|
1373
|
+
EntryValidationPopover,
|
|
1162
1374
|
{
|
|
1163
1375
|
action: type,
|
|
1164
1376
|
schema: contentTypes?.[contentType.uid],
|
|
1165
|
-
|
|
1166
|
-
|
|
1377
|
+
entry,
|
|
1378
|
+
status
|
|
1167
1379
|
}
|
|
1168
1380
|
) }),
|
|
1169
1381
|
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
|
|
@@ -1171,7 +1383,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1171
1383
|
ReleaseActionMenu.ReleaseActionEntryLinkItem,
|
|
1172
1384
|
{
|
|
1173
1385
|
contentTypeUid: contentType.uid,
|
|
1174
|
-
|
|
1386
|
+
documentId: entry.documentId,
|
|
1175
1387
|
locale: locale?.code
|
|
1176
1388
|
}
|
|
1177
1389
|
),
|
|
@@ -1221,13 +1433,24 @@ const ReleaseDetailsPage = () => {
|
|
|
1221
1433
|
skip: !releaseId
|
|
1222
1434
|
}
|
|
1223
1435
|
);
|
|
1436
|
+
const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
|
|
1224
1437
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1225
1438
|
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1226
1439
|
const toggleEditReleaseModal = () => {
|
|
1227
1440
|
setReleaseModalShown((prev) => !prev);
|
|
1228
1441
|
};
|
|
1442
|
+
const getTimezoneValue = () => {
|
|
1443
|
+
if (releaseData?.timezone) {
|
|
1444
|
+
return releaseData.timezone;
|
|
1445
|
+
} else {
|
|
1446
|
+
if (dataTimezone?.data.defaultTimezone) {
|
|
1447
|
+
return dataTimezone.data.defaultTimezone;
|
|
1448
|
+
}
|
|
1449
|
+
return null;
|
|
1450
|
+
}
|
|
1451
|
+
};
|
|
1229
1452
|
const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
|
|
1230
|
-
if (isLoadingDetails) {
|
|
1453
|
+
if (isLoadingDetails || isLoadingTimezone) {
|
|
1231
1454
|
return /* @__PURE__ */ jsx(
|
|
1232
1455
|
ReleaseDetailsLayout,
|
|
1233
1456
|
{
|
|
@@ -1242,10 +1465,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1242
1465
|
}
|
|
1243
1466
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1244
1467
|
const title = releaseData?.name || "";
|
|
1245
|
-
const timezone =
|
|
1468
|
+
const timezone = getTimezoneValue();
|
|
1246
1469
|
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") : "";
|
|
1470
|
+
const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
|
|
1471
|
+
const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
|
|
1249
1472
|
const handleEditRelease = async (values) => {
|
|
1250
1473
|
const response = await updateRelease({
|
|
1251
1474
|
id: releaseId,
|
|
@@ -1262,7 +1485,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1262
1485
|
})
|
|
1263
1486
|
});
|
|
1264
1487
|
toggleEditReleaseModal();
|
|
1265
|
-
} else if (
|
|
1488
|
+
} else if (isFetchError(response.error)) {
|
|
1266
1489
|
toggleNotification({
|
|
1267
1490
|
type: "danger",
|
|
1268
1491
|
message: formatAPIError(response.error)
|
|
@@ -1280,7 +1503,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1280
1503
|
});
|
|
1281
1504
|
if ("data" in response) {
|
|
1282
1505
|
navigate("..");
|
|
1283
|
-
} else if (
|
|
1506
|
+
} else if (isFetchError(response.error)) {
|
|
1284
1507
|
toggleNotification({
|
|
1285
1508
|
type: "danger",
|
|
1286
1509
|
message: formatAPIError(response.error)
|
|
@@ -1299,9 +1522,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1299
1522
|
toggleWarningSubmit,
|
|
1300
1523
|
children: [
|
|
1301
1524
|
/* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
|
|
1302
|
-
|
|
1525
|
+
/* @__PURE__ */ jsx(
|
|
1303
1526
|
ReleaseModal,
|
|
1304
1527
|
{
|
|
1528
|
+
open: releaseModalShown,
|
|
1305
1529
|
handleClose: toggleEditReleaseModal,
|
|
1306
1530
|
handleSubmit: handleEditRelease,
|
|
1307
1531
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1315,18 +1539,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1315
1539
|
}
|
|
1316
1540
|
}
|
|
1317
1541
|
),
|
|
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
|
-
)
|
|
1542
|
+
/* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
|
|
1543
|
+
id: "content-releases.dialog.confirmation-message",
|
|
1544
|
+
defaultMessage: "Are you sure you want to delete this release?"
|
|
1545
|
+
}) }) })
|
|
1330
1546
|
]
|
|
1331
1547
|
}
|
|
1332
1548
|
);
|
|
@@ -1340,4 +1556,4 @@ const App = () => {
|
|
|
1340
1556
|
export {
|
|
1341
1557
|
App
|
|
1342
1558
|
};
|
|
1343
|
-
//# sourceMappingURL=App-
|
|
1559
|
+
//# sourceMappingURL=App-FQyYFBJT.mjs.map
|