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