@strapi/content-releases 0.0.0-experimental.f75e3c6d67cc47c64ab37479efdbb7b43be50b78 → 0.0.0-experimental.f77206734629a2b88793a7a8abca40388843c656
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-DUmziQ17.js → App-HjWtUYmc.js} +388 -401
- package/dist/_chunks/App-HjWtUYmc.js.map +1 -0
- package/dist/_chunks/{App-D_6Y9N2F.mjs → App-gu1aiP6i.mjs} +364 -378
- package/dist/_chunks/App-gu1aiP6i.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-DtFJ5ViE.js → en-HrREghh3.js} +1 -1
- package/dist/_chunks/en-HrREghh3.js.map +1 -0
- package/dist/_chunks/{en-B9Ur3VsE.mjs → en-ltT1TlKQ.mjs} +1 -1
- package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
- package/dist/_chunks/{index-C5Hc767q.js → index-ZNwxYN8H.js} +475 -177
- package/dist/_chunks/index-ZNwxYN8H.js.map +1 -0
- package/dist/_chunks/{index-BomF0-yY.mjs → index-mvj9PSKd.mjs} +476 -180
- package/dist/_chunks/index-mvj9PSKd.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 +86 -83
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +86 -84
- package/dist/server/index.mjs.map +1 -1
- package/package.json +36 -29
- package/dist/_chunks/App-DUmziQ17.js.map +0 -1
- package/dist/_chunks/App-D_6Y9N2F.mjs.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/en-B9Ur3VsE.mjs.map +0 -1
- package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
- package/dist/_chunks/index-BomF0-yY.mjs.map +0 -1
- package/dist/_chunks/index-C5Hc767q.js.map +0 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -22
- 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/ReleaseActionOptions.d.ts +0 -9
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
- package/dist/admin/src/constants.d.ts +0 -58
- package/dist/admin/src/index.d.ts +0 -3
- 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/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 -105
- 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 -1
- 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 -12
- package/dist/server/src/constants.d.ts.map +0 -1
- package/dist/server/src/content-types/index.d.ts +0 -99
- 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 -50
- 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 -49
- package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
- package/dist/server/src/controllers/index.d.ts +0 -20
- 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 -12
- package/dist/server/src/controllers/release.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
- package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release.d.ts +0 -2
- package/dist/server/src/controllers/validation/release.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 -2096
- package/dist/server/src/index.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 -35
- 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/services/index.d.ts +0 -1826
- package/dist/server/src/services/index.d.ts.map +0 -1
- package/dist/server/src/services/release.d.ts +0 -66
- 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/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 -14
- package/dist/server/src/utils/index.d.ts.map +0 -1
- package/dist/shared/contracts/release-actions.d.ts +0 -131
- package/dist/shared/contracts/release-actions.d.ts.map +0 -1
- package/dist/shared/contracts/releases.d.ts +0 -182
- package/dist/shared/contracts/releases.d.ts.map +0 -1
- package/dist/shared/types.d.ts +0 -24
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/validation-schemas.d.ts +0 -2
- package/dist/shared/validation-schemas.d.ts.map +0 -1
|
@@ -1,51 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useNotification, useAPIErrorHandler, useQueryParams, useTracking,
|
|
3
|
-
import { useLocation,
|
|
4
|
-
import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f 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-mvj9PSKd.mjs";
|
|
5
5
|
import * as React from "react";
|
|
6
|
-
import { unstable_useDocument } from "@strapi/
|
|
7
|
-
import { ModalLayout, ModalHeader, Typography, ModalBody, Flex,
|
|
8
|
-
import {
|
|
9
|
-
import { EmptyDocuments } from "@strapi/icons
|
|
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
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
16
|
import * as yup from "yup";
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
);
|
|
17
|
+
import "@reduxjs/toolkit/query";
|
|
18
|
+
import "axios";
|
|
19
|
+
import "@reduxjs/toolkit/query/react";
|
|
20
|
+
import "react-redux";
|
|
49
21
|
const RELEASE_SCHEMA = yup.object().shape({
|
|
50
22
|
name: yup.string().trim().required(),
|
|
51
23
|
scheduledAt: yup.string().nullable(),
|
|
@@ -115,119 +87,120 @@ const ReleaseModal = ({
|
|
|
115
87
|
},
|
|
116
88
|
validationSchema: RELEASE_SCHEMA,
|
|
117
89
|
validateOnChange: false,
|
|
118
|
-
children: ({ values, errors, handleChange, setFieldValue }) => {
|
|
119
|
-
|
|
120
|
-
/* @__PURE__ */ jsx(
|
|
121
|
-
|
|
122
|
-
|
|
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({
|
|
123
96
|
id: "content-releases.modal.form.input.label.release-name",
|
|
124
97
|
defaultMessage: "Name"
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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({
|
|
166
142
|
id: "content-releases.modal.form.input.label.date",
|
|
167
143
|
defaultMessage: "Date"
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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: () => {
|
|
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({
|
|
191
167
|
id: "content-releases.modal.form.input.label.time",
|
|
192
168
|
defaultMessage: "Time"
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
),
|
|
210
|
-
/* @__PURE__ */ jsx(Field.Error, {})
|
|
211
|
-
] }) })
|
|
212
|
-
] }),
|
|
213
|
-
/* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
|
|
214
|
-
] })
|
|
215
|
-
] }) }),
|
|
216
|
-
/* @__PURE__ */ jsx(
|
|
217
|
-
ModalFooter,
|
|
218
|
-
{
|
|
219
|
-
startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
|
|
220
|
-
endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
|
|
221
|
-
{
|
|
222
|
-
id: "content-releases.modal.form.button.submit",
|
|
223
|
-
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
224
|
-
},
|
|
225
|
-
{ isCreatingRelease }
|
|
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
|
+
setFieldValue("time", "");
|
|
181
|
+
},
|
|
182
|
+
value: values.time || void 0,
|
|
183
|
+
required: true
|
|
184
|
+
}
|
|
226
185
|
) })
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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(
|
|
195
|
+
{
|
|
196
|
+
id: "content-releases.modal.form.button.submit",
|
|
197
|
+
defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
|
|
198
|
+
},
|
|
199
|
+
{ isCreatingRelease }
|
|
200
|
+
) })
|
|
201
|
+
}
|
|
202
|
+
)
|
|
203
|
+
] })
|
|
231
204
|
}
|
|
232
205
|
)
|
|
233
206
|
] });
|
|
@@ -256,35 +229,31 @@ const TimezoneComponent = ({ timezoneOptions }) => {
|
|
|
256
229
|
}
|
|
257
230
|
}
|
|
258
231
|
}, [setFieldValue, values.date, values.timezone]);
|
|
259
|
-
return /* @__PURE__ */
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
{
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
};
|
|
285
|
-
const useTypedDispatch = useDispatch;
|
|
286
|
-
const isBaseQueryError = (error) => {
|
|
287
|
-
return typeof error !== "undefined" && error.name !== void 0;
|
|
232
|
+
return /* @__PURE__ */ jsx(
|
|
233
|
+
Combobox,
|
|
234
|
+
{
|
|
235
|
+
label: formatMessage({
|
|
236
|
+
id: "content-releases.modal.form.input.label.timezone",
|
|
237
|
+
defaultMessage: "Timezone"
|
|
238
|
+
}),
|
|
239
|
+
autocomplete: { type: "list", filter: "contains" },
|
|
240
|
+
name: "timezone",
|
|
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,
|
|
253
|
+
required: true,
|
|
254
|
+
children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
|
|
255
|
+
}
|
|
256
|
+
);
|
|
288
257
|
};
|
|
289
258
|
const LinkCard = styled(Link)`
|
|
290
259
|
display: block;
|
|
@@ -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, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, {
|
|
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,7 +347,7 @@ 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,
|
|
@@ -388,9 +357,9 @@ const ReleasesPage = () => {
|
|
|
388
357
|
const tabRef = React.useRef(null);
|
|
389
358
|
const location = useLocation();
|
|
390
359
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
391
|
-
const
|
|
360
|
+
const toggleNotification = useNotification();
|
|
392
361
|
const { formatMessage } = useIntl();
|
|
393
|
-
const
|
|
362
|
+
const { push, replace } = useHistory();
|
|
394
363
|
const { formatAPIError } = useAPIErrorHandler();
|
|
395
364
|
const [{ query }, setQuery] = useQueryParams();
|
|
396
365
|
const response = useGetReleasesQuery(query);
|
|
@@ -398,16 +367,13 @@ const ReleasesPage = () => {
|
|
|
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
370
|
const { isLoading, isSuccess, isError } = response;
|
|
405
371
|
const activeTab = response?.currentData?.meta?.activeTab || "pending";
|
|
406
372
|
const activeTabIndex = ["pending", "done"].indexOf(activeTab);
|
|
407
373
|
React.useEffect(() => {
|
|
408
374
|
if (location?.state?.errors) {
|
|
409
375
|
toggleNotification({
|
|
410
|
-
type: "
|
|
376
|
+
type: "warning",
|
|
411
377
|
title: formatMessage({
|
|
412
378
|
id: "content-releases.pages.Releases.notification.error.title",
|
|
413
379
|
defaultMessage: "Your request could not be processed."
|
|
@@ -417,9 +383,9 @@ const ReleasesPage = () => {
|
|
|
417
383
|
defaultMessage: "Please try again or open another release."
|
|
418
384
|
})
|
|
419
385
|
});
|
|
420
|
-
|
|
386
|
+
replace({ state: null });
|
|
421
387
|
}
|
|
422
|
-
}, [formatMessage, location?.state?.errors,
|
|
388
|
+
}, [formatMessage, location?.state?.errors, replace, toggleNotification]);
|
|
423
389
|
React.useEffect(() => {
|
|
424
390
|
if (tabRef.current) {
|
|
425
391
|
tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
|
|
@@ -429,7 +395,7 @@ const ReleasesPage = () => {
|
|
|
429
395
|
setReleaseModalShown((prev) => !prev);
|
|
430
396
|
};
|
|
431
397
|
if (isLoading) {
|
|
432
|
-
return /* @__PURE__ */ jsx(
|
|
398
|
+
return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
433
399
|
}
|
|
434
400
|
const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
|
|
435
401
|
const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
|
|
@@ -460,22 +426,22 @@ const ReleasesPage = () => {
|
|
|
460
426
|
})
|
|
461
427
|
});
|
|
462
428
|
trackUsage("didCreateRelease");
|
|
463
|
-
|
|
464
|
-
} else if (
|
|
429
|
+
push(`/plugins/content-releases/${response2.data.data.id}`);
|
|
430
|
+
} else if (isAxiosError(response2.error)) {
|
|
465
431
|
toggleNotification({
|
|
466
|
-
type: "
|
|
432
|
+
type: "warning",
|
|
467
433
|
message: formatAPIError(response2.error)
|
|
468
434
|
});
|
|
469
435
|
} else {
|
|
470
436
|
toggleNotification({
|
|
471
|
-
type: "
|
|
437
|
+
type: "warning",
|
|
472
438
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
473
439
|
});
|
|
474
440
|
}
|
|
475
441
|
};
|
|
476
442
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
|
|
477
443
|
/* @__PURE__ */ jsx(
|
|
478
|
-
|
|
444
|
+
HeaderLayout,
|
|
479
445
|
{
|
|
480
446
|
title: formatMessage({
|
|
481
447
|
id: "content-releases.pages.Releases.title",
|
|
@@ -485,7 +451,7 @@ const ReleasesPage = () => {
|
|
|
485
451
|
id: "content-releases.pages.Releases.header-subtitle",
|
|
486
452
|
defaultMessage: "Create and manage content updates"
|
|
487
453
|
}),
|
|
488
|
-
primaryAction:
|
|
454
|
+
primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
|
|
489
455
|
Button,
|
|
490
456
|
{
|
|
491
457
|
startIcon: /* @__PURE__ */ jsx(Plus, {}),
|
|
@@ -496,10 +462,10 @@ const ReleasesPage = () => {
|
|
|
496
462
|
defaultMessage: "New release"
|
|
497
463
|
})
|
|
498
464
|
}
|
|
499
|
-
)
|
|
465
|
+
) })
|
|
500
466
|
}
|
|
501
467
|
),
|
|
502
|
-
/* @__PURE__ */ jsx(
|
|
468
|
+
/* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
503
469
|
hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
|
|
504
470
|
StyledAlert,
|
|
505
471
|
{
|
|
@@ -575,17 +541,23 @@ const ReleasesPage = () => {
|
|
|
575
541
|
]
|
|
576
542
|
}
|
|
577
543
|
),
|
|
578
|
-
/* @__PURE__ */ jsxs(
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
544
|
+
response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
|
|
545
|
+
/* @__PURE__ */ jsx(
|
|
546
|
+
PageSizeURLQuery,
|
|
547
|
+
{
|
|
548
|
+
options: ["8", "16", "32", "64"],
|
|
549
|
+
defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
|
|
550
|
+
}
|
|
551
|
+
),
|
|
552
|
+
/* @__PURE__ */ jsx(
|
|
553
|
+
PaginationURLQuery,
|
|
554
|
+
{
|
|
555
|
+
pagination: {
|
|
556
|
+
pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
)
|
|
560
|
+
] }) : null
|
|
589
561
|
] }) }),
|
|
590
562
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
591
563
|
ReleaseModal,
|
|
@@ -613,7 +585,7 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
613
585
|
}
|
|
614
586
|
|
|
615
587
|
&:hover {
|
|
616
|
-
background: ${({ theme,
|
|
588
|
+
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
617
589
|
}
|
|
618
590
|
`;
|
|
619
591
|
const PencilIcon = styled(Pencil)`
|
|
@@ -633,34 +605,29 @@ const TrashIcon = styled(Trash)`
|
|
|
633
605
|
const TypographyMaxWidth = styled(Typography)`
|
|
634
606
|
max-width: 300px;
|
|
635
607
|
`;
|
|
636
|
-
const EntryValidationText = ({ action, schema, entry }) => {
|
|
608
|
+
const EntryValidationText = ({ action, schema, components, entry }) => {
|
|
637
609
|
const { formatMessage } = useIntl();
|
|
638
|
-
const { validate } = unstable_useDocument(
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
skip: !schema
|
|
645
|
-
}
|
|
646
|
-
);
|
|
647
|
-
const errors = validate(entry) ?? {};
|
|
610
|
+
const { validate } = unstable_useDocument();
|
|
611
|
+
const { errors } = validate(entry, {
|
|
612
|
+
contentType: schema,
|
|
613
|
+
components,
|
|
614
|
+
isCreatingEntry: false
|
|
615
|
+
});
|
|
648
616
|
if (Object.keys(errors).length > 0) {
|
|
649
617
|
const validationErrorsMessages = Object.entries(errors).map(
|
|
650
618
|
([key, value]) => formatMessage(
|
|
651
|
-
// @ts-expect-error – TODO: fix this will better checks
|
|
652
619
|
{ id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
|
|
653
620
|
{ field: key }
|
|
654
621
|
)
|
|
655
622
|
).join(" ");
|
|
656
623
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
657
|
-
/* @__PURE__ */ jsx(
|
|
624
|
+
/* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
|
|
658
625
|
/* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
|
|
659
626
|
] });
|
|
660
627
|
}
|
|
661
628
|
if (action == "publish") {
|
|
662
629
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
663
|
-
/* @__PURE__ */ jsx(
|
|
630
|
+
/* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
|
|
664
631
|
entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
665
632
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
|
|
666
633
|
defaultMessage: "Already published"
|
|
@@ -671,7 +638,7 @@ const EntryValidationText = ({ action, schema, entry }) => {
|
|
|
671
638
|
] });
|
|
672
639
|
}
|
|
673
640
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
674
|
-
/* @__PURE__ */ jsx(
|
|
641
|
+
/* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
|
|
675
642
|
!entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
|
|
676
643
|
id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
|
|
677
644
|
defaultMessage: "Already unpublished"
|
|
@@ -691,23 +658,20 @@ const ReleaseDetailsLayout = ({
|
|
|
691
658
|
const {
|
|
692
659
|
data,
|
|
693
660
|
isLoading: isLoadingDetails,
|
|
661
|
+
isError,
|
|
694
662
|
error
|
|
695
|
-
} = useGetReleaseQuery(
|
|
696
|
-
{ id: releaseId },
|
|
697
|
-
{
|
|
698
|
-
skip: !releaseId
|
|
699
|
-
}
|
|
700
|
-
);
|
|
663
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
701
664
|
const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
|
|
702
|
-
const
|
|
665
|
+
const toggleNotification = useNotification();
|
|
703
666
|
const { formatAPIError } = useAPIErrorHandler();
|
|
704
|
-
const {
|
|
705
|
-
|
|
667
|
+
const {
|
|
668
|
+
allowedActions: { canUpdate, canDelete }
|
|
669
|
+
} = useRBAC(PERMISSIONS);
|
|
706
670
|
const dispatch = useTypedDispatch();
|
|
707
671
|
const { trackUsage } = useTracking();
|
|
708
672
|
const release = data?.data;
|
|
709
|
-
const handlePublishRelease =
|
|
710
|
-
const response = await publishRelease({ id });
|
|
673
|
+
const handlePublishRelease = async () => {
|
|
674
|
+
const response = await publishRelease({ id: releaseId });
|
|
711
675
|
if ("data" in response) {
|
|
712
676
|
toggleNotification({
|
|
713
677
|
type: "success",
|
|
@@ -722,14 +686,14 @@ const ReleaseDetailsLayout = ({
|
|
|
722
686
|
totalPublishedEntries,
|
|
723
687
|
totalUnpublishedEntries
|
|
724
688
|
});
|
|
725
|
-
} else if (
|
|
689
|
+
} else if (isAxiosError(response.error)) {
|
|
726
690
|
toggleNotification({
|
|
727
|
-
type: "
|
|
691
|
+
type: "warning",
|
|
728
692
|
message: formatAPIError(response.error)
|
|
729
693
|
});
|
|
730
694
|
} else {
|
|
731
695
|
toggleNotification({
|
|
732
|
-
type: "
|
|
696
|
+
type: "warning",
|
|
733
697
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
734
698
|
});
|
|
735
699
|
}
|
|
@@ -755,20 +719,21 @@ const ReleaseDetailsLayout = ({
|
|
|
755
719
|
return release.createdBy.email;
|
|
756
720
|
};
|
|
757
721
|
if (isLoadingDetails) {
|
|
758
|
-
return /* @__PURE__ */ jsx(
|
|
722
|
+
return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
759
723
|
}
|
|
760
|
-
if (
|
|
724
|
+
if (isError || !release) {
|
|
761
725
|
return /* @__PURE__ */ jsx(
|
|
762
|
-
|
|
726
|
+
Redirect,
|
|
763
727
|
{
|
|
764
|
-
to:
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
728
|
+
to: {
|
|
729
|
+
pathname: "/plugins/content-releases",
|
|
730
|
+
state: {
|
|
731
|
+
errors: [
|
|
732
|
+
{
|
|
733
|
+
code: error?.code
|
|
734
|
+
}
|
|
735
|
+
]
|
|
736
|
+
}
|
|
772
737
|
}
|
|
773
738
|
}
|
|
774
739
|
);
|
|
@@ -805,30 +770,34 @@ const ReleaseDetailsLayout = ({
|
|
|
805
770
|
) : "";
|
|
806
771
|
return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
|
|
807
772
|
/* @__PURE__ */ jsx(
|
|
808
|
-
|
|
773
|
+
HeaderLayout,
|
|
809
774
|
{
|
|
810
775
|
title: release.name,
|
|
811
776
|
subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
|
|
812
777
|
/* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
|
|
813
778
|
/* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
|
|
814
779
|
] }),
|
|
815
|
-
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
|
+
}) }),
|
|
816
784
|
primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
817
785
|
/* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
818
786
|
/* @__PURE__ */ jsx(
|
|
819
787
|
Menu.Trigger,
|
|
820
788
|
{
|
|
789
|
+
as: IconButton,
|
|
821
790
|
paddingLeft: 2,
|
|
822
791
|
paddingRight: 2,
|
|
823
792
|
"aria-label": formatMessage({
|
|
824
793
|
id: "content-releases.header.actions.open-release-actions",
|
|
825
794
|
defaultMessage: "Release edit and delete menu"
|
|
826
795
|
}),
|
|
827
|
-
|
|
828
|
-
|
|
796
|
+
icon: /* @__PURE__ */ jsx(More, {}),
|
|
797
|
+
variant: "tertiary"
|
|
829
798
|
}
|
|
830
799
|
),
|
|
831
|
-
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end",
|
|
800
|
+
/* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
|
|
832
801
|
/* @__PURE__ */ jsxs(
|
|
833
802
|
Flex,
|
|
834
803
|
{
|
|
@@ -850,7 +819,7 @@ const ReleaseDetailsLayout = ({
|
|
|
850
819
|
{
|
|
851
820
|
disabled: !canDelete,
|
|
852
821
|
onSelect: toggleWarningSubmit,
|
|
853
|
-
|
|
822
|
+
variant: "danger",
|
|
854
823
|
children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
|
|
855
824
|
/* @__PURE__ */ jsx(TrashIcon, {}),
|
|
856
825
|
/* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
|
|
@@ -895,12 +864,12 @@ const ReleaseDetailsLayout = ({
|
|
|
895
864
|
id: "content-releases.header.actions.refresh",
|
|
896
865
|
defaultMessage: "Refresh"
|
|
897
866
|
}) }),
|
|
898
|
-
|
|
867
|
+
/* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
|
|
899
868
|
Button,
|
|
900
869
|
{
|
|
901
870
|
size: "S",
|
|
902
871
|
variant: "default",
|
|
903
|
-
onClick: handlePublishRelease
|
|
872
|
+
onClick: handlePublishRelease,
|
|
904
873
|
loading: isPublishing,
|
|
905
874
|
disabled: release.actions.meta.count === 0,
|
|
906
875
|
children: formatMessage({
|
|
@@ -908,7 +877,7 @@ const ReleaseDetailsLayout = ({
|
|
|
908
877
|
defaultMessage: "Publish"
|
|
909
878
|
})
|
|
910
879
|
}
|
|
911
|
-
)
|
|
880
|
+
) })
|
|
912
881
|
] })
|
|
913
882
|
}
|
|
914
883
|
),
|
|
@@ -935,30 +904,44 @@ const getGroupByOptionLabel = (value) => {
|
|
|
935
904
|
defaultMessage: "Content-Types"
|
|
936
905
|
};
|
|
937
906
|
};
|
|
938
|
-
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 = () => {
|
|
939
923
|
const { formatMessage } = useIntl();
|
|
924
|
+
const { releaseId } = useParams();
|
|
940
925
|
const [{ query }, setQuery] = useQueryParams();
|
|
941
|
-
const
|
|
926
|
+
const toggleNotification = useNotification();
|
|
942
927
|
const { formatAPIError } = useAPIErrorHandler();
|
|
943
928
|
const {
|
|
944
929
|
data: releaseData,
|
|
945
930
|
isLoading: isReleaseLoading,
|
|
931
|
+
isError: isReleaseError,
|
|
946
932
|
error: releaseError
|
|
947
933
|
} = useGetReleaseQuery({ id: releaseId });
|
|
948
934
|
const {
|
|
949
935
|
allowedActions: { canUpdate }
|
|
950
936
|
} = useRBAC(PERMISSIONS);
|
|
951
|
-
const runHookWaterfall = useStrapiApp(
|
|
952
|
-
const {
|
|
937
|
+
const { runHookWaterfall } = useStrapiApp();
|
|
938
|
+
const {
|
|
939
|
+
displayedHeaders,
|
|
940
|
+
hasI18nEnabled
|
|
941
|
+
} = runHookWaterfall(
|
|
953
942
|
"ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
|
|
954
943
|
{
|
|
955
|
-
displayedHeaders:
|
|
956
|
-
label: formatMessage({
|
|
957
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
958
|
-
defaultMessage: "locale"
|
|
959
|
-
}),
|
|
960
|
-
name: "locale"
|
|
961
|
-
},
|
|
944
|
+
displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
|
|
962
945
|
hasI18nEnabled: false
|
|
963
946
|
}
|
|
964
947
|
);
|
|
@@ -990,59 +973,65 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
990
973
|
// We are passing the action path to found the position in the cache of the action for optimistic updates
|
|
991
974
|
});
|
|
992
975
|
if ("error" in response) {
|
|
993
|
-
if (
|
|
976
|
+
if (isAxiosError(response.error)) {
|
|
994
977
|
toggleNotification({
|
|
995
|
-
type: "
|
|
978
|
+
type: "warning",
|
|
996
979
|
message: formatAPIError(response.error)
|
|
997
980
|
});
|
|
998
981
|
} else {
|
|
999
982
|
toggleNotification({
|
|
1000
|
-
type: "
|
|
983
|
+
type: "warning",
|
|
1001
984
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1002
985
|
});
|
|
1003
986
|
}
|
|
1004
987
|
}
|
|
1005
988
|
};
|
|
1006
989
|
if (isLoading || isReleaseLoading) {
|
|
1007
|
-
return /* @__PURE__ */ jsx(
|
|
990
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
|
|
1008
991
|
}
|
|
1009
992
|
const releaseActions = data?.data;
|
|
1010
993
|
const releaseMeta = data?.meta;
|
|
1011
994
|
const contentTypes = releaseMeta?.contentTypes || {};
|
|
1012
995
|
const components = releaseMeta?.components || {};
|
|
1013
|
-
if (
|
|
996
|
+
if (isReleaseError || !release) {
|
|
1014
997
|
const errorsArray = [];
|
|
1015
|
-
if (releaseError
|
|
998
|
+
if (releaseError) {
|
|
1016
999
|
errorsArray.push({
|
|
1017
1000
|
code: releaseError.code
|
|
1018
1001
|
});
|
|
1019
1002
|
}
|
|
1020
|
-
if (releaseActionsError
|
|
1003
|
+
if (releaseActionsError) {
|
|
1021
1004
|
errorsArray.push({
|
|
1022
1005
|
code: releaseActionsError.code
|
|
1023
1006
|
});
|
|
1024
1007
|
}
|
|
1025
1008
|
return /* @__PURE__ */ jsx(
|
|
1026
|
-
|
|
1009
|
+
Redirect,
|
|
1027
1010
|
{
|
|
1028
|
-
to:
|
|
1029
|
-
|
|
1030
|
-
|
|
1011
|
+
to: {
|
|
1012
|
+
pathname: "/plugins/content-releases",
|
|
1013
|
+
state: {
|
|
1014
|
+
errors: errorsArray
|
|
1015
|
+
}
|
|
1031
1016
|
}
|
|
1032
1017
|
}
|
|
1033
1018
|
);
|
|
1034
1019
|
}
|
|
1035
1020
|
if (isError || !releaseActions) {
|
|
1036
|
-
return /* @__PURE__ */ jsx(
|
|
1021
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
|
|
1037
1022
|
}
|
|
1038
1023
|
if (Object.keys(releaseActions).length === 0) {
|
|
1039
|
-
return /* @__PURE__ */ jsx(
|
|
1040
|
-
|
|
1024
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
|
|
1025
|
+
NoContent,
|
|
1041
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
|
+
},
|
|
1042
1031
|
action: /* @__PURE__ */ jsx(
|
|
1043
1032
|
LinkButton,
|
|
1044
1033
|
{
|
|
1045
|
-
|
|
1034
|
+
as: Link$2,
|
|
1046
1035
|
to: {
|
|
1047
1036
|
pathname: "/content-manager"
|
|
1048
1037
|
},
|
|
@@ -1053,59 +1042,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1053
1042
|
defaultMessage: "Open the Content Manager"
|
|
1054
1043
|
})
|
|
1055
1044
|
}
|
|
1056
|
-
)
|
|
1057
|
-
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
1058
|
-
content: formatMessage({
|
|
1059
|
-
id: "content-releases.pages.Details.tab.emptyEntries",
|
|
1060
|
-
defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
|
|
1061
|
-
})
|
|
1045
|
+
)
|
|
1062
1046
|
}
|
|
1063
1047
|
) });
|
|
1064
1048
|
}
|
|
1065
|
-
const groupByLabel = formatMessage({
|
|
1066
|
-
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1067
|
-
defaultMessage: "Group by"
|
|
1068
|
-
});
|
|
1069
|
-
const headers = [
|
|
1070
|
-
// ...displayedHeaders,
|
|
1071
|
-
{
|
|
1072
|
-
label: formatMessage({
|
|
1073
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.name",
|
|
1074
|
-
defaultMessage: "name"
|
|
1075
|
-
}),
|
|
1076
|
-
name: "name"
|
|
1077
|
-
},
|
|
1078
|
-
{
|
|
1079
|
-
label: formatMessage({
|
|
1080
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
|
|
1081
|
-
defaultMessage: "content-type"
|
|
1082
|
-
}),
|
|
1083
|
-
name: "content-type"
|
|
1084
|
-
},
|
|
1085
|
-
{
|
|
1086
|
-
label: formatMessage({
|
|
1087
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.action",
|
|
1088
|
-
defaultMessage: "action"
|
|
1089
|
-
}),
|
|
1090
|
-
name: "action"
|
|
1091
|
-
},
|
|
1092
|
-
...!release.releasedAt ? [
|
|
1093
|
-
{
|
|
1094
|
-
label: formatMessage({
|
|
1095
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.status",
|
|
1096
|
-
defaultMessage: "status"
|
|
1097
|
-
}),
|
|
1098
|
-
name: "status"
|
|
1099
|
-
}
|
|
1100
|
-
] : []
|
|
1101
|
-
];
|
|
1102
1049
|
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
|
|
1103
|
-
return /* @__PURE__ */ jsx(
|
|
1050
|
+
return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
|
|
1104
1051
|
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
1105
1052
|
SingleSelect,
|
|
1106
1053
|
{
|
|
1107
|
-
|
|
1108
|
-
|
|
1054
|
+
"aria-label": formatMessage({
|
|
1055
|
+
id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
|
|
1056
|
+
defaultMessage: "Group by"
|
|
1057
|
+
}),
|
|
1109
1058
|
customizeContent: (value) => formatMessage(
|
|
1110
1059
|
{
|
|
1111
1060
|
id: `content-releases.pages.ReleaseDetails.groupBy.label`,
|
|
@@ -1129,11 +1078,55 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1129
1078
|
...item,
|
|
1130
1079
|
id: Number(item.entry.id)
|
|
1131
1080
|
})),
|
|
1132
|
-
|
|
1133
|
-
isLoading
|
|
1081
|
+
colCount: releaseActions[key].length,
|
|
1082
|
+
isLoading,
|
|
1083
|
+
isFetching,
|
|
1134
1084
|
children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
|
1135
|
-
/* @__PURE__ */
|
|
1136
|
-
|
|
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, {}),
|
|
1137
1130
|
/* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
|
|
1138
1131
|
({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
1139
1132
|
/* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
|
|
@@ -1191,39 +1184,34 @@ const ReleaseDetailsBody = ({ releaseId }) => {
|
|
|
1191
1184
|
}
|
|
1192
1185
|
)
|
|
1193
1186
|
] }, `releases-group-${key}`)),
|
|
1194
|
-
/* @__PURE__ */ jsxs(
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
)
|
|
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
|
+
] })
|
|
1205
1198
|
] }) });
|
|
1206
1199
|
};
|
|
1207
1200
|
const ReleaseDetailsPage = () => {
|
|
1208
1201
|
const { formatMessage } = useIntl();
|
|
1209
1202
|
const { releaseId } = useParams();
|
|
1210
|
-
const
|
|
1203
|
+
const toggleNotification = useNotification();
|
|
1211
1204
|
const { formatAPIError } = useAPIErrorHandler();
|
|
1212
|
-
const
|
|
1205
|
+
const { replace } = useHistory();
|
|
1213
1206
|
const [releaseModalShown, setReleaseModalShown] = React.useState(false);
|
|
1214
1207
|
const [showWarningSubmit, setWarningSubmit] = React.useState(false);
|
|
1215
1208
|
const {
|
|
1216
1209
|
isLoading: isLoadingDetails,
|
|
1217
1210
|
data,
|
|
1218
1211
|
isSuccess: isSuccessDetails
|
|
1219
|
-
} = useGetReleaseQuery(
|
|
1220
|
-
{ id: releaseId },
|
|
1221
|
-
{
|
|
1222
|
-
skip: !releaseId
|
|
1223
|
-
}
|
|
1224
|
-
);
|
|
1212
|
+
} = useGetReleaseQuery({ id: releaseId });
|
|
1225
1213
|
const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
|
|
1226
|
-
const [deleteRelease] = useDeleteReleaseMutation();
|
|
1214
|
+
const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
|
|
1227
1215
|
const toggleEditReleaseModal = () => {
|
|
1228
1216
|
setReleaseModalShown((prev) => !prev);
|
|
1229
1217
|
};
|
|
@@ -1234,18 +1222,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1234
1222
|
{
|
|
1235
1223
|
toggleEditReleaseModal,
|
|
1236
1224
|
toggleWarningSubmit,
|
|
1237
|
-
children: /* @__PURE__ */ jsx(
|
|
1225
|
+
children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
|
|
1238
1226
|
}
|
|
1239
1227
|
);
|
|
1240
1228
|
}
|
|
1241
|
-
if (!releaseId) {
|
|
1242
|
-
return /* @__PURE__ */ jsx(Navigate, { to: ".." });
|
|
1243
|
-
}
|
|
1244
1229
|
const releaseData = isSuccessDetails && data?.data || null;
|
|
1245
1230
|
const title = releaseData?.name || "";
|
|
1246
1231
|
const timezone = releaseData?.timezone ?? null;
|
|
1247
1232
|
const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
|
|
1248
|
-
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") :
|
|
1233
|
+
const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
|
|
1249
1234
|
const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
|
|
1250
1235
|
const handleEditRelease = async (values) => {
|
|
1251
1236
|
const response = await updateRelease({
|
|
@@ -1263,14 +1248,14 @@ const ReleaseDetailsPage = () => {
|
|
|
1263
1248
|
})
|
|
1264
1249
|
});
|
|
1265
1250
|
toggleEditReleaseModal();
|
|
1266
|
-
} else if (
|
|
1251
|
+
} else if (isAxiosError(response.error)) {
|
|
1267
1252
|
toggleNotification({
|
|
1268
|
-
type: "
|
|
1253
|
+
type: "warning",
|
|
1269
1254
|
message: formatAPIError(response.error)
|
|
1270
1255
|
});
|
|
1271
1256
|
} else {
|
|
1272
1257
|
toggleNotification({
|
|
1273
|
-
type: "
|
|
1258
|
+
type: "warning",
|
|
1274
1259
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1275
1260
|
});
|
|
1276
1261
|
}
|
|
@@ -1280,15 +1265,15 @@ const ReleaseDetailsPage = () => {
|
|
|
1280
1265
|
id: releaseId
|
|
1281
1266
|
});
|
|
1282
1267
|
if ("data" in response) {
|
|
1283
|
-
|
|
1284
|
-
} else if (
|
|
1268
|
+
replace("/plugins/content-releases");
|
|
1269
|
+
} else if (isAxiosError(response.error)) {
|
|
1285
1270
|
toggleNotification({
|
|
1286
|
-
type: "
|
|
1271
|
+
type: "warning",
|
|
1287
1272
|
message: formatAPIError(response.error)
|
|
1288
1273
|
});
|
|
1289
1274
|
} else {
|
|
1290
1275
|
toggleNotification({
|
|
1291
|
-
type: "
|
|
1276
|
+
type: "warning",
|
|
1292
1277
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1293
1278
|
});
|
|
1294
1279
|
}
|
|
@@ -1299,7 +1284,7 @@ const ReleaseDetailsPage = () => {
|
|
|
1299
1284
|
toggleEditReleaseModal,
|
|
1300
1285
|
toggleWarningSubmit,
|
|
1301
1286
|
children: [
|
|
1302
|
-
/* @__PURE__ */ jsx(ReleaseDetailsBody, {
|
|
1287
|
+
/* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
|
|
1303
1288
|
releaseModalShown && /* @__PURE__ */ jsx(
|
|
1304
1289
|
ReleaseModal,
|
|
1305
1290
|
{
|
|
@@ -1319,13 +1304,14 @@ const ReleaseDetailsPage = () => {
|
|
|
1319
1304
|
/* @__PURE__ */ jsx(
|
|
1320
1305
|
ConfirmDialog,
|
|
1321
1306
|
{
|
|
1322
|
-
|
|
1323
|
-
onClose: toggleWarningSubmit,
|
|
1324
|
-
onConfirm: handleDeleteRelease,
|
|
1325
|
-
children: formatMessage({
|
|
1307
|
+
bodyText: {
|
|
1326
1308
|
id: "content-releases.dialog.confirmation-message",
|
|
1327
1309
|
defaultMessage: "Are you sure you want to delete this release?"
|
|
1328
|
-
}
|
|
1310
|
+
},
|
|
1311
|
+
isOpen: showWarningSubmit,
|
|
1312
|
+
isConfirmButtonLoading: isDeletingRelease,
|
|
1313
|
+
onToggleDialog: toggleWarningSubmit,
|
|
1314
|
+
onConfirm: handleDeleteRelease
|
|
1329
1315
|
}
|
|
1330
1316
|
)
|
|
1331
1317
|
]
|
|
@@ -1333,12 +1319,12 @@ const ReleaseDetailsPage = () => {
|
|
|
1333
1319
|
);
|
|
1334
1320
|
};
|
|
1335
1321
|
const App = () => {
|
|
1336
|
-
return /* @__PURE__ */ jsx(
|
|
1337
|
-
/* @__PURE__ */ jsx(Route, {
|
|
1338
|
-
/* @__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 })
|
|
1339
1325
|
] }) });
|
|
1340
1326
|
};
|
|
1341
1327
|
export {
|
|
1342
1328
|
App
|
|
1343
1329
|
};
|
|
1344
|
-
//# sourceMappingURL=App-
|
|
1330
|
+
//# sourceMappingURL=App-gu1aiP6i.mjs.map
|