@strapi/content-releases 0.0.0-experimental.cb311d9fcfbd8e441f790aea232f0a39bdd90e16 → 0.0.0-experimental.cf512c83e81bd5a0243ea6d6fe5f9c71796765f0
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-DdxsZcmK.js → App-dLXY5ei3.js} +575 -594
- package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
- package/dist/_chunks/{App-CZe9wueI.mjs → App-jrh58sXY.mjs} +554 -575
- 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-CZe9wueI.mjs.map +0 -1
- package/dist/_chunks/App-DdxsZcmK.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-CwsExK2M.js +0 -178
- package/dist/_chunks/ReleasesSettingsPage-CwsExK2M.js.map +0 -1
- package/dist/_chunks/ReleasesSettingsPage-DWc3H14U.mjs +0 -178
- package/dist/_chunks/ReleasesSettingsPage-DWc3H14U.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-CPq3qdIv.mjs +0 -1334
- package/dist/_chunks/index-CPq3qdIv.mjs.map +0 -1
- package/dist/_chunks/index-DtQIl4fm.js +0 -1353
- package/dist/_chunks/index-DtQIl4fm.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: 5,
|
|
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,7 +877,7 @@ const ReleaseDetailsLayout = ({
|
|
|
918
877
|
defaultMessage: "Publish"
|
|
919
878
|
})
|
|
920
879
|
}
|
|
921
|
-
)
|
|
880
|
+
) })
|
|
922
881
|
] })
|
|
923
882
|
}
|
|
924
883
|
),
|
|
@@ -945,32 +904,47 @@ const getGroupByOptionLabel = (value) => {
|
|
|
945
904
|
defaultMessage: "Content-Types"
|
|
946
905
|
};
|
|
947
906
|
};
|
|
948
|
-
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 = () => {
|
|
949
923
|
const { formatMessage } = useIntl();
|
|
924
|
+
const { releaseId } = useParams();
|
|
950
925
|
const [{ query }, setQuery] = useQueryParams();
|
|
951
|
-
const
|
|
926
|
+
const toggleNotification = useNotification();
|
|
952
927
|
const { formatAPIError } = useAPIErrorHandler();
|
|
953
928
|
const {
|
|
954
929
|
data: releaseData,
|
|
955
930
|
isLoading: isReleaseLoading,
|
|
931
|
+
isError: isReleaseError,
|
|
956
932
|
error: releaseError
|
|
957
933
|
} = useGetReleaseQuery({ id: releaseId });
|
|
958
934
|
const {
|
|
959
935
|
allowedActions: { canUpdate }
|
|
960
936
|
} = useRBAC(PERMISSIONS);
|
|
961
|
-
const runHookWaterfall = useStrapiApp(
|
|
962
|
-
const {
|
|
963
|
-
displayedHeaders
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
hasI18nEnabled: false
|
|
973
|
-
});
|
|
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
|
+
);
|
|
974
948
|
const release = releaseData?.data;
|
|
975
949
|
const selectedGroupBy = query?.groupBy || "contentType";
|
|
976
950
|
const {
|
|
@@ -999,59 +973,65 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
999
973
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
1000
974
|
});
|
|
1001
975
|
if ("error" in response) {
|
|
1002
|
-
if (
|
|
976
|
+
if (isAxiosError(response.error)) {
|
|
1003
977
|
toggleNotification({
|
|
1004
|
-
type: "
|
|
978
|
+
type: "warning",
|
|
1005
979
|
message: formatAPIError(response.error)
|
|
1006
980
|
});
|
|
1007
981
|
} else {
|
|
1008
982
|
toggleNotification({
|
|
1009
|
-
type: "
|
|
983
|
+
type: "warning",
|
|
1010
984
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1011
985
|
});
|
|
1012
986
|
}
|
|
1013
987
|
}
|
|
1014
988
|
};
|
|
1015
989
|
if (isLoading || isReleaseLoading) {
|
|
1016
|
-
return /* @__PURE__ */ jsx(
|
|
990
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
1017
991
|
}
|
|
1018
992
|
const releaseActions = data?.data;
|
|
1019
993
|
const releaseMeta = data?.meta;
|
|
1020
994
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
1021
995
|
const components = releaseMeta?.components || {};
|
|
1022
|
-
if (
|
|
996
|
+
if (isReleaseError || !release) {
|
|
1023
997
|
const errorsArray = [];
|
|
1024
|
-
if (releaseError
|
|
998
|
+
if (releaseError) {
|
|
1025
999
|
errorsArray.push({
|
|
1026
1000
|
code: releaseError.code
|
|
1027
1001
|
});
|
|
1028
1002
|
}
|
|
1029
|
-
if (releaseActionsError
|
|
1003
|
+
if (releaseActionsError) {
|
|
1030
1004
|
errorsArray.push({
|
|
1031
1005
|
code: releaseActionsError.code
|
|
1032
1006
|
});
|
|
1033
1007
|
}
|
|
1034
1008
|
return /* @__PURE__ */ jsx(
|
|
1035
|
-
|
|
1009
|
+
Redirect,
|
|
1036
1010
|
{
|
|
1037
|
-
to:
|
|
1038
|
-
|
|
1039
|
-
|
|
1011
|
+
to: {
|
|
1012
|
+
pathname: "/plugins/content-releases",
|
|
1013
|
+
state: {
|
|
1014
|
+
errors: errorsArray
|
|
1015
|
+
}
|
|
1040
1016
|
}
|
|
1041
1017
|
}
|
|
1042
1018
|
);
|
|
1043
1019
|
}
|
|
1044
1020
|
if (isError || !releaseActions) {
|
|
1045
|
-
return /* @__PURE__ */ jsx(
|
|
1021
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
|
|
1046
1022
|
}
|
|
1047
1023
|
if (Object.keys(releaseActions).length === 0) {
|
|
1048
|
-
return /* @__PURE__ */ jsx(
|
|
1049
|
-
|
|
1024
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
|
|
1025
|
+
NoContent,
|
|
1050
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
|
+
},
|
|
1051
1031
|
action: /* @__PURE__ */ jsx(
|
|
1052
1032
|
LinkButton,
|
|
1053
1033
|
{
|
|
1054
|
-
|
|
1034
|
+
as: Link$2,
|
|
1055
1035
|
to: {
|
|
1056
1036
|
pathname: "/content-manager"
|
|
1057
1037
|
},
|
|
@@ -1062,52 +1042,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1062
1042
|
defaultMessage: "Open the Content Manager"
|
|
1063
1043
|
})
|
|
1064
1044
|
}
|
|
1065
|
-
)
|
|
1066
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
1067
|
-
content: formatMessage({
|
|
1068
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1069
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1070
|
-
})
|
|
1045
|
+
)
|
|
1071
1046
|
}
|
|
1072
1047
|
) });
|
|
1073
1048
|
}
|
|
1074
|
-
const groupByLabel = formatMessage({
|
|
1075
|
-
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1076
|
-
defaultMessage: "Group by"
|
|
1077
|
-
});
|
|
1078
|
-
const headers = [
|
|
1079
|
-
...displayedHeaders,
|
|
1080
|
-
{
|
|
1081
|
-
label: {
|
|
1082
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1083
|
-
defaultMessage: "content-type"
|
|
1084
|
-
},
|
|
1085
|
-
name: "content-type"
|
|
1086
|
-
},
|
|
1087
|
-
{
|
|
1088
|
-
label: {
|
|
1089
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1090
|
-
defaultMessage: "action"
|
|
1091
|
-
},
|
|
1092
|
-
name: "action"
|
|
1093
|
-
},
|
|
1094
|
-
...!release.releasedAt ? [
|
|
1095
|
-
{
|
|
1096
|
-
label: {
|
|
1097
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1098
|
-
defaultMessage: "status"
|
|
1099
|
-
},
|
|
1100
|
-
name: "status"
|
|
1101
|
-
}
|
|
1102
|
-
] : []
|
|
1103
|
-
];
|
|
1104
1049
|
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1105
|
-
return /* @__PURE__ */ jsx(
|
|
1050
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1106
1051
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1107
1052
|
SingleSelect,
|
|
1108
1053
|
{
|
|
1109
|
-
|
|
1110
|
-
|
|
1054
|
+
"aria-label": formatMessage({
|
|
1055
|
+
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1056
|
+
defaultMessage: "Group by"
|
|
1057
|
+
}),
|
|
1111
1058
|
customizeContent: (value) => formatMessage(
|
|
1112
1059
|
{
|
|
1113
1060
|
id: `content-releases.pages.ReleaseDetails.groupBy.label`,
|
|
@@ -1131,13 +1078,57 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1131
1078
|
...item,
|
|
1132
1079
|
id: Number(item.entry.id)
|
|
1133
1080
|
})),
|
|
1134
|
-
|
|
1135
|
-
isLoading
|
|
1081
|
+
colCount: releaseActions[key].length,
|
|
1082
|
+
isLoading,
|
|
1083
|
+
isFetching,
|
|
1136
1084
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1137
|
-
/* @__PURE__ */
|
|
1138
|
-
|
|
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, {}),
|
|
1139
1130
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1140
|
-
({ id, contentType, locale, type, entry
|
|
1131
|
+
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1141
1132
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
1142
1133
|
hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
|
|
1143
1134
|
/* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
|
|
@@ -1166,8 +1157,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1166
1157
|
action: type,
|
|
1167
1158
|
schema: contentTypes?.[contentType.uid],
|
|
1168
1159
|
components,
|
|
1169
|
-
entry
|
|
1170
|
-
status
|
|
1160
|
+
entry
|
|
1171
1161
|
}
|
|
1172
1162
|
) }),
|
|
1173
1163
|
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
|
|
@@ -1175,7 +1165,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1175
1165
|
ReleaseActionMenu.ReleaseActionEntryLinkItem,
|
|
1176
1166
|
{
|
|
1177
1167
|
contentTypeUid: contentType.uid,
|
|
1178
|
-
|
|
1168
|
+
entryId: entry.id,
|
|
1179
1169
|
locale: locale?.code
|
|
1180
1170
|
}
|
|
1181
1171
|
),
|
|
@@ -1194,73 +1184,54 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1194
1184
|
}
|
|
1195
1185
|
)
|
|
1196
1186
|
] }, `releases-group-${key}`)),
|
|
1197
|
-
/* @__PURE__ */ jsxs(
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
)
|
|
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
|
+
] })
|
|
1208
1198
|
] }) });
|
|
1209
1199
|
};
|
|
1210
1200
|
const ReleaseDetailsPage = () => {
|
|
1211
1201
|
const { formatMessage } = useIntl();
|
|
1212
1202
|
const { releaseId } = useParams();
|
|
1213
|
-
const
|
|
1203
|
+
const toggleNotification = useNotification();
|
|
1214
1204
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1215
|
-
const
|
|
1205
|
+
const { replace } = useHistory();
|
|
1216
1206
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1217
1207
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1218
1208
|
const {
|
|
1219
1209
|
isLoading: isLoadingDetails,
|
|
1220
1210
|
data,
|
|
1221
1211
|
isSuccess: isSuccessDetails
|
|
1222
|
-
} = useGetReleaseQuery(
|
|
1223
|
-
{ id: releaseId },
|
|
1224
|
-
{
|
|
1225
|
-
skip: !releaseId
|
|
1226
|
-
}
|
|
1227
|
-
);
|
|
1228
|
-
const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
|
|
1212
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
1229
1213
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1230
|
-
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1214
|
+
const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
|
|
1231
1215
|
const toggleEditReleaseModal = () => {
|
|
1232
1216
|
setReleaseModalShown((prev) => !prev);
|
|
1233
1217
|
};
|
|
1234
|
-
const getTimezoneValue = () => {
|
|
1235
|
-
if (releaseData?.timezone) {
|
|
1236
|
-
return releaseData.timezone;
|
|
1237
|
-
} else {
|
|
1238
|
-
if (dataTimezone?.data.defaultTimezone) {
|
|
1239
|
-
return dataTimezone.data.defaultTimezone;
|
|
1240
|
-
}
|
|
1241
|
-
return null;
|
|
1242
|
-
}
|
|
1243
|
-
};
|
|
1244
1218
|
const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
|
|
1245
|
-
if (isLoadingDetails
|
|
1219
|
+
if (isLoadingDetails) {
|
|
1246
1220
|
return /* @__PURE__ */ jsx(
|
|
1247
1221
|
ReleaseDetailsLayout,
|
|
1248
1222
|
{
|
|
1249
1223
|
toggleEditReleaseModal,
|
|
1250
1224
|
toggleWarningSubmit,
|
|
1251
|
-
children: /* @__PURE__ */ jsx(
|
|
1225
|
+
children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
|
|
1252
1226
|
}
|
|
1253
1227
|
);
|
|
1254
1228
|
}
|
|
1255
|
-
if (!releaseId) {
|
|
1256
|
-
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1257
|
-
}
|
|
1258
1229
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1259
1230
|
const title = releaseData?.name || "";
|
|
1260
|
-
const timezone =
|
|
1231
|
+
const timezone = releaseData?.timezone ?? null;
|
|
1261
1232
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1262
|
-
const date = scheduledAt ? format
|
|
1263
|
-
const time = scheduledAt ? format
|
|
1233
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
|
|
1234
|
+
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1264
1235
|
const handleEditRelease = async (values) => {
|
|
1265
1236
|
const response = await updateRelease({
|
|
1266
1237
|
id: releaseId,
|
|
@@ -1277,14 +1248,14 @@ const ReleaseDetailsPage = () => {
|
|
|
1277
1248
|
})
|
|
1278
1249
|
});
|
|
1279
1250
|
toggleEditReleaseModal();
|
|
1280
|
-
} else if (
|
|
1251
|
+
} else if (isAxiosError(response.error)) {
|
|
1281
1252
|
toggleNotification({
|
|
1282
|
-
type: "
|
|
1253
|
+
type: "warning",
|
|
1283
1254
|
message: formatAPIError(response.error)
|
|
1284
1255
|
});
|
|
1285
1256
|
} else {
|
|
1286
1257
|
toggleNotification({
|
|
1287
|
-
type: "
|
|
1258
|
+
type: "warning",
|
|
1288
1259
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1289
1260
|
});
|
|
1290
1261
|
}
|
|
@@ -1294,15 +1265,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1294
1265
|
id: releaseId
|
|
1295
1266
|
});
|
|
1296
1267
|
if ("data" in response) {
|
|
1297
|
-
|
|
1298
|
-
} else if (
|
|
1268
|
+
replace("/plugins/content-releases");
|
|
1269
|
+
} else if (isAxiosError(response.error)) {
|
|
1299
1270
|
toggleNotification({
|
|
1300
|
-
type: "
|
|
1271
|
+
type: "warning",
|
|
1301
1272
|
message: formatAPIError(response.error)
|
|
1302
1273
|
});
|
|
1303
1274
|
} else {
|
|
1304
1275
|
toggleNotification({
|
|
1305
|
-
type: "
|
|
1276
|
+
type: "warning",
|
|
1306
1277
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1307
1278
|
});
|
|
1308
1279
|
}
|
|
@@ -1313,11 +1284,10 @@ const ReleaseDetailsPage = () => {
|
|
|
1313
1284
|
toggleEditReleaseModal,
|
|
1314
1285
|
toggleWarningSubmit,
|
|
1315
1286
|
children: [
|
|
1316
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {
|
|
1317
|
-
/* @__PURE__ */ jsx(
|
|
1287
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1288
|
+
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1318
1289
|
ReleaseModal,
|
|
1319
1290
|
{
|
|
1320
|
-
open: releaseModalShown,
|
|
1321
1291
|
handleClose: toggleEditReleaseModal,
|
|
1322
1292
|
handleSubmit: handleEditRelease,
|
|
1323
1293
|
isLoading: isLoadingDetails || isSubmittingForm,
|
|
@@ -1331,21 +1301,30 @@ const ReleaseDetailsPage = () => {
|
|
|
1331
1301
|
}
|
|
1332
1302
|
}
|
|
1333
1303
|
),
|
|
1334
|
-
/* @__PURE__ */ jsx(
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
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
|
+
)
|
|
1338
1317
|
]
|
|
1339
1318
|
}
|
|
1340
1319
|
);
|
|
1341
1320
|
};
|
|
1342
1321
|
const App = () => {
|
|
1343
|
-
return /* @__PURE__ */ jsx(
|
|
1344
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1345
|
-
/* @__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 })
|
|
1346
1325
|
] }) });
|
|
1347
1326
|
};
|
|
1348
1327
|
export {
|
|
1349
1328
|
App
|
|
1350
1329
|
};
|
|
1351
|
-
//# sourceMappingURL=App-
|
|
1330
|
+
//# sourceMappingURL=App-jrh58sXY.mjs.map
|