@strapi/content-releases 0.0.0-experimental.da85533897155e719d784f0271223c866d2f69ab → 0.0.0-experimental.dca319db78ab45784bcdb153490e644df56aabaf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{App-DpoC8s97.js → App-dLXY5ei3.js} +575 -599
- package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
- package/dist/_chunks/{App-B4mkcLmw.mjs → App-jrh58sXY.mjs} +554 -580
- package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-_MxP6-Dt.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +7 -8
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Be3acS2L.js → PurchaseContentReleases-bpIYXOfu.js} +6 -7
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
- package/dist/_chunks/{en-CmYoEnA7.js → en-HrREghh3.js} +2 -9
- package/dist/_chunks/en-HrREghh3.js.map +1 -0
- package/dist/_chunks/{en-D0yVZFqf.mjs → en-ltT1TlKQ.mjs} +2 -9
- package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
- package/dist/_chunks/index-CVO0Rqdm.js +1336 -0
- package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
- package/dist/_chunks/index-PiOGBETy.mjs +1315 -0
- package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
- package/dist/admin/index.js +15 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +16 -2
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/index.js +646 -809
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +646 -810
- package/dist/server/index.mjs.map +1 -1
- package/package.json +38 -31
- package/dist/_chunks/App-B4mkcLmw.mjs.map +0 -1
- package/dist/_chunks/App-DpoC8s97.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
- package/dist/_chunks/ReleasesSettingsPage-B89WWWJf.js +0 -178
- package/dist/_chunks/ReleasesSettingsPage-B89WWWJf.js.map +0 -1
- package/dist/_chunks/ReleasesSettingsPage-DfL6yxLG.mjs +0 -178
- package/dist/_chunks/ReleasesSettingsPage-DfL6yxLG.mjs.map +0 -1
- package/dist/_chunks/en-CmYoEnA7.js.map +0 -1
- package/dist/_chunks/en-D0yVZFqf.mjs.map +0 -1
- package/dist/_chunks/index-B3cqcIza.mjs +0 -1342
- package/dist/_chunks/index-B3cqcIza.mjs.map +0 -1
- package/dist/_chunks/index-sGcuP2hw.js +0 -1361
- package/dist/_chunks/index-sGcuP2hw.js.map +0 -1
- package/dist/_chunks/schemas-63pFihNF.mjs +0 -44
- package/dist/_chunks/schemas-63pFihNF.mjs.map +0 -1
- package/dist/_chunks/schemas-z5zp-_Gd.js +0 -62
- package/dist/_chunks/schemas-z5zp-_Gd.js.map +0 -1
- package/dist/admin/src/components/RelativeTime.d.ts +0 -28
- package/dist/admin/src/components/ReleaseAction.d.ts +0 -3
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
- package/dist/admin/src/components/ReleaseActionModal.d.ts +0 -24
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -28
- package/dist/admin/src/components/ReleaseModal.d.ts +0 -17
- package/dist/admin/src/components/ReleasesPanel.d.ts +0 -3
- package/dist/admin/src/constants.d.ts +0 -76
- package/dist/admin/src/index.d.ts +0 -3
- package/dist/admin/src/modules/hooks.d.ts +0 -7
- package/dist/admin/src/pages/App.d.ts +0 -1
- package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
- package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
- package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +0 -1
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
- package/dist/admin/src/pluginId.d.ts +0 -1
- package/dist/admin/src/services/release.d.ts +0 -112
- package/dist/admin/src/store/hooks.d.ts +0 -7
- package/dist/admin/src/utils/api.d.ts +0 -6
- package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
- package/dist/admin/src/utils/time.d.ts +0 -10
- package/dist/admin/src/validation/schemas.d.ts +0 -6
- package/dist/server/src/bootstrap.d.ts +0 -5
- package/dist/server/src/bootstrap.d.ts.map +0 -1
- package/dist/server/src/constants.d.ts +0 -21
- package/dist/server/src/constants.d.ts.map +0 -1
- package/dist/server/src/content-types/index.d.ts +0 -97
- package/dist/server/src/content-types/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/index.d.ts +0 -48
- package/dist/server/src/content-types/release/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/schema.d.ts +0 -47
- package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/index.d.ts +0 -48
- package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +0 -47
- package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
- package/dist/server/src/controllers/index.d.ts +0 -25
- package/dist/server/src/controllers/index.d.ts.map +0 -1
- package/dist/server/src/controllers/release-action.d.ts +0 -10
- package/dist/server/src/controllers/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/release.d.ts +0 -18
- package/dist/server/src/controllers/release.d.ts.map +0 -1
- package/dist/server/src/controllers/settings.d.ts +0 -11
- package/dist/server/src/controllers/settings.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release-action.d.ts +0 -14
- package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release.d.ts +0 -4
- package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/settings.d.ts +0 -3
- package/dist/server/src/controllers/validation/settings.d.ts.map +0 -1
- package/dist/server/src/destroy.d.ts +0 -5
- package/dist/server/src/destroy.d.ts.map +0 -1
- package/dist/server/src/index.d.ts +0 -2113
- package/dist/server/src/index.d.ts.map +0 -1
- package/dist/server/src/middlewares/documents.d.ts +0 -6
- package/dist/server/src/middlewares/documents.d.ts.map +0 -1
- package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +0 -9
- package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +0 -1
- package/dist/server/src/migrations/index.d.ts +0 -13
- package/dist/server/src/migrations/index.d.ts.map +0 -1
- package/dist/server/src/register.d.ts +0 -5
- package/dist/server/src/register.d.ts.map +0 -1
- package/dist/server/src/routes/index.d.ts +0 -51
- package/dist/server/src/routes/index.d.ts.map +0 -1
- package/dist/server/src/routes/release-action.d.ts +0 -18
- package/dist/server/src/routes/release-action.d.ts.map +0 -1
- package/dist/server/src/routes/release.d.ts +0 -18
- package/dist/server/src/routes/release.d.ts.map +0 -1
- package/dist/server/src/routes/settings.d.ts +0 -18
- package/dist/server/src/routes/settings.d.ts.map +0 -1
- package/dist/server/src/services/index.d.ts +0 -1826
- package/dist/server/src/services/index.d.ts.map +0 -1
- package/dist/server/src/services/release-action.d.ts +0 -36
- package/dist/server/src/services/release-action.d.ts.map +0 -1
- package/dist/server/src/services/release.d.ts +0 -31
- package/dist/server/src/services/release.d.ts.map +0 -1
- package/dist/server/src/services/scheduling.d.ts +0 -18
- package/dist/server/src/services/scheduling.d.ts.map +0 -1
- package/dist/server/src/services/settings.d.ts +0 -13
- package/dist/server/src/services/settings.d.ts.map +0 -1
- package/dist/server/src/services/validation.d.ts +0 -18
- package/dist/server/src/services/validation.d.ts.map +0 -1
- package/dist/server/src/utils/index.d.ts +0 -35
- package/dist/server/src/utils/index.d.ts.map +0 -1
- package/dist/shared/contracts/release-actions.d.ts +0 -130
- package/dist/shared/contracts/release-actions.d.ts.map +0 -1
- package/dist/shared/contracts/releases.d.ts +0 -184
- package/dist/shared/contracts/releases.d.ts.map +0 -1
- package/dist/shared/contracts/settings.d.ts +0 -39
- package/dist/shared/contracts/settings.d.ts.map +0 -1
- package/dist/shared/types.d.ts +0 -24
- package/dist/shared/types.d.ts.map +0 -1
|
@@ -1,54 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking,
|
|
3
|
-
import { useLocation,
|
|
4
|
-
import { g as
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { RelativeTime as RelativeTime$1, useNotification, useAPIErrorHandler, useQueryParams, useTracking, LoadingIndicatorPage, CheckPermissions, PageSizeURLQuery, PaginationURLQuery, AnErrorOccurred, ConfirmDialog, useRBAC, useStrapiApp, NoContent, Table, CheckPagePermissions } from "@strapi/helper-plugin";
|
|
3
|
+
import { useLocation, useHistory, useParams, Redirect, Link as Link$2, Switch, Route } from "react-router-dom";
|
|
4
|
+
import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-PiOGBETy.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
-
import { unstable_useDocument } from "@strapi/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { EmptyDocuments } from "@strapi/icons
|
|
10
|
-
import format
|
|
6
|
+
import { useLicenseLimits, unstable_useDocument } from "@strapi/admin/strapi-admin";
|
|
7
|
+
import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Alert, Main, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Link as Link$1, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
|
|
8
|
+
import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
|
|
9
|
+
import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle } from "@strapi/icons";
|
|
10
|
+
import format from "date-fns/format";
|
|
11
11
|
import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
|
|
12
12
|
import { useIntl } from "react-intl";
|
|
13
|
-
import
|
|
14
|
-
import {
|
|
13
|
+
import styled from "styled-components";
|
|
14
|
+
import { formatISO } from "date-fns";
|
|
15
15
|
import { Formik, Form, useFormikContext } from "formik";
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
role: "time",
|
|
42
|
-
title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
|
|
43
|
-
...restProps,
|
|
44
|
-
children: displayText
|
|
45
|
-
}
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
);
|
|
16
|
+
import * as yup from "yup";
|
|
17
|
+
import "@reduxjs/toolkit/query";
|
|
18
|
+
import "axios";
|
|
19
|
+
import "@reduxjs/toolkit/query/react";
|
|
20
|
+
import "react-redux";
|
|
21
|
+
const RELEASE_SCHEMA = yup.object().shape({
|
|
22
|
+
name: yup.string().trim().required(),
|
|
23
|
+
scheduledAt: yup.string().nullable(),
|
|
24
|
+
isScheduled: yup.boolean().optional(),
|
|
25
|
+
time: yup.string().when("isScheduled", {
|
|
26
|
+
is: true,
|
|
27
|
+
then: yup.string().trim().required(),
|
|
28
|
+
otherwise: yup.string().nullable()
|
|
29
|
+
}),
|
|
30
|
+
timezone: yup.string().when("isScheduled", {
|
|
31
|
+
is: true,
|
|
32
|
+
then: yup.string().required().nullable(),
|
|
33
|
+
otherwise: yup.string().nullable()
|
|
34
|
+
}),
|
|
35
|
+
date: yup.string().when("isScheduled", {
|
|
36
|
+
is: true,
|
|
37
|
+
then: yup.string().required().nullable(),
|
|
38
|
+
otherwise: yup.string().nullable()
|
|
39
|
+
})
|
|
40
|
+
}).required().noUnknown();
|
|
49
41
|
const ReleaseModal = ({
|
|
50
42
|
handleClose,
|
|
51
|
-
open,
|
|
52
43
|
handleSubmit,
|
|
53
44
|
initialValues,
|
|
54
45
|
isLoading = false
|
|
@@ -72,8 +63,8 @@ const ReleaseModal = ({
|
|
|
72
63
|
);
|
|
73
64
|
return currentTimezone?.value || systemTimezone.value;
|
|
74
65
|
};
|
|
75
|
-
return /* @__PURE__ */
|
|
76
|
-
/* @__PURE__ */ jsx(
|
|
66
|
+
return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
|
|
77
68
|
{
|
|
78
69
|
id: "content-releases.modal.title",
|
|
79
70
|
defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
|
|
@@ -96,143 +87,133 @@ const ReleaseModal = ({
|
|
|
96
87
|
},
|
|
97
88
|
validationSchema: RELEASE_SCHEMA,
|
|
98
89
|
validateOnChange: false,
|
|
99
|
-
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
100
|
-
|
|
101
|
-
/* @__PURE__ */ jsx(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
{
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
{
|
|
121
|
-
|
|
122
|
-
checked
|
|
123
|
-
|
|
124
|
-
setFieldValue("
|
|
125
|
-
|
|
90
|
+
children: ({ values, errors, handleChange, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
|
|
91
|
+
/* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
|
|
92
|
+
/* @__PURE__ */ jsx(
|
|
93
|
+
TextInput,
|
|
94
|
+
{
|
|
95
|
+
label: formatMessage({
|
|
96
|
+
id: "content-releases.modal.form.input.label.release-name",
|
|
97
|
+
defaultMessage: "Name"
|
|
98
|
+
}),
|
|
99
|
+
name: "name",
|
|
100
|
+
value: values.name,
|
|
101
|
+
error: errors.name,
|
|
102
|
+
onChange: handleChange,
|
|
103
|
+
required: true
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
|
|
107
|
+
Checkbox,
|
|
108
|
+
{
|
|
109
|
+
name: "isScheduled",
|
|
110
|
+
value: values.isScheduled,
|
|
111
|
+
onChange: (event) => {
|
|
112
|
+
setFieldValue("isScheduled", event.target.checked);
|
|
113
|
+
if (!event.target.checked) {
|
|
114
|
+
setFieldValue("date", null);
|
|
115
|
+
setFieldValue("time", "");
|
|
116
|
+
setFieldValue("timezone", null);
|
|
117
|
+
} else {
|
|
118
|
+
setFieldValue("date", initialValues.date);
|
|
119
|
+
setFieldValue("time", initialValues.time);
|
|
120
|
+
setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
children: /* @__PURE__ */ jsx(
|
|
124
|
+
Typography,
|
|
125
|
+
{
|
|
126
|
+
textColor: values.isScheduled ? "primary600" : "neutral800",
|
|
127
|
+
fontWeight: values.isScheduled ? "semiBold" : "regular",
|
|
128
|
+
children: formatMessage({
|
|
129
|
+
id: "modal.form.input.label.schedule-release",
|
|
130
|
+
defaultMessage: "Schedule release"
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
) }),
|
|
136
|
+
values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
137
|
+
/* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
|
|
138
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
139
|
+
DatePicker,
|
|
140
|
+
{
|
|
141
|
+
label: formatMessage({
|
|
142
|
+
id: "content-releases.modal.form.input.label.date",
|
|
143
|
+
defaultMessage: "Date"
|
|
144
|
+
}),
|
|
145
|
+
name: "date",
|
|
146
|
+
error: errors.date,
|
|
147
|
+
onChange: (date) => {
|
|
148
|
+
const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
|
|
149
|
+
setFieldValue("date", isoFormatDate);
|
|
150
|
+
},
|
|
151
|
+
clearLabel: formatMessage({
|
|
152
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
153
|
+
defaultMessage: "Clear"
|
|
154
|
+
}),
|
|
155
|
+
onClear: () => {
|
|
126
156
|
setFieldValue("date", null);
|
|
157
|
+
},
|
|
158
|
+
selectedDate: values.date || void 0,
|
|
159
|
+
required: true,
|
|
160
|
+
minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
|
|
161
|
+
}
|
|
162
|
+
) }),
|
|
163
|
+
/* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
164
|
+
TimePicker,
|
|
165
|
+
{
|
|
166
|
+
label: formatMessage({
|
|
167
|
+
id: "content-releases.modal.form.input.label.time",
|
|
168
|
+
defaultMessage: "Time"
|
|
169
|
+
}),
|
|
170
|
+
name: "time",
|
|
171
|
+
error: errors.time,
|
|
172
|
+
onChange: (time) => {
|
|
173
|
+
setFieldValue("time", time);
|
|
174
|
+
},
|
|
175
|
+
clearLabel: formatMessage({
|
|
176
|
+
id: "content-releases.modal.form.input.clearLabel",
|
|
177
|
+
defaultMessage: "Clear"
|
|
178
|
+
}),
|
|
179
|
+
onClear: () => {
|
|
127
180
|
setFieldValue("time", "");
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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(
|
|
181
|
+
},
|
|
182
|
+
value: values.time || void 0,
|
|
183
|
+
required: true
|
|
184
|
+
}
|
|
185
|
+
) })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
188
|
+
] })
|
|
189
|
+
] }) }),
|
|
190
|
+
/* @__PURE__ */ jsx(
|
|
191
|
+
ModalFooter,
|
|
192
|
+
{
|
|
193
|
+
startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
|
|
194
|
+
endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
224
195
|
{
|
|
225
196
|
id: "content-releases.modal.form.button.submit",
|
|
226
197
|
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
227
198
|
},
|
|
228
199
|
{ isCreatingRelease }
|
|
229
200
|
) })
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
201
|
+
}
|
|
202
|
+
)
|
|
203
|
+
] })
|
|
233
204
|
}
|
|
234
205
|
)
|
|
235
|
-
] })
|
|
206
|
+
] });
|
|
207
|
+
};
|
|
208
|
+
const getTimezones = (selectedDate) => {
|
|
209
|
+
const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
|
|
210
|
+
const utcOffset = getTimezoneOffset(timezone, selectedDate);
|
|
211
|
+
return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
|
|
212
|
+
});
|
|
213
|
+
const systemTimezone = timezoneList.find(
|
|
214
|
+
(timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
215
|
+
);
|
|
216
|
+
return { timezoneList, systemTimezone };
|
|
236
217
|
};
|
|
237
218
|
const TimezoneComponent = ({ timezoneOptions }) => {
|
|
238
219
|
const { values, errors, setFieldValue } = useFormikContext();
|
|
@@ -248,44 +229,32 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
248
229
|
}
|
|
249
230
|
}
|
|
250
231
|
}, [setFieldValue, values.date, values.timezone]);
|
|
251
|
-
return /* @__PURE__ */
|
|
252
|
-
|
|
232
|
+
return /* @__PURE__ */ jsx(
|
|
233
|
+
Combobox,
|
|
253
234
|
{
|
|
235
|
+
label: formatMessage({
|
|
236
|
+
id: "content-releases.modal.form.input.label.timezone",
|
|
237
|
+
defaultMessage: "Timezone"
|
|
238
|
+
}),
|
|
239
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
254
240
|
name: "timezone",
|
|
255
|
-
|
|
241
|
+
value: values.timezone || void 0,
|
|
242
|
+
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
243
|
+
onChange: (timezone) => {
|
|
244
|
+
setFieldValue("timezone", timezone);
|
|
245
|
+
},
|
|
246
|
+
onTextValueChange: (timezone) => {
|
|
247
|
+
setFieldValue("timezone", timezone);
|
|
248
|
+
},
|
|
249
|
+
onClear: () => {
|
|
250
|
+
setFieldValue("timezone", "");
|
|
251
|
+
},
|
|
252
|
+
error: errors.timezone,
|
|
256
253
|
required: true,
|
|
257
|
-
children:
|
|
258
|
-
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
259
|
-
id: "content-releases.modal.form.input.label.timezone",
|
|
260
|
-
defaultMessage: "Timezone"
|
|
261
|
-
}) }),
|
|
262
|
-
/* @__PURE__ */ jsx(
|
|
263
|
-
Combobox,
|
|
264
|
-
{
|
|
265
|
-
autocomplete: { type: "list", filter: "contains" },
|
|
266
|
-
value: values.timezone || void 0,
|
|
267
|
-
textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
|
|
268
|
-
onChange: (timezone) => {
|
|
269
|
-
setFieldValue("timezone", timezone);
|
|
270
|
-
},
|
|
271
|
-
onTextValueChange: (timezone) => {
|
|
272
|
-
setFieldValue("timezone", timezone);
|
|
273
|
-
},
|
|
274
|
-
onClear: () => {
|
|
275
|
-
setFieldValue("timezone", "");
|
|
276
|
-
},
|
|
277
|
-
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
278
|
-
}
|
|
279
|
-
),
|
|
280
|
-
/* @__PURE__ */ jsx(Field.Error, {})
|
|
281
|
-
]
|
|
254
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
282
255
|
}
|
|
283
256
|
);
|
|
284
257
|
};
|
|
285
|
-
const useTypedDispatch = useDispatch;
|
|
286
|
-
const isBaseQueryError = (error) => {
|
|
287
|
-
return typeof error !== "undefined" && error.name !== void 0;
|
|
288
|
-
};
|
|
289
258
|
const LinkCard = styled(Link)`
|
|
290
259
|
display: block;
|
|
291
260
|
`;
|
|
@@ -323,7 +292,7 @@ const getBadgeProps = (status) => {
|
|
|
323
292
|
const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
324
293
|
const { formatMessage } = useIntl();
|
|
325
294
|
if (isError) {
|
|
326
|
-
return /* @__PURE__ */ jsx(
|
|
295
|
+
return /* @__PURE__ */ jsx(AnErrorOccurred, {});
|
|
327
296
|
}
|
|
328
297
|
if (releases?.length === 0) {
|
|
329
298
|
return /* @__PURE__ */ jsx(
|
|
@@ -338,11 +307,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
338
307
|
target: sectionTitle
|
|
339
308
|
}
|
|
340
309
|
),
|
|
341
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "
|
|
310
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
|
|
342
311
|
}
|
|
343
312
|
);
|
|
344
313
|
}
|
|
345
|
-
return /* @__PURE__ */ jsx(Grid
|
|
314
|
+
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
|
|
346
315
|
Flex,
|
|
347
316
|
{
|
|
348
317
|
direction: "column",
|
|
@@ -357,7 +326,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
|
|
|
357
326
|
gap: 4,
|
|
358
327
|
children: [
|
|
359
328
|
/* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
|
|
360
|
-
/* @__PURE__ */ jsx(Typography, {
|
|
329
|
+
/* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
|
|
361
330
|
/* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
|
|
362
331
|
id: "content-releases.pages.Releases.not-scheduled",
|
|
363
332
|
defaultMessage: "Not scheduled"
|
|
@@ -378,35 +347,33 @@ const StyledAlert = styled(Alert)`
|
|
|
378
347
|
`;
|
|
379
348
|
const INITIAL_FORM_VALUES = {
|
|
380
349
|
name: "",
|
|
381
|
-
date:
|
|
350
|
+
date: null,
|
|
382
351
|
time: "",
|
|
383
352
|
isScheduled: true,
|
|
384
353
|
scheduledAt: null,
|
|
385
354
|
timezone: null
|
|
386
355
|
};
|
|
387
356
|
const ReleasesPage = () => {
|
|
357
|
+
const tabRef = React.useRef(null);
|
|
388
358
|
const location = useLocation();
|
|
389
359
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
390
|
-
const
|
|
360
|
+
const toggleNotification = useNotification();
|
|
391
361
|
const { formatMessage } = useIntl();
|
|
392
|
-
const
|
|
362
|
+
const { push, replace } = useHistory();
|
|
393
363
|
const { formatAPIError } = useAPIErrorHandler();
|
|
394
364
|
const [{ query }, setQuery] = useQueryParams();
|
|
395
365
|
const response = useGetReleasesQuery(query);
|
|
396
|
-
const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
|
|
397
366
|
const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
|
|
398
367
|
const { getFeature } = useLicenseLimits();
|
|
399
368
|
const { maximumReleases = 3 } = getFeature("cms-content-releases");
|
|
400
369
|
const { trackUsage } = useTracking();
|
|
401
|
-
const {
|
|
402
|
-
allowedActions: { canCreate }
|
|
403
|
-
} = useRBAC(PERMISSIONS);
|
|
404
|
-
const { isLoading: isLoadingReleases, isSuccess, isError } = response;
|
|
370
|
+
const { isLoading, isSuccess, isError } = response;
|
|
405
371
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
372
|
+
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
406
373
|
React.useEffect(() => {
|
|
407
374
|
if (location?.state?.errors) {
|
|
408
375
|
toggleNotification({
|
|
409
|
-
type: "
|
|
376
|
+
type: "warning",
|
|
410
377
|
title: formatMessage({
|
|
411
378
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
412
379
|
defaultMessage: "Your request could not be processed."
|
|
@@ -416,25 +383,30 @@ const ReleasesPage = () => {
|
|
|
416
383
|
defaultMessage: "Please try again or open another release."
|
|
417
384
|
})
|
|
418
385
|
});
|
|
419
|
-
|
|
386
|
+
replace({ state: null });
|
|
387
|
+
}
|
|
388
|
+
}, [formatMessage, location?.state?.errors, replace, toggleNotification]);
|
|
389
|
+
React.useEffect(() => {
|
|
390
|
+
if (tabRef.current) {
|
|
391
|
+
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
420
392
|
}
|
|
421
|
-
}, [
|
|
393
|
+
}, [activeTabIndex]);
|
|
422
394
|
const toggleAddReleaseModal = () => {
|
|
423
395
|
setReleaseModalShown((prev) => !prev);
|
|
424
396
|
};
|
|
425
|
-
if (
|
|
426
|
-
return /* @__PURE__ */ jsx(
|
|
397
|
+
if (isLoading) {
|
|
398
|
+
return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
427
399
|
}
|
|
428
400
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
429
401
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
430
|
-
const handleTabChange = (
|
|
402
|
+
const handleTabChange = (index) => {
|
|
431
403
|
setQuery({
|
|
432
404
|
...query,
|
|
433
405
|
page: 1,
|
|
434
406
|
pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
|
|
435
407
|
filters: {
|
|
436
408
|
releasedAt: {
|
|
437
|
-
$notNull:
|
|
409
|
+
$notNull: index === 0 ? false : true
|
|
438
410
|
}
|
|
439
411
|
}
|
|
440
412
|
});
|
|
@@ -454,22 +426,22 @@ const ReleasesPage = () => {
|
|
|
454
426
|
})
|
|
455
427
|
});
|
|
456
428
|
trackUsage("didCreateRelease");
|
|
457
|
-
|
|
458
|
-
} else if (
|
|
429
|
+
push(`/plugins/content-releases/${response2.data.data.id}`);
|
|
430
|
+
} else if (isAxiosError(response2.error)) {
|
|
459
431
|
toggleNotification({
|
|
460
|
-
type: "
|
|
432
|
+
type: "warning",
|
|
461
433
|
message: formatAPIError(response2.error)
|
|
462
434
|
});
|
|
463
435
|
} else {
|
|
464
436
|
toggleNotification({
|
|
465
|
-
type: "
|
|
437
|
+
type: "warning",
|
|
466
438
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
467
439
|
});
|
|
468
440
|
}
|
|
469
441
|
};
|
|
470
|
-
return /* @__PURE__ */ jsxs(Main, { "aria-busy":
|
|
442
|
+
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
|
|
471
443
|
/* @__PURE__ */ jsx(
|
|
472
|
-
|
|
444
|
+
HeaderLayout,
|
|
473
445
|
{
|
|
474
446
|
title: formatMessage({
|
|
475
447
|
id: "content-releases.pages.Releases.title",
|
|
@@ -479,7 +451,7 @@ const ReleasesPage = () => {
|
|
|
479
451
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
480
452
|
defaultMessage: "Create and manage content updates"
|
|
481
453
|
}),
|
|
482
|
-
primaryAction:
|
|
454
|
+
primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
|
|
483
455
|
Button,
|
|
484
456
|
{
|
|
485
457
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -490,10 +462,10 @@ const ReleasesPage = () => {
|
|
|
490
462
|
defaultMessage: "New release"
|
|
491
463
|
})
|
|
492
464
|
}
|
|
493
|
-
)
|
|
465
|
+
) })
|
|
494
466
|
}
|
|
495
467
|
),
|
|
496
|
-
/* @__PURE__ */ jsx(
|
|
468
|
+
/* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
497
469
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
498
470
|
StyledAlert,
|
|
499
471
|
{
|
|
@@ -518,17 +490,21 @@ const ReleasesPage = () => {
|
|
|
518
490
|
})
|
|
519
491
|
}
|
|
520
492
|
),
|
|
521
|
-
/* @__PURE__ */ jsxs(
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
493
|
+
/* @__PURE__ */ jsxs(
|
|
494
|
+
TabGroup,
|
|
495
|
+
{
|
|
496
|
+
label: formatMessage({
|
|
497
|
+
id: "content-releases.pages.Releases.tab-group.label",
|
|
498
|
+
defaultMessage: "Releases list"
|
|
499
|
+
}),
|
|
500
|
+
variant: "simple",
|
|
501
|
+
initialSelectedTabIndex: activeTabIndex,
|
|
502
|
+
onTabChange: handleTabChange,
|
|
503
|
+
ref: tabRef,
|
|
504
|
+
children: [
|
|
505
|
+
/* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
|
|
506
|
+
/* @__PURE__ */ jsxs(Tabs, { children: [
|
|
507
|
+
/* @__PURE__ */ jsx(Tab, { children: formatMessage(
|
|
532
508
|
{
|
|
533
509
|
id: "content-releases.pages.Releases.tab.pending",
|
|
534
510
|
defaultMessage: "Pending ({count})"
|
|
@@ -537,55 +513,59 @@ const ReleasesPage = () => {
|
|
|
537
513
|
count: totalPendingReleases
|
|
538
514
|
}
|
|
539
515
|
) }),
|
|
540
|
-
/* @__PURE__ */ jsx(
|
|
516
|
+
/* @__PURE__ */ jsx(Tab, { children: formatMessage({
|
|
541
517
|
id: "content-releases.pages.Releases.tab.done",
|
|
542
518
|
defaultMessage: "Done"
|
|
543
519
|
}) })
|
|
544
|
-
]
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
520
|
+
] }),
|
|
521
|
+
/* @__PURE__ */ jsx(Divider, {})
|
|
522
|
+
] }),
|
|
523
|
+
/* @__PURE__ */ jsxs(TabPanels, { children: [
|
|
524
|
+
/* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
|
|
525
|
+
ReleasesGrid,
|
|
526
|
+
{
|
|
527
|
+
sectionTitle: "pending",
|
|
528
|
+
releases: response?.currentData?.data,
|
|
529
|
+
isError
|
|
530
|
+
}
|
|
531
|
+
) }),
|
|
532
|
+
/* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
|
|
533
|
+
ReleasesGrid,
|
|
534
|
+
{
|
|
535
|
+
sectionTitle: "done",
|
|
536
|
+
releases: response?.currentData?.data,
|
|
537
|
+
isError
|
|
538
|
+
}
|
|
539
|
+
) })
|
|
540
|
+
] })
|
|
541
|
+
]
|
|
542
|
+
}
|
|
543
|
+
),
|
|
544
|
+
response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
|
|
545
|
+
/* @__PURE__ */ jsx(
|
|
546
|
+
PageSizeURLQuery,
|
|
551
547
|
{
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
isError
|
|
548
|
+
options: ["8", "16", "32", "64"],
|
|
549
|
+
defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
|
|
555
550
|
}
|
|
556
|
-
)
|
|
557
|
-
/* @__PURE__ */ jsx(
|
|
558
|
-
|
|
551
|
+
),
|
|
552
|
+
/* @__PURE__ */ jsx(
|
|
553
|
+
PaginationURLQuery,
|
|
559
554
|
{
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
555
|
+
pagination: {
|
|
556
|
+
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
557
|
+
}
|
|
563
558
|
}
|
|
564
|
-
)
|
|
565
|
-
] })
|
|
566
|
-
/* @__PURE__ */ jsxs(
|
|
567
|
-
Pagination.Root,
|
|
568
|
-
{
|
|
569
|
-
...response?.currentData?.meta?.pagination,
|
|
570
|
-
defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
|
|
571
|
-
children: [
|
|
572
|
-
/* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
|
|
573
|
-
/* @__PURE__ */ jsx(Pagination.Links, {})
|
|
574
|
-
]
|
|
575
|
-
}
|
|
576
|
-
)
|
|
559
|
+
)
|
|
560
|
+
] }) : null
|
|
577
561
|
] }) }),
|
|
578
|
-
/* @__PURE__ */ jsx(
|
|
562
|
+
releaseModalShown && /* @__PURE__ */ jsx(
|
|
579
563
|
ReleaseModal,
|
|
580
564
|
{
|
|
581
|
-
open: releaseModalShown,
|
|
582
565
|
handleClose: toggleAddReleaseModal,
|
|
583
566
|
handleSubmit: handleAddRelease,
|
|
584
567
|
isLoading: isSubmittingForm,
|
|
585
|
-
initialValues:
|
|
586
|
-
...INITIAL_FORM_VALUES,
|
|
587
|
-
timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
|
|
588
|
-
}
|
|
568
|
+
initialValues: INITIAL_FORM_VALUES
|
|
589
569
|
}
|
|
590
570
|
)
|
|
591
571
|
] });
|
|
@@ -596,7 +576,7 @@ const ReleaseInfoWrapper = styled(Flex)`
|
|
|
596
576
|
border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
|
|
597
577
|
border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
|
|
598
578
|
`;
|
|
599
|
-
const StyledMenuItem = styled(
|
|
579
|
+
const StyledMenuItem = styled(Menu.Item)`
|
|
600
580
|
svg path {
|
|
601
581
|
fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
|
|
602
582
|
}
|
|
@@ -605,7 +585,7 @@ const StyledMenuItem = styled(MenuItem)`
|
|
|
605
585
|
}
|
|
606
586
|
|
|
607
587
|
&:hover {
|
|
608
|
-
background: ${({ theme,
|
|
588
|
+
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
609
589
|
}
|
|
610
590
|
`;
|
|
611
591
|
const PencilIcon = styled(Pencil)`
|
|
@@ -625,75 +605,40 @@ const TrashIcon = styled(Trash)`
|
|
|
625
605
|
const TypographyMaxWidth = styled(Typography)`
|
|
626
606
|
max-width: 300px;
|
|
627
607
|
`;
|
|
628
|
-
const EntryValidationText = ({ action, schema,
|
|
608
|
+
const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
629
609
|
const { formatMessage } = useIntl();
|
|
630
|
-
const { validate
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
610
|
+
const { validate } = unstable_useDocument();
|
|
611
|
+
const { errors } = validate(entry, {
|
|
612
|
+
contentType: schema,
|
|
613
|
+
components,
|
|
614
|
+
isCreatingEntry: false
|
|
615
|
+
});
|
|
616
|
+
if (Object.keys(errors).length > 0) {
|
|
617
|
+
const validationErrorsMessages = Object.entries(errors).map(
|
|
618
|
+
([key, value]) => formatMessage(
|
|
619
|
+
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
620
|
+
{ field: key }
|
|
621
|
+
)
|
|
622
|
+
).join(" ");
|
|
623
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
624
|
+
/* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
|
|
625
|
+
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
626
|
+
] });
|
|
642
627
|
}
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
)
|
|
653
|
-
|
|
654
|
-
/* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
|
|
655
|
-
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(
|
|
656
|
-
TypographyMaxWidth,
|
|
657
|
-
{
|
|
658
|
-
textColor: "danger600",
|
|
659
|
-
variant: "omega",
|
|
660
|
-
fontWeight: "semiBold",
|
|
661
|
-
ellipsis: true,
|
|
662
|
-
children: validationErrorsMessages
|
|
663
|
-
}
|
|
664
|
-
) })
|
|
665
|
-
] });
|
|
666
|
-
}
|
|
667
|
-
if (status === "draft") {
|
|
668
|
-
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
669
|
-
/* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
|
670
|
-
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
671
|
-
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
|
|
672
|
-
defaultMessage: "Ready to publish"
|
|
673
|
-
}) })
|
|
674
|
-
] });
|
|
675
|
-
}
|
|
676
|
-
if (status === "modified") {
|
|
677
|
-
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
678
|
-
/* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
|
|
679
|
-
/* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
680
|
-
id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
|
|
681
|
-
defaultMessage: "Ready to publish changes"
|
|
682
|
-
}) })
|
|
683
|
-
] });
|
|
684
|
-
}
|
|
685
|
-
if (status === "published") {
|
|
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.already-published",
|
|
690
|
-
defaultMessage: "Already published"
|
|
691
|
-
}) })
|
|
692
|
-
] });
|
|
693
|
-
}
|
|
628
|
+
if (action == "publish") {
|
|
629
|
+
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
630
|
+
/* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
|
|
631
|
+
entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
632
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
633
|
+
defaultMessage: "Already published"
|
|
634
|
+
}) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
|
|
635
|
+
id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
|
|
636
|
+
defaultMessage: "Ready to publish"
|
|
637
|
+
}) })
|
|
638
|
+
] });
|
|
694
639
|
}
|
|
695
640
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
696
|
-
/* @__PURE__ */ jsx(
|
|
641
|
+
/* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
|
|
697
642
|
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
698
643
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
699
644
|
defaultMessage: "Already unpublished"
|
|
@@ -713,23 +658,20 @@ const ReleaseDetailsLayout = ({
|
|
|
713
658
|
const {
|
|
714
659
|
data,
|
|
715
660
|
isLoading: isLoadingDetails,
|
|
661
|
+
isError,
|
|
716
662
|
error
|
|
717
|
-
} = useGetReleaseQuery(
|
|
718
|
-
{ id: releaseId },
|
|
719
|
-
{
|
|
720
|
-
skip: !releaseId
|
|
721
|
-
}
|
|
722
|
-
);
|
|
663
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
723
664
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
724
|
-
const
|
|
665
|
+
const toggleNotification = useNotification();
|
|
725
666
|
const { formatAPIError } = useAPIErrorHandler();
|
|
726
|
-
const {
|
|
727
|
-
|
|
667
|
+
const {
|
|
668
|
+
allowedActions: { canUpdate, canDelete }
|
|
669
|
+
} = useRBAC(PERMISSIONS);
|
|
728
670
|
const dispatch = useTypedDispatch();
|
|
729
671
|
const { trackUsage } = useTracking();
|
|
730
672
|
const release = data?.data;
|
|
731
|
-
const handlePublishRelease =
|
|
732
|
-
const response = await publishRelease({ id });
|
|
673
|
+
const handlePublishRelease = async () => {
|
|
674
|
+
const response = await publishRelease({ id: releaseId });
|
|
733
675
|
if ("data" in response) {
|
|
734
676
|
toggleNotification({
|
|
735
677
|
type: "success",
|
|
@@ -744,14 +686,14 @@ const ReleaseDetailsLayout = ({
|
|
|
744
686
|
totalPublishedEntries,
|
|
745
687
|
totalUnpublishedEntries
|
|
746
688
|
});
|
|
747
|
-
} else if (
|
|
689
|
+
} else if (isAxiosError(response.error)) {
|
|
748
690
|
toggleNotification({
|
|
749
|
-
type: "
|
|
691
|
+
type: "warning",
|
|
750
692
|
message: formatAPIError(response.error)
|
|
751
693
|
});
|
|
752
694
|
} else {
|
|
753
695
|
toggleNotification({
|
|
754
|
-
type: "
|
|
696
|
+
type: "warning",
|
|
755
697
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
756
698
|
});
|
|
757
699
|
}
|
|
@@ -777,20 +719,21 @@ const ReleaseDetailsLayout = ({
|
|
|
777
719
|
return release.createdBy.email;
|
|
778
720
|
};
|
|
779
721
|
if (isLoadingDetails) {
|
|
780
|
-
return /* @__PURE__ */ jsx(
|
|
722
|
+
return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
781
723
|
}
|
|
782
|
-
if (
|
|
724
|
+
if (isError || !release) {
|
|
783
725
|
return /* @__PURE__ */ jsx(
|
|
784
|
-
|
|
726
|
+
Redirect,
|
|
785
727
|
{
|
|
786
|
-
to:
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
728
|
+
to: {
|
|
729
|
+
pathname: "/plugins/content-releases",
|
|
730
|
+
state: {
|
|
731
|
+
errors: [
|
|
732
|
+
{
|
|
733
|
+
code: error?.code
|
|
734
|
+
}
|
|
735
|
+
]
|
|
736
|
+
}
|
|
794
737
|
}
|
|
795
738
|
}
|
|
796
739
|
);
|
|
@@ -827,90 +770,106 @@ const ReleaseDetailsLayout = ({
|
|
|
827
770
|
) : "";
|
|
828
771
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
829
772
|
/* @__PURE__ */ jsx(
|
|
830
|
-
|
|
773
|
+
HeaderLayout,
|
|
831
774
|
{
|
|
832
775
|
title: release.name,
|
|
833
776
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
834
777
|
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
835
778
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
836
779
|
] }),
|
|
837
|
-
navigationAction: /* @__PURE__ */ jsx(
|
|
780
|
+
navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
|
|
781
|
+
id: "global.back",
|
|
782
|
+
defaultMessage: "Back"
|
|
783
|
+
}) }),
|
|
838
784
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
839
|
-
/* @__PURE__ */ jsxs(
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
onSelect:
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
id: "content-releases.header.actions.delete",
|
|
870
|
-
defaultMessage: "Delete"
|
|
785
|
+
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
786
|
+
/* @__PURE__ */ jsx(
|
|
787
|
+
Menu.Trigger,
|
|
788
|
+
{
|
|
789
|
+
as: IconButton,
|
|
790
|
+
paddingLeft: 2,
|
|
791
|
+
paddingRight: 2,
|
|
792
|
+
"aria-label": formatMessage({
|
|
793
|
+
id: "content-releases.header.actions.open-release-actions",
|
|
794
|
+
defaultMessage: "Release edit and delete menu"
|
|
795
|
+
}),
|
|
796
|
+
icon: /* @__PURE__ */ jsx(More, {}),
|
|
797
|
+
variant: "tertiary"
|
|
798
|
+
}
|
|
799
|
+
),
|
|
800
|
+
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
|
|
801
|
+
/* @__PURE__ */ jsxs(
|
|
802
|
+
Flex,
|
|
803
|
+
{
|
|
804
|
+
alignItems: "center",
|
|
805
|
+
justifyContent: "center",
|
|
806
|
+
direction: "column",
|
|
807
|
+
padding: 1,
|
|
808
|
+
width: "100%",
|
|
809
|
+
children: [
|
|
810
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
811
|
+
/* @__PURE__ */ jsx(PencilIcon, {}),
|
|
812
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
|
|
813
|
+
id: "content-releases.header.actions.edit",
|
|
814
|
+
defaultMessage: "Edit"
|
|
871
815
|
}) })
|
|
816
|
+
] }) }),
|
|
817
|
+
/* @__PURE__ */ jsx(
|
|
818
|
+
StyledMenuItem,
|
|
819
|
+
{
|
|
820
|
+
disabled: !canDelete,
|
|
821
|
+
onSelect: toggleWarningSubmit,
|
|
822
|
+
variant: "danger",
|
|
823
|
+
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
824
|
+
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
825
|
+
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
826
|
+
id: "content-releases.header.actions.delete",
|
|
827
|
+
defaultMessage: "Delete"
|
|
828
|
+
}) })
|
|
829
|
+
] })
|
|
830
|
+
}
|
|
831
|
+
)
|
|
832
|
+
]
|
|
833
|
+
}
|
|
834
|
+
),
|
|
835
|
+
/* @__PURE__ */ jsxs(
|
|
836
|
+
ReleaseInfoWrapper,
|
|
837
|
+
{
|
|
838
|
+
direction: "column",
|
|
839
|
+
justifyContent: "center",
|
|
840
|
+
alignItems: "flex-start",
|
|
841
|
+
gap: 1,
|
|
842
|
+
padding: 5,
|
|
843
|
+
children: [
|
|
844
|
+
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
845
|
+
id: "content-releases.header.actions.created",
|
|
846
|
+
defaultMessage: "Created"
|
|
847
|
+
}) }),
|
|
848
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
849
|
+
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
850
|
+
formatMessage(
|
|
851
|
+
{
|
|
852
|
+
id: "content-releases.header.actions.created.description",
|
|
853
|
+
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
854
|
+
},
|
|
855
|
+
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
856
|
+
)
|
|
872
857
|
] })
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
direction: "column",
|
|
879
|
-
justifyContent: "center",
|
|
880
|
-
alignItems: "flex-start",
|
|
881
|
-
gap: 1,
|
|
882
|
-
padding: 4,
|
|
883
|
-
children: [
|
|
884
|
-
/* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
|
|
885
|
-
id: "content-releases.header.actions.created",
|
|
886
|
-
defaultMessage: "Created"
|
|
887
|
-
}) }),
|
|
888
|
-
/* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
|
|
889
|
-
/* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
|
|
890
|
-
formatMessage(
|
|
891
|
-
{
|
|
892
|
-
id: "content-releases.header.actions.created.description",
|
|
893
|
-
defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
|
|
894
|
-
},
|
|
895
|
-
{ createdBy: getCreatedByUser(), hasCreatedByUser }
|
|
896
|
-
)
|
|
897
|
-
] })
|
|
898
|
-
]
|
|
899
|
-
}
|
|
900
|
-
)
|
|
901
|
-
]
|
|
902
|
-
}
|
|
903
|
-
),
|
|
858
|
+
]
|
|
859
|
+
}
|
|
860
|
+
)
|
|
861
|
+
] })
|
|
862
|
+
] }),
|
|
904
863
|
/* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
|
|
905
864
|
id: "content-releases.header.actions.refresh",
|
|
906
865
|
defaultMessage: "Refresh"
|
|
907
866
|
}) }),
|
|
908
|
-
|
|
867
|
+
/* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
|
|
909
868
|
Button,
|
|
910
869
|
{
|
|
911
870
|
size: "S",
|
|
912
871
|
variant: "default",
|
|
913
|
-
onClick: handlePublishRelease
|
|
872
|
+
onClick: handlePublishRelease,
|
|
914
873
|
loading: isPublishing,
|
|
915
874
|
disabled: release.actions.meta.count === 0,
|
|
916
875
|
children: formatMessage({
|
|
@@ -918,18 +877,13 @@ const ReleaseDetailsLayout = ({
|
|
|
918
877
|
defaultMessage: "Publish"
|
|
919
878
|
})
|
|
920
879
|
}
|
|
921
|
-
)
|
|
880
|
+
) })
|
|
922
881
|
] })
|
|
923
882
|
}
|
|
924
883
|
),
|
|
925
884
|
children
|
|
926
885
|
] });
|
|
927
886
|
};
|
|
928
|
-
const SimpleMenuButton = styled(SimpleMenu)`
|
|
929
|
-
& > span {
|
|
930
|
-
display: flex;
|
|
931
|
-
}
|
|
932
|
-
`;
|
|
933
887
|
const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
|
|
934
888
|
const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
|
|
935
889
|
const getGroupByOptionLabel = (value) => {
|
|
@@ -950,32 +904,47 @@ const getGroupByOptionLabel = (value) => {
|
|
|
950
904
|
defaultMessage: "Content-Types"
|
|
951
905
|
};
|
|
952
906
|
};
|
|
953
|
-
const
|
|
907
|
+
const DEFAULT_RELEASE_DETAILS_HEADER = [
|
|
908
|
+
{
|
|
909
|
+
key: "__name__",
|
|
910
|
+
fieldSchema: { type: "string" },
|
|
911
|
+
metadatas: {
|
|
912
|
+
label: {
|
|
913
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
914
|
+
defaultMessage: "name"
|
|
915
|
+
},
|
|
916
|
+
searchable: false,
|
|
917
|
+
sortable: false
|
|
918
|
+
},
|
|
919
|
+
name: "name"
|
|
920
|
+
}
|
|
921
|
+
];
|
|
922
|
+
const ReleaseDetailsBody = () => {
|
|
954
923
|
const { formatMessage } = useIntl();
|
|
924
|
+
const { releaseId } = useParams();
|
|
955
925
|
const [{ query }, setQuery] = useQueryParams();
|
|
956
|
-
const
|
|
926
|
+
const toggleNotification = useNotification();
|
|
957
927
|
const { formatAPIError } = useAPIErrorHandler();
|
|
958
928
|
const {
|
|
959
929
|
data: releaseData,
|
|
960
930
|
isLoading: isReleaseLoading,
|
|
931
|
+
isError: isReleaseError,
|
|
961
932
|
error: releaseError
|
|
962
933
|
} = useGetReleaseQuery({ id: releaseId });
|
|
963
934
|
const {
|
|
964
935
|
allowedActions: { canUpdate }
|
|
965
936
|
} = useRBAC(PERMISSIONS);
|
|
966
|
-
const runHookWaterfall = useStrapiApp(
|
|
967
|
-
const {
|
|
968
|
-
displayedHeaders
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
hasI18nEnabled: false
|
|
978
|
-
});
|
|
937
|
+
const { runHookWaterfall } = useStrapiApp();
|
|
938
|
+
const {
|
|
939
|
+
displayedHeaders,
|
|
940
|
+
hasI18nEnabled
|
|
941
|
+
} = runHookWaterfall(
|
|
942
|
+
"ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
|
|
943
|
+
{
|
|
944
|
+
displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
|
|
945
|
+
hasI18nEnabled: false
|
|
946
|
+
}
|
|
947
|
+
);
|
|
979
948
|
const release = releaseData?.data;
|
|
980
949
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
981
950
|
const {
|
|
@@ -1004,59 +973,65 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1004
973
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
1005
974
|
});
|
|
1006
975
|
if ("error" in response) {
|
|
1007
|
-
if (
|
|
976
|
+
if (isAxiosError(response.error)) {
|
|
1008
977
|
toggleNotification({
|
|
1009
|
-
type: "
|
|
978
|
+
type: "warning",
|
|
1010
979
|
message: formatAPIError(response.error)
|
|
1011
980
|
});
|
|
1012
981
|
} else {
|
|
1013
982
|
toggleNotification({
|
|
1014
|
-
type: "
|
|
983
|
+
type: "warning",
|
|
1015
984
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1016
985
|
});
|
|
1017
986
|
}
|
|
1018
987
|
}
|
|
1019
988
|
};
|
|
1020
989
|
if (isLoading || isReleaseLoading) {
|
|
1021
|
-
return /* @__PURE__ */ jsx(
|
|
990
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
1022
991
|
}
|
|
1023
992
|
const releaseActions = data?.data;
|
|
1024
993
|
const releaseMeta = data?.meta;
|
|
1025
994
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
1026
995
|
const components = releaseMeta?.components || {};
|
|
1027
|
-
if (
|
|
996
|
+
if (isReleaseError || !release) {
|
|
1028
997
|
const errorsArray = [];
|
|
1029
|
-
if (releaseError
|
|
998
|
+
if (releaseError) {
|
|
1030
999
|
errorsArray.push({
|
|
1031
1000
|
code: releaseError.code
|
|
1032
1001
|
});
|
|
1033
1002
|
}
|
|
1034
|
-
if (releaseActionsError
|
|
1003
|
+
if (releaseActionsError) {
|
|
1035
1004
|
errorsArray.push({
|
|
1036
1005
|
code: releaseActionsError.code
|
|
1037
1006
|
});
|
|
1038
1007
|
}
|
|
1039
1008
|
return /* @__PURE__ */ jsx(
|
|
1040
|
-
|
|
1009
|
+
Redirect,
|
|
1041
1010
|
{
|
|
1042
|
-
to:
|
|
1043
|
-
|
|
1044
|
-
|
|
1011
|
+
to: {
|
|
1012
|
+
pathname: "/plugins/content-releases",
|
|
1013
|
+
state: {
|
|
1014
|
+
errors: errorsArray
|
|
1015
|
+
}
|
|
1045
1016
|
}
|
|
1046
1017
|
}
|
|
1047
1018
|
);
|
|
1048
1019
|
}
|
|
1049
1020
|
if (isError || !releaseActions) {
|
|
1050
|
-
return /* @__PURE__ */ jsx(
|
|
1021
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
|
|
1051
1022
|
}
|
|
1052
1023
|
if (Object.keys(releaseActions).length === 0) {
|
|
1053
|
-
return /* @__PURE__ */ jsx(
|
|
1054
|
-
|
|
1024
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
|
|
1025
|
+
NoContent,
|
|
1055
1026
|
{
|
|
1027
|
+
content: {
|
|
1028
|
+
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1029
|
+
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1030
|
+
},
|
|
1056
1031
|
action: /* @__PURE__ */ jsx(
|
|
1057
1032
|
LinkButton,
|
|
1058
1033
|
{
|
|
1059
|
-
|
|
1034
|
+
as: Link$2,
|
|
1060
1035
|
to: {
|
|
1061
1036
|
pathname: "/content-manager"
|
|
1062
1037
|
},
|
|
@@ -1067,52 +1042,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1067
1042
|
defaultMessage: "Open the Content Manager"
|
|
1068
1043
|
})
|
|
1069
1044
|
}
|
|
1070
|
-
)
|
|
1071
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
1072
|
-
content: formatMessage({
|
|
1073
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1074
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1075
|
-
})
|
|
1045
|
+
)
|
|
1076
1046
|
}
|
|
1077
1047
|
) });
|
|
1078
1048
|
}
|
|
1079
|
-
const groupByLabel = formatMessage({
|
|
1080
|
-
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1081
|
-
defaultMessage: "Group by"
|
|
1082
|
-
});
|
|
1083
|
-
const headers = [
|
|
1084
|
-
...displayedHeaders,
|
|
1085
|
-
{
|
|
1086
|
-
label: {
|
|
1087
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1088
|
-
defaultMessage: "content-type"
|
|
1089
|
-
},
|
|
1090
|
-
name: "content-type"
|
|
1091
|
-
},
|
|
1092
|
-
{
|
|
1093
|
-
label: {
|
|
1094
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1095
|
-
defaultMessage: "action"
|
|
1096
|
-
},
|
|
1097
|
-
name: "action"
|
|
1098
|
-
},
|
|
1099
|
-
...!release.releasedAt ? [
|
|
1100
|
-
{
|
|
1101
|
-
label: {
|
|
1102
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1103
|
-
defaultMessage: "status"
|
|
1104
|
-
},
|
|
1105
|
-
name: "status"
|
|
1106
|
-
}
|
|
1107
|
-
] : []
|
|
1108
|
-
];
|
|
1109
1049
|
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1110
|
-
return /* @__PURE__ */ jsx(
|
|
1050
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1111
1051
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1112
1052
|
SingleSelect,
|
|
1113
1053
|
{
|
|
1114
|
-
|
|
1115
|
-
|
|
1054
|
+
"aria-label": formatMessage({
|
|
1055
|
+
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1056
|
+
defaultMessage: "Group by"
|
|
1057
|
+
}),
|
|
1116
1058
|
customizeContent: (value) => formatMessage(
|
|
1117
1059
|
{
|
|
1118
1060
|
id: `content-releases.pages.ReleaseDetails.groupBy.label`,
|
|
@@ -1136,13 +1078,57 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1136
1078
|
...item,
|
|
1137
1079
|
id: Number(item.entry.id)
|
|
1138
1080
|
})),
|
|
1139
|
-
|
|
1140
|
-
isLoading
|
|
1081
|
+
colCount: releaseActions[key].length,
|
|
1082
|
+
isLoading,
|
|
1083
|
+
isFetching,
|
|
1141
1084
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1142
|
-
/* @__PURE__ */
|
|
1143
|
-
|
|
1085
|
+
/* @__PURE__ */ jsxs(Table.Head, { children: [
|
|
1086
|
+
displayedHeaders.map(({ key: key2, fieldSchema, metadatas, name }) => /* @__PURE__ */ jsx(
|
|
1087
|
+
Table.HeaderCell,
|
|
1088
|
+
{
|
|
1089
|
+
fieldSchemaType: fieldSchema.type,
|
|
1090
|
+
label: formatMessage(metadatas.label),
|
|
1091
|
+
name
|
|
1092
|
+
},
|
|
1093
|
+
key2
|
|
1094
|
+
)),
|
|
1095
|
+
/* @__PURE__ */ jsx(
|
|
1096
|
+
Table.HeaderCell,
|
|
1097
|
+
{
|
|
1098
|
+
fieldSchemaType: "string",
|
|
1099
|
+
label: formatMessage({
|
|
1100
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1101
|
+
defaultMessage: "content-type"
|
|
1102
|
+
}),
|
|
1103
|
+
name: "content-type"
|
|
1104
|
+
}
|
|
1105
|
+
),
|
|
1106
|
+
/* @__PURE__ */ jsx(
|
|
1107
|
+
Table.HeaderCell,
|
|
1108
|
+
{
|
|
1109
|
+
fieldSchemaType: "string",
|
|
1110
|
+
label: formatMessage({
|
|
1111
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1112
|
+
defaultMessage: "action"
|
|
1113
|
+
}),
|
|
1114
|
+
name: "action"
|
|
1115
|
+
}
|
|
1116
|
+
),
|
|
1117
|
+
!release.releasedAt && /* @__PURE__ */ jsx(
|
|
1118
|
+
Table.HeaderCell,
|
|
1119
|
+
{
|
|
1120
|
+
fieldSchemaType: "string",
|
|
1121
|
+
label: formatMessage({
|
|
1122
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1123
|
+
defaultMessage: "status"
|
|
1124
|
+
}),
|
|
1125
|
+
name: "status"
|
|
1126
|
+
}
|
|
1127
|
+
)
|
|
1128
|
+
] }),
|
|
1129
|
+
/* @__PURE__ */ jsx(Table.LoadingBody, {}),
|
|
1144
1130
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1145
|
-
({ id, contentType, locale, type, entry
|
|
1131
|
+
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1146
1132
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1147
1133
|
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1148
1134
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
@@ -1171,8 +1157,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1171
1157
|
action: type,
|
|
1172
1158
|
schema: contentTypes?.[contentType.uid],
|
|
1173
1159
|
components,
|
|
1174
|
-
entry
|
|
1175
|
-
status
|
|
1160
|
+
entry
|
|
1176
1161
|
}
|
|
1177
1162
|
) }),
|
|
1178
1163
|
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
|
|
@@ -1180,7 +1165,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1180
1165
|
ReleaseActionMenu.ReleaseActionEntryLinkItem,
|
|
1181
1166
|
{
|
|
1182
1167
|
contentTypeUid: contentType.uid,
|
|
1183
|
-
|
|
1168
|
+
entryId: entry.id,
|
|
1184
1169
|
locale: locale?.code
|
|
1185
1170
|
}
|
|
1186
1171
|
),
|
|
@@ -1199,73 +1184,54 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1199
1184
|
}
|
|
1200
1185
|
)
|
|
1201
1186
|
] }, `releases-group-${key}`)),
|
|
1202
|
-
/* @__PURE__ */ jsxs(
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
)
|
|
1187
|
+
/* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
|
|
1188
|
+
/* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
|
|
1189
|
+
/* @__PURE__ */ jsx(
|
|
1190
|
+
PaginationURLQuery,
|
|
1191
|
+
{
|
|
1192
|
+
pagination: {
|
|
1193
|
+
pageCount: releaseMeta?.pagination?.pageCount || 0
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
)
|
|
1197
|
+
] })
|
|
1213
1198
|
] }) });
|
|
1214
1199
|
};
|
|
1215
1200
|
const ReleaseDetailsPage = () => {
|
|
1216
1201
|
const { formatMessage } = useIntl();
|
|
1217
1202
|
const { releaseId } = useParams();
|
|
1218
|
-
const
|
|
1203
|
+
const toggleNotification = useNotification();
|
|
1219
1204
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1220
|
-
const
|
|
1205
|
+
const { replace } = useHistory();
|
|
1221
1206
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1222
1207
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1223
1208
|
const {
|
|
1224
1209
|
isLoading: isLoadingDetails,
|
|
1225
1210
|
data,
|
|
1226
1211
|
isSuccess: isSuccessDetails
|
|
1227
|
-
} = useGetReleaseQuery(
|
|
1228
|
-
{ id: releaseId },
|
|
1229
|
-
{
|
|
1230
|
-
skip: !releaseId
|
|
1231
|
-
}
|
|
1232
|
-
);
|
|
1233
|
-
const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
|
|
1212
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
1234
1213
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1235
|
-
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1214
|
+
const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
|
|
1236
1215
|
const toggleEditReleaseModal = () => {
|
|
1237
1216
|
setReleaseModalShown((prev) => !prev);
|
|
1238
1217
|
};
|
|
1239
|
-
const getTimezoneValue = () => {
|
|
1240
|
-
if (releaseData?.timezone) {
|
|
1241
|
-
return releaseData.timezone;
|
|
1242
|
-
} else {
|
|
1243
|
-
if (dataTimezone?.data.defaultTimezone) {
|
|
1244
|
-
return dataTimezone.data.defaultTimezone;
|
|
1245
|
-
}
|
|
1246
|
-
return null;
|
|
1247
|
-
}
|
|
1248
|
-
};
|
|
1249
1218
|
const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
|
|
1250
|
-
if (isLoadingDetails
|
|
1219
|
+
if (isLoadingDetails) {
|
|
1251
1220
|
return /* @__PURE__ */ jsx(
|
|
1252
1221
|
ReleaseDetailsLayout,
|
|
1253
1222
|
{
|
|
1254
1223
|
toggleEditReleaseModal,
|
|
1255
1224
|
toggleWarningSubmit,
|
|
1256
|
-
children: /* @__PURE__ */ jsx(
|
|
1225
|
+
children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
|
|
1257
1226
|
}
|
|
1258
1227
|
);
|
|
1259
1228
|
}
|
|
1260
|
-
if (!releaseId) {
|
|
1261
|
-
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1262
|
-
}
|
|
1263
1229
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1264
1230
|
const title = releaseData?.name || "";
|
|
1265
|
-
const timezone =
|
|
1231
|
+
const timezone = releaseData?.timezone ?? null;
|
|
1266
1232
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1267
|
-
const date = scheduledAt ? format
|
|
1268
|
-
const time = scheduledAt ? format
|
|
1233
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
|
|
1234
|
+
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1269
1235
|
const handleEditRelease = async (values) => {
|
|
1270
1236
|
const response = await updateRelease({
|
|
1271
1237
|
id: releaseId,
|
|
@@ -1282,14 +1248,14 @@ const ReleaseDetailsPage = () => {
|
|
|
1282
1248
|
})
|
|
1283
1249
|
});
|
|
1284
1250
|
toggleEditReleaseModal();
|
|
1285
|
-
} else if (
|
|
1251
|
+
} else if (isAxiosError(response.error)) {
|
|
1286
1252
|
toggleNotification({
|
|
1287
|
-
type: "
|
|
1253
|
+
type: "warning",
|
|
1288
1254
|
message: formatAPIError(response.error)
|
|
1289
1255
|
});
|
|
1290
1256
|
} else {
|
|
1291
1257
|
toggleNotification({
|
|
1292
|
-
type: "
|
|
1258
|
+
type: "warning",
|
|
1293
1259
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1294
1260
|
});
|
|
1295
1261
|
}
|
|
@@ -1299,15 +1265,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1299
1265
|
id: releaseId
|
|
1300
1266
|
});
|
|
1301
1267
|
if ("data" in response) {
|
|
1302
|
-
|
|
1303
|
-
} else if (
|
|
1268
|
+
replace("/plugins/content-releases");
|
|
1269
|
+
} else if (isAxiosError(response.error)) {
|
|
1304
1270
|
toggleNotification({
|
|
1305
|
-
type: "
|
|
1271
|
+
type: "warning",
|
|
1306
1272
|
message: formatAPIError(response.error)
|
|
1307
1273
|
});
|
|
1308
1274
|
} else {
|
|
1309
1275
|
toggleNotification({
|
|
1310
|
-
type: "
|
|
1276
|
+
type: "warning",
|
|
1311
1277
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1312
1278
|
});
|
|
1313
1279
|
}
|
|
@@ -1318,11 +1284,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1318
1284
|
toggleEditReleaseModal,
|
|
1319
1285
|
toggleWarningSubmit,
|
|
1320
1286
|
children: [
|
|
1321
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {
|
|
1322
|
-
/* @__PURE__ */ jsx(
|
|
1287
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1288
|
+
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1323
1289
|
ReleaseModal,
|
|
1324
1290
|
{
|
|
1325
|
-
open: releaseModalShown,
|
|
1326
1291
|
handleClose: toggleEditReleaseModal,
|
|
1327
1292
|
handleSubmit: handleEditRelease,
|
|
1328
1293
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1336,21 +1301,30 @@ const ReleaseDetailsPage = () => {
|
|
|
1336
1301
|
}
|
|
1337
1302
|
}
|
|
1338
1303
|
),
|
|
1339
|
-
/* @__PURE__ */ jsx(
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1304
|
+
/* @__PURE__ */ jsx(
|
|
1305
|
+
ConfirmDialog,
|
|
1306
|
+
{
|
|
1307
|
+
bodyText: {
|
|
1308
|
+
id: "content-releases.dialog.confirmation-message",
|
|
1309
|
+
defaultMessage: "Are you sure you want to delete this release?"
|
|
1310
|
+
},
|
|
1311
|
+
isOpen: showWarningSubmit,
|
|
1312
|
+
isConfirmButtonLoading: isDeletingRelease,
|
|
1313
|
+
onToggleDialog: toggleWarningSubmit,
|
|
1314
|
+
onConfirm: handleDeleteRelease
|
|
1315
|
+
}
|
|
1316
|
+
)
|
|
1343
1317
|
]
|
|
1344
1318
|
}
|
|
1345
1319
|
);
|
|
1346
1320
|
};
|
|
1347
1321
|
const App = () => {
|
|
1348
|
-
return /* @__PURE__ */ jsx(
|
|
1349
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1350
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1322
|
+
return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
|
|
1323
|
+
/* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
|
|
1324
|
+
/* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
|
|
1351
1325
|
] }) });
|
|
1352
1326
|
};
|
|
1353
1327
|
export {
|
|
1354
1328
|
App
|
|
1355
1329
|
};
|
|
1356
|
-
//# sourceMappingURL=App-
|
|
1330
|
+
//# sourceMappingURL=App-jrh58sXY.mjs.map
|