@strapi/content-releases 0.0.0-next.2b10ca9b97a5854909ba0a8d1d5b00f73cae58fa → 0.0.0-next.2dcec09530c87d7b3b453630c2d76a967476338d

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.
Files changed (142) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/App-Cx72FM22.mjs +1558 -0
  3. package/dist/_chunks/App-Cx72FM22.mjs.map +1 -0
  4. package/dist/_chunks/App-DyjVixKE.js +1578 -0
  5. package/dist/_chunks/App-DyjVixKE.js.map +1 -0
  6. package/dist/_chunks/PurchaseContentReleases-BJlgTIuR.js +52 -0
  7. package/dist/_chunks/PurchaseContentReleases-BJlgTIuR.js.map +1 -0
  8. package/dist/_chunks/PurchaseContentReleases-CIiBmOhI.mjs +52 -0
  9. package/dist/_chunks/PurchaseContentReleases-CIiBmOhI.mjs.map +1 -0
  10. package/dist/_chunks/ReleasesSettingsPage-9si_53C5.mjs +178 -0
  11. package/dist/_chunks/ReleasesSettingsPage-9si_53C5.mjs.map +1 -0
  12. package/dist/_chunks/ReleasesSettingsPage-FsXF_FuJ.js +178 -0
  13. package/dist/_chunks/ReleasesSettingsPage-FsXF_FuJ.js.map +1 -0
  14. package/dist/_chunks/{en-haKSQIo8.js → en-BWPPsSH-.js} +47 -7
  15. package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
  16. package/dist/_chunks/en-D9Q4YW03.mjs +102 -0
  17. package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
  18. package/dist/_chunks/index-CVj5EFQC.mjs +1386 -0
  19. package/dist/_chunks/index-CVj5EFQC.mjs.map +1 -0
  20. package/dist/_chunks/index-CpTN5TdF.js +1404 -0
  21. package/dist/_chunks/index-CpTN5TdF.js.map +1 -0
  22. package/dist/_chunks/schemas-DBYv9gK8.js +61 -0
  23. package/dist/_chunks/schemas-DBYv9gK8.js.map +1 -0
  24. package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
  25. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -14
  27. package/dist/admin/index.js.map +1 -1
  28. package/dist/admin/index.mjs +2 -15
  29. package/dist/admin/index.mjs.map +1 -1
  30. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  31. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  32. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  33. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  34. package/dist/admin/src/components/ReleaseActionModal.d.ts +24 -0
  35. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  36. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  37. package/dist/admin/src/components/ReleaseModal.d.ts +17 -0
  38. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  39. package/dist/admin/src/constants.d.ts +76 -0
  40. package/dist/admin/src/index.d.ts +3 -0
  41. package/dist/admin/src/modules/hooks.d.ts +7 -0
  42. package/dist/admin/src/pages/App.d.ts +1 -0
  43. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  44. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  45. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  46. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  47. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  48. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  49. package/dist/admin/src/pluginId.d.ts +1 -0
  50. package/dist/admin/src/services/release.d.ts +112 -0
  51. package/dist/admin/src/store/hooks.d.ts +7 -0
  52. package/dist/admin/src/utils/api.d.ts +6 -0
  53. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  54. package/dist/admin/src/utils/time.d.ts +10 -0
  55. package/dist/admin/src/validation/schemas.d.ts +6 -0
  56. package/dist/server/index.js +1480 -458
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/server/index.mjs +1479 -456
  59. package/dist/server/index.mjs.map +1 -1
  60. package/dist/server/src/bootstrap.d.ts +5 -0
  61. package/dist/server/src/bootstrap.d.ts.map +1 -0
  62. package/dist/server/src/constants.d.ts +21 -0
  63. package/dist/server/src/constants.d.ts.map +1 -0
  64. package/dist/server/src/content-types/index.d.ts +97 -0
  65. package/dist/server/src/content-types/index.d.ts.map +1 -0
  66. package/dist/server/src/content-types/release/index.d.ts +48 -0
  67. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  68. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  69. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  70. package/dist/server/src/content-types/release-action/index.d.ts +48 -0
  71. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  72. package/dist/server/src/content-types/release-action/schema.d.ts +47 -0
  73. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  74. package/dist/server/src/controllers/index.d.ts +25 -0
  75. package/dist/server/src/controllers/index.d.ts.map +1 -0
  76. package/dist/server/src/controllers/release-action.d.ts +10 -0
  77. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  78. package/dist/server/src/controllers/release.d.ts +18 -0
  79. package/dist/server/src/controllers/release.d.ts.map +1 -0
  80. package/dist/server/src/controllers/settings.d.ts +11 -0
  81. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  82. package/dist/server/src/controllers/validation/release-action.d.ts +14 -0
  83. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  84. package/dist/server/src/controllers/validation/release.d.ts +4 -0
  85. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  86. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  87. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  88. package/dist/server/src/destroy.d.ts +5 -0
  89. package/dist/server/src/destroy.d.ts.map +1 -0
  90. package/dist/server/src/index.d.ts +2111 -0
  91. package/dist/server/src/index.d.ts.map +1 -0
  92. package/dist/server/src/middlewares/documents.d.ts +6 -0
  93. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  94. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  95. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  96. package/dist/server/src/migrations/index.d.ts +13 -0
  97. package/dist/server/src/migrations/index.d.ts.map +1 -0
  98. package/dist/server/src/register.d.ts +5 -0
  99. package/dist/server/src/register.d.ts.map +1 -0
  100. package/dist/server/src/routes/index.d.ts +51 -0
  101. package/dist/server/src/routes/index.d.ts.map +1 -0
  102. package/dist/server/src/routes/release-action.d.ts +18 -0
  103. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  104. package/dist/server/src/routes/release.d.ts +18 -0
  105. package/dist/server/src/routes/release.d.ts.map +1 -0
  106. package/dist/server/src/routes/settings.d.ts +18 -0
  107. package/dist/server/src/routes/settings.d.ts.map +1 -0
  108. package/dist/server/src/services/index.d.ts +1824 -0
  109. package/dist/server/src/services/index.d.ts.map +1 -0
  110. package/dist/server/src/services/release-action.d.ts +34 -0
  111. package/dist/server/src/services/release-action.d.ts.map +1 -0
  112. package/dist/server/src/services/release.d.ts +31 -0
  113. package/dist/server/src/services/release.d.ts.map +1 -0
  114. package/dist/server/src/services/scheduling.d.ts +18 -0
  115. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  116. package/dist/server/src/services/settings.d.ts +13 -0
  117. package/dist/server/src/services/settings.d.ts.map +1 -0
  118. package/dist/server/src/services/validation.d.ts +18 -0
  119. package/dist/server/src/services/validation.d.ts.map +1 -0
  120. package/dist/server/src/utils/index.d.ts +35 -0
  121. package/dist/server/src/utils/index.d.ts.map +1 -0
  122. package/dist/shared/contracts/release-actions.d.ts +137 -0
  123. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  124. package/dist/shared/contracts/releases.d.ts +184 -0
  125. package/dist/shared/contracts/releases.d.ts.map +1 -0
  126. package/dist/shared/contracts/settings.d.ts +39 -0
  127. package/dist/shared/contracts/settings.d.ts.map +1 -0
  128. package/dist/shared/types.d.ts +24 -0
  129. package/dist/shared/types.d.ts.map +1 -0
  130. package/package.json +36 -36
  131. package/dist/_chunks/App-5PRKHpa2.js +0 -972
  132. package/dist/_chunks/App-5PRKHpa2.js.map +0 -1
  133. package/dist/_chunks/App-J4jrthEu.mjs +0 -950
  134. package/dist/_chunks/App-J4jrthEu.mjs.map +0 -1
  135. package/dist/_chunks/en-haKSQIo8.js.map +0 -1
  136. package/dist/_chunks/en-ngTk74JV.mjs +0 -62
  137. package/dist/_chunks/en-ngTk74JV.mjs.map +0 -1
  138. package/dist/_chunks/index-PEkKIRyJ.js +0 -849
  139. package/dist/_chunks/index-PEkKIRyJ.js.map +0 -1
  140. package/dist/_chunks/index-_Zsj8MUA.mjs +0 -828
  141. package/dist/_chunks/index-_Zsj8MUA.mjs.map +0 -1
  142. package/strapi-server.js +0 -3
@@ -1,950 +0,0 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, LoadingIndicatorPage, ConfirmDialog, useRBAC, RelativeTime, CheckPermissions, useQueryParams, AnErrorOccurred, NoContent, Table, PageSizeURLQuery, PaginationURLQuery, CheckPagePermissions } from "@strapi/helper-plugin";
3
- import { useLocation, useParams, useHistory, Redirect, Link as Link$1, Switch, Route } from "react-router-dom";
4
- import { p as pluginId, u as useGetReleaseQuery, a as useUpdateReleaseMutation, b as useDeleteReleaseMutation, c as usePublishReleaseMutation, P as PERMISSIONS, d as useGetReleaseActionsQuery, e as useUpdateReleaseActionMutation, R as ReleaseActionOptions, f as ReleaseActionMenu, i as isAxiosError, g as useGetReleasesQuery, h as useCreateReleaseMutation } from "./index-_Zsj8MUA.mjs";
5
- import * as React from "react";
6
- import { ModalLayout, ModalHeader, Typography, ModalBody, TextInput, ModalFooter, Button, Flex, ContentLayout, Main, HeaderLayout, Link, IconButton, Popover, SingleSelect, SingleSelectOption, Badge, Tr, Td, Icon, TabGroup, Box, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem } from "@strapi/design-system";
7
- import { LinkButton, Link as Link$2 } from "@strapi/design-system/v2";
8
- import { Pencil, Trash, ArrowLeft, More, CheckCircle, Plus, EmptyDocuments } from "@strapi/icons";
9
- import { useIntl } from "react-intl";
10
- import styled from "styled-components";
11
- import { Formik, Form } from "formik";
12
- import * as yup from "yup";
13
- import "@reduxjs/toolkit/query";
14
- import "axios";
15
- import "@reduxjs/toolkit/query/react";
16
- const RELEASE_SCHEMA = yup.object().shape({
17
- name: yup.string().trim().required()
18
- }).required().noUnknown();
19
- const ReleaseModal = ({
20
- handleClose,
21
- handleSubmit,
22
- initialValues,
23
- isLoading = false
24
- }) => {
25
- const { formatMessage } = useIntl();
26
- const { pathname } = useLocation();
27
- const isCreatingRelease = pathname === `/plugins/${pluginId}`;
28
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
29
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
30
- {
31
- id: "content-releases.modal.title",
32
- defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
33
- },
34
- { isCreatingRelease }
35
- ) }) }),
36
- /* @__PURE__ */ jsx(
37
- Formik,
38
- {
39
- validateOnChange: false,
40
- onSubmit: handleSubmit,
41
- initialValues,
42
- validationSchema: RELEASE_SCHEMA,
43
- children: ({ values, errors, handleChange }) => /* @__PURE__ */ jsxs(Form, { children: [
44
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(
45
- TextInput,
46
- {
47
- label: formatMessage({
48
- id: "content-releases.modal.form.input.label.release-name",
49
- defaultMessage: "Name"
50
- }),
51
- name: "name",
52
- value: values.name,
53
- error: errors.name,
54
- onChange: handleChange,
55
- required: true
56
- }
57
- ) }),
58
- /* @__PURE__ */ jsx(
59
- ModalFooter,
60
- {
61
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
62
- endActions: /* @__PURE__ */ jsx(
63
- Button,
64
- {
65
- name: "submit",
66
- loading: isLoading,
67
- disabled: !values.name || values.name === initialValues.name,
68
- type: "submit",
69
- children: formatMessage(
70
- {
71
- id: "content-releases.modal.form.button.submit",
72
- defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
73
- },
74
- { isCreatingRelease }
75
- )
76
- }
77
- )
78
- }
79
- )
80
- ] })
81
- }
82
- )
83
- ] });
84
- };
85
- const ReleaseInfoWrapper = styled(Flex)`
86
- align-self: stretch;
87
- border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
88
- border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
89
- border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
90
- `;
91
- const StyledFlex = styled(Flex)`
92
- align-self: stretch;
93
- cursor: ${({ disabled }) => disabled ? "not-allowed" : "pointer"};
94
-
95
- svg path {
96
- fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
97
- }
98
- span {
99
- color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
100
- }
101
- `;
102
- const PencilIcon = styled(Pencil)`
103
- width: ${({ theme }) => theme.spaces[4]};
104
- height: ${({ theme }) => theme.spaces[4]};
105
- path {
106
- fill: ${({ theme }) => theme.colors.neutral600};
107
- }
108
- `;
109
- const TrashIcon = styled(Trash)`
110
- width: ${({ theme }) => theme.spaces[4]};
111
- height: ${({ theme }) => theme.spaces[4]};
112
- path {
113
- fill: ${({ theme }) => theme.colors.danger600};
114
- }
115
- `;
116
- const PopoverButton = ({ onClick, disabled, children }) => {
117
- return /* @__PURE__ */ jsx(
118
- StyledFlex,
119
- {
120
- paddingTop: 2,
121
- paddingBottom: 2,
122
- paddingLeft: 4,
123
- paddingRight: 4,
124
- alignItems: "center",
125
- gap: 2,
126
- as: "button",
127
- hasRadius: true,
128
- onClick,
129
- disabled,
130
- children
131
- }
132
- );
133
- };
134
- const EntryValidationText = ({ status, action }) => {
135
- const { formatMessage } = useIntl();
136
- if (action == "publish") {
137
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
138
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
139
- status === "published" ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
140
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
141
- defaultMessage: "Already published"
142
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
143
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
144
- defaultMessage: "Ready to publish"
145
- }) })
146
- ] });
147
- }
148
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
149
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
150
- status === "draft" ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
151
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
152
- defaultMessage: "Already unpublished"
153
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
154
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
155
- defaultMessage: "Ready to unpublish"
156
- }) })
157
- ] });
158
- };
159
- const ReleaseDetailsLayout = ({
160
- toggleEditReleaseModal,
161
- toggleWarningSubmit,
162
- children
163
- }) => {
164
- const { formatMessage } = useIntl();
165
- const { releaseId } = useParams();
166
- const [isPopoverVisible, setIsPopoverVisible] = React.useState(false);
167
- const moreButtonRef = React.useRef(null);
168
- const {
169
- data,
170
- isLoading: isLoadingDetails,
171
- isError,
172
- error
173
- } = useGetReleaseQuery({ id: releaseId });
174
- const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
175
- const toggleNotification = useNotification();
176
- const { formatAPIError } = useAPIErrorHandler();
177
- const {
178
- allowedActions: { canUpdate, canDelete }
179
- } = useRBAC(PERMISSIONS);
180
- const release = data?.data;
181
- const handleTogglePopover = () => {
182
- setIsPopoverVisible((prev) => !prev);
183
- };
184
- const openReleaseModal = () => {
185
- toggleEditReleaseModal();
186
- handleTogglePopover();
187
- };
188
- const handlePublishRelease = async () => {
189
- const response = await publishRelease({ id: releaseId });
190
- if ("data" in response) {
191
- toggleNotification({
192
- type: "success",
193
- message: formatMessage({
194
- id: "content-releases.pages.ReleaseDetails.publish-notification-success",
195
- defaultMessage: "Release was published successfully."
196
- })
197
- });
198
- } else if (isAxiosError(response.error)) {
199
- toggleNotification({
200
- type: "warning",
201
- message: formatAPIError(response.error)
202
- });
203
- } else {
204
- toggleNotification({
205
- type: "warning",
206
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
207
- });
208
- }
209
- };
210
- const openWarningConfirmDialog = () => {
211
- toggleWarningSubmit();
212
- handleTogglePopover();
213
- };
214
- if (isLoadingDetails) {
215
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
216
- }
217
- if (isError || !release) {
218
- return /* @__PURE__ */ jsx(
219
- Redirect,
220
- {
221
- to: {
222
- pathname: "/plugins/content-releases",
223
- state: {
224
- errors: [
225
- {
226
- code: error?.code
227
- }
228
- ]
229
- }
230
- }
231
- }
232
- );
233
- }
234
- const totalEntries = release.actions.meta.count || 0;
235
- const createdBy = release.createdBy.lastname ? `${release.createdBy.firstname} ${release.createdBy.lastname}` : `${release.createdBy.firstname}`;
236
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
237
- /* @__PURE__ */ jsx(
238
- HeaderLayout,
239
- {
240
- title: release.name,
241
- subtitle: formatMessage(
242
- {
243
- id: "content-releases.pages.Details.header-subtitle",
244
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
245
- },
246
- { number: totalEntries }
247
- ),
248
- navigationAction: /* @__PURE__ */ jsx(Link, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
249
- id: "global.back",
250
- defaultMessage: "Back"
251
- }) }),
252
- primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
253
- /* @__PURE__ */ jsx(
254
- IconButton,
255
- {
256
- label: formatMessage({
257
- id: "content-releases.header.actions.open-release-actions",
258
- defaultMessage: "Release actions"
259
- }),
260
- ref: moreButtonRef,
261
- onClick: handleTogglePopover,
262
- children: /* @__PURE__ */ jsx(More, {})
263
- }
264
- ),
265
- isPopoverVisible && /* @__PURE__ */ jsxs(
266
- Popover,
267
- {
268
- source: moreButtonRef,
269
- placement: "bottom-end",
270
- onDismiss: handleTogglePopover,
271
- spacing: 4,
272
- minWidth: "242px",
273
- children: [
274
- /* @__PURE__ */ jsxs(Flex, { alignItems: "center", justifyContent: "center", direction: "column", padding: 1, children: [
275
- /* @__PURE__ */ jsxs(PopoverButton, { disabled: !canUpdate, onClick: openReleaseModal, children: [
276
- /* @__PURE__ */ jsx(PencilIcon, {}),
277
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
278
- id: "content-releases.header.actions.edit",
279
- defaultMessage: "Edit"
280
- }) })
281
- ] }),
282
- /* @__PURE__ */ jsxs(PopoverButton, { disabled: !canDelete, onClick: openWarningConfirmDialog, children: [
283
- /* @__PURE__ */ jsx(TrashIcon, {}),
284
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
285
- id: "content-releases.header.actions.delete",
286
- defaultMessage: "Delete"
287
- }) })
288
- ] })
289
- ] }),
290
- /* @__PURE__ */ jsxs(
291
- ReleaseInfoWrapper,
292
- {
293
- direction: "column",
294
- justifyContent: "center",
295
- alignItems: "flex-start",
296
- gap: 1,
297
- padding: 5,
298
- children: [
299
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
300
- id: "content-releases.header.actions.created",
301
- defaultMessage: "Created"
302
- }) }),
303
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
304
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
305
- formatMessage(
306
- {
307
- id: "content-releases.header.actions.created.description",
308
- defaultMessage: " by {createdBy}"
309
- },
310
- { createdBy }
311
- )
312
- ] })
313
- ]
314
- }
315
- )
316
- ]
317
- }
318
- ),
319
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
320
- Button,
321
- {
322
- size: "S",
323
- variant: "default",
324
- onClick: handlePublishRelease,
325
- loading: isPublishing,
326
- disabled: release.actions.meta.count === 0,
327
- children: formatMessage({
328
- id: "content-releases.header.actions.publish",
329
- defaultMessage: "Publish"
330
- })
331
- }
332
- ) })
333
- ] })
334
- }
335
- ),
336
- children
337
- ] });
338
- };
339
- const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
340
- const getGroupByOptionLabel = (value) => {
341
- if (value === "locale") {
342
- return {
343
- id: "content-releases.pages.ReleaseDetails.groupBy.option.locales",
344
- defaultMessage: "Locales"
345
- };
346
- }
347
- if (value === "action") {
348
- return {
349
- id: "content-releases.pages.ReleaseDetails.groupBy.option.actions",
350
- defaultMessage: "Actions"
351
- };
352
- }
353
- return {
354
- id: "content-releases.pages.ReleaseDetails.groupBy.option.content-type",
355
- defaultMessage: "Content-Types"
356
- };
357
- };
358
- const ReleaseDetailsBody = () => {
359
- const { formatMessage } = useIntl();
360
- const { releaseId } = useParams();
361
- const [{ query }, setQuery] = useQueryParams();
362
- const toggleNotification = useNotification();
363
- const { formatAPIError } = useAPIErrorHandler();
364
- const {
365
- data: releaseData,
366
- isLoading: isReleaseLoading,
367
- isError: isReleaseError,
368
- error: releaseError
369
- } = useGetReleaseQuery({ id: releaseId });
370
- const release = releaseData?.data;
371
- const selectedGroupBy = query?.groupBy || "contentType";
372
- const {
373
- isLoading,
374
- isFetching,
375
- isError,
376
- data,
377
- error: releaseActionsError
378
- } = useGetReleaseActionsQuery({
379
- ...query,
380
- releaseId
381
- });
382
- const [updateReleaseAction] = useUpdateReleaseActionMutation();
383
- const handleChangeType = async (e, actionId) => {
384
- const response = await updateReleaseAction({
385
- params: {
386
- releaseId,
387
- actionId
388
- },
389
- body: {
390
- type: e.target.value
391
- }
392
- });
393
- if ("error" in response) {
394
- if (isAxiosError(response.error)) {
395
- toggleNotification({
396
- type: "warning",
397
- message: formatAPIError(response.error)
398
- });
399
- } else {
400
- toggleNotification({
401
- type: "warning",
402
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
403
- });
404
- }
405
- }
406
- };
407
- if (isLoading || isReleaseLoading) {
408
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
409
- }
410
- const releaseActions = data?.data;
411
- const releaseMeta = data?.meta;
412
- if (isReleaseError || !release) {
413
- const errorsArray = [];
414
- if (releaseError) {
415
- errorsArray.push({
416
- code: releaseError.code
417
- });
418
- }
419
- if (releaseActionsError) {
420
- errorsArray.push({
421
- code: releaseActionsError.code
422
- });
423
- }
424
- return /* @__PURE__ */ jsx(
425
- Redirect,
426
- {
427
- to: {
428
- pathname: "/plugins/content-releases",
429
- state: {
430
- errors: errorsArray
431
- }
432
- }
433
- }
434
- );
435
- }
436
- if (isError || !releaseActions) {
437
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
438
- }
439
- if (Object.keys(releaseActions).length === 0) {
440
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
441
- NoContent,
442
- {
443
- content: {
444
- id: "content-releases.pages.Details.tab.emptyEntries",
445
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
446
- },
447
- action: /* @__PURE__ */ jsx(
448
- LinkButton,
449
- {
450
- as: Link$1,
451
- to: {
452
- pathname: "/content-manager"
453
- },
454
- style: { textDecoration: "none" },
455
- variant: "secondary",
456
- children: formatMessage({
457
- id: "content-releases.page.Details.button.openContentManager",
458
- defaultMessage: "Open the Content Manager"
459
- })
460
- }
461
- )
462
- }
463
- ) });
464
- }
465
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
466
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
467
- SingleSelect,
468
- {
469
- "aria-label": formatMessage({
470
- id: "content-releases.pages.ReleaseDetails.groupBy.label",
471
- defaultMessage: "Group by"
472
- }),
473
- customizeContent: (value) => formatMessage(
474
- {
475
- id: `content-releases.pages.ReleaseDetails.groupBy.label`,
476
- defaultMessage: `Group by {groupBy}`
477
- },
478
- {
479
- groupBy: value
480
- }
481
- ),
482
- value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
483
- onChange: (value) => setQuery({ groupBy: value }),
484
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
485
- }
486
- ) }),
487
- Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
488
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(Badge, { children: key }) }),
489
- /* @__PURE__ */ jsx(
490
- Table.Root,
491
- {
492
- rows: releaseActions[key].map((item) => ({
493
- ...item,
494
- id: Number(item.entry.id)
495
- })),
496
- colCount: releaseActions[key].length,
497
- isLoading,
498
- isFetching,
499
- children: /* @__PURE__ */ jsxs(Table.Content, { children: [
500
- /* @__PURE__ */ jsxs(Table.Head, { children: [
501
- /* @__PURE__ */ jsx(
502
- Table.HeaderCell,
503
- {
504
- fieldSchemaType: "string",
505
- label: formatMessage({
506
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
507
- defaultMessage: "name"
508
- }),
509
- name: "name"
510
- }
511
- ),
512
- /* @__PURE__ */ jsx(
513
- Table.HeaderCell,
514
- {
515
- fieldSchemaType: "string",
516
- label: formatMessage({
517
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
518
- defaultMessage: "locale"
519
- }),
520
- name: "locale"
521
- }
522
- ),
523
- /* @__PURE__ */ jsx(
524
- Table.HeaderCell,
525
- {
526
- fieldSchemaType: "string",
527
- label: formatMessage({
528
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
529
- defaultMessage: "content-type"
530
- }),
531
- name: "content-type"
532
- }
533
- ),
534
- /* @__PURE__ */ jsx(
535
- Table.HeaderCell,
536
- {
537
- fieldSchemaType: "string",
538
- label: formatMessage({
539
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
540
- defaultMessage: "action"
541
- }),
542
- name: "action"
543
- }
544
- ),
545
- !release.releasedAt && /* @__PURE__ */ jsx(
546
- Table.HeaderCell,
547
- {
548
- fieldSchemaType: "string",
549
- label: formatMessage({
550
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
551
- defaultMessage: "status"
552
- }),
553
- name: "status"
554
- }
555
- )
556
- ] }),
557
- /* @__PURE__ */ jsx(Table.LoadingBody, {}),
558
- /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(({ id, type, entry }) => /* @__PURE__ */ jsxs(Tr, { children: [
559
- /* @__PURE__ */ jsx(Td, { width: "25%", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${entry.contentType.mainFieldValue || entry.id}` }) }),
560
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { children: `${entry?.locale?.name ? entry.locale.name : "-"}` }) }),
561
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { children: entry.contentType.displayName || "" }) }),
562
- /* @__PURE__ */ jsx(Td, { children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
563
- {
564
- id: "content-releases.page.ReleaseDetails.table.action-published",
565
- defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
566
- },
567
- {
568
- isPublish: type === "publish",
569
- b: (children) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children })
570
- }
571
- ) }) : /* @__PURE__ */ jsx(
572
- ReleaseActionOptions,
573
- {
574
- selected: type,
575
- handleChange: (e) => handleChangeType(e, id),
576
- name: `release-action-${id}-type`
577
- }
578
- ) }),
579
- !release.releasedAt && /* @__PURE__ */ jsxs(Fragment, { children: [
580
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(EntryValidationText, { status: entry.status, action: type }) }),
581
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(ReleaseActionMenu, { releaseId, actionId: id }) }) })
582
- ] })
583
- ] }, id)) })
584
- ] })
585
- }
586
- )
587
- ] }, `releases-group-${key}`)),
588
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
589
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
590
- /* @__PURE__ */ jsx(
591
- PaginationURLQuery,
592
- {
593
- pagination: {
594
- pageCount: releaseMeta?.pagination?.pageCount || 0
595
- }
596
- }
597
- )
598
- ] })
599
- ] }) });
600
- };
601
- const ReleaseDetailsPage = () => {
602
- const { formatMessage } = useIntl();
603
- const { releaseId } = useParams();
604
- const toggleNotification = useNotification();
605
- const { formatAPIError } = useAPIErrorHandler();
606
- const { push } = useHistory();
607
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
608
- const [showWarningSubmit, setWarningSubmit] = React.useState(false);
609
- const {
610
- isLoading: isLoadingDetails,
611
- data,
612
- isSuccess: isSuccessDetails
613
- } = useGetReleaseQuery({ id: releaseId });
614
- const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
615
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
616
- const toggleEditReleaseModal = () => {
617
- setReleaseModalShown((prev) => !prev);
618
- };
619
- const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
620
- if (isLoadingDetails) {
621
- return /* @__PURE__ */ jsx(
622
- ReleaseDetailsLayout,
623
- {
624
- toggleEditReleaseModal,
625
- toggleWarningSubmit,
626
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
627
- }
628
- );
629
- }
630
- const title = isSuccessDetails && data?.data?.name || "";
631
- const handleEditRelease = async (values) => {
632
- const response = await updateRelease({
633
- id: releaseId,
634
- name: values.name
635
- });
636
- if ("data" in response) {
637
- toggleNotification({
638
- type: "success",
639
- message: formatMessage({
640
- id: "content-releases.modal.release-updated-notification-success",
641
- defaultMessage: "Release updated."
642
- })
643
- });
644
- } else if (isAxiosError(response.error)) {
645
- toggleNotification({
646
- type: "warning",
647
- message: formatAPIError(response.error)
648
- });
649
- } else {
650
- toggleNotification({
651
- type: "warning",
652
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
653
- });
654
- }
655
- toggleEditReleaseModal();
656
- };
657
- const handleDeleteRelease = async () => {
658
- const response = await deleteRelease({
659
- id: releaseId
660
- });
661
- if ("data" in response) {
662
- push("/plugins/content-releases");
663
- } else if (isAxiosError(response.error)) {
664
- toggleNotification({
665
- type: "warning",
666
- message: formatAPIError(response.error)
667
- });
668
- } else {
669
- toggleNotification({
670
- type: "warning",
671
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
672
- });
673
- }
674
- };
675
- return /* @__PURE__ */ jsxs(
676
- ReleaseDetailsLayout,
677
- {
678
- toggleEditReleaseModal,
679
- toggleWarningSubmit,
680
- children: [
681
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
682
- releaseModalShown && /* @__PURE__ */ jsx(
683
- ReleaseModal,
684
- {
685
- handleClose: toggleEditReleaseModal,
686
- handleSubmit: handleEditRelease,
687
- isLoading: isLoadingDetails || isSubmittingForm,
688
- initialValues: { name: title || "" }
689
- }
690
- ),
691
- /* @__PURE__ */ jsx(
692
- ConfirmDialog,
693
- {
694
- bodyText: {
695
- id: "content-releases.dialog.confirmation-message",
696
- defaultMessage: "Are you sure you want to delete this release?"
697
- },
698
- isOpen: showWarningSubmit,
699
- isConfirmButtonLoading: isDeletingRelease,
700
- onToggleDialog: toggleWarningSubmit,
701
- onConfirm: handleDeleteRelease
702
- }
703
- )
704
- ]
705
- }
706
- );
707
- };
708
- const ReleasesLayout = ({
709
- isLoading,
710
- totalReleases,
711
- onClickAddRelease,
712
- children
713
- }) => {
714
- const { formatMessage } = useIntl();
715
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
716
- /* @__PURE__ */ jsx(
717
- HeaderLayout,
718
- {
719
- title: formatMessage({
720
- id: "content-releases.pages.Releases.title",
721
- defaultMessage: "Releases"
722
- }),
723
- subtitle: !isLoading && formatMessage(
724
- {
725
- id: "content-releases.pages.Releases.header-subtitle",
726
- defaultMessage: "{number, plural, =0 {No releases} one {# release} other {# releases}}"
727
- },
728
- { number: totalReleases }
729
- ),
730
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(Button, { startIcon: /* @__PURE__ */ jsx(Plus, {}), onClick: onClickAddRelease, children: formatMessage({
731
- id: "content-releases.header.actions.add-release",
732
- defaultMessage: "New release"
733
- }) }) })
734
- }
735
- ),
736
- children
737
- ] });
738
- };
739
- const LinkCard = styled(Link$2)`
740
- display: block;
741
- `;
742
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
743
- const { formatMessage } = useIntl();
744
- if (isError) {
745
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
746
- }
747
- if (releases?.length === 0) {
748
- return /* @__PURE__ */ jsx(
749
- EmptyStateLayout,
750
- {
751
- content: formatMessage(
752
- {
753
- id: "content-releases.page.Releases.tab.emptyEntries",
754
- defaultMessage: "No releases"
755
- },
756
- {
757
- target: sectionTitle
758
- }
759
- ),
760
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
761
- }
762
- );
763
- }
764
- return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, actions }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
765
- Flex,
766
- {
767
- direction: "column",
768
- justifyContent: "space-between",
769
- padding: 4,
770
- hasRadius: true,
771
- background: "neutral0",
772
- shadow: "tableShadow",
773
- height: "100%",
774
- width: "100%",
775
- alignItems: "start",
776
- gap: 2,
777
- children: [
778
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
779
- /* @__PURE__ */ jsx(Typography, { variant: "pi", children: formatMessage(
780
- {
781
- id: "content-releases.page.Releases.release-item.entries",
782
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
783
- },
784
- { number: actions.meta.count }
785
- ) })
786
- ]
787
- }
788
- ) }) }, id)) });
789
- };
790
- const INITIAL_FORM_VALUES = {
791
- name: ""
792
- };
793
- const ReleasesPage = () => {
794
- const location = useLocation();
795
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
796
- const toggleNotification = useNotification();
797
- const { formatMessage } = useIntl();
798
- const { push, replace } = useHistory();
799
- const { formatAPIError } = useAPIErrorHandler();
800
- const [{ query }, setQuery] = useQueryParams();
801
- const response = useGetReleasesQuery(query);
802
- const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
803
- const { isLoading, isSuccess, isError } = response;
804
- React.useEffect(() => {
805
- if (location?.state?.errors) {
806
- toggleNotification({
807
- type: "warning",
808
- title: formatMessage({
809
- id: "content-releases.pages.Releases.notification.error.title",
810
- defaultMessage: "Your request could not be processed."
811
- }),
812
- message: formatMessage({
813
- id: "content-releases.pages.Releases.notification.error.message",
814
- defaultMessage: "Please try again or open another release."
815
- })
816
- });
817
- replace({ state: null });
818
- }
819
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
820
- const toggleAddReleaseModal = () => {
821
- setReleaseModalShown((prev) => !prev);
822
- };
823
- if (isLoading) {
824
- return /* @__PURE__ */ jsx(ReleasesLayout, { onClickAddRelease: toggleAddReleaseModal, isLoading: true, children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) }) });
825
- }
826
- const totalReleases = isSuccess && response.currentData?.meta?.pagination?.total || 0;
827
- const handleTabChange = (index) => {
828
- setQuery({
829
- ...query,
830
- page: 1,
831
- pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
832
- filters: {
833
- releasedAt: {
834
- $notNull: index === 0 ? false : true
835
- }
836
- }
837
- });
838
- };
839
- const activeTab = response?.currentData?.meta?.activeTab || "pending";
840
- const handleAddRelease = async (values) => {
841
- const response2 = await createRelease({
842
- name: values.name
843
- });
844
- if ("data" in response2) {
845
- toggleNotification({
846
- type: "success",
847
- message: formatMessage({
848
- id: "content-releases.modal.release-created-notification-success",
849
- defaultMessage: "Release created."
850
- })
851
- });
852
- push(`/plugins/content-releases/${response2.data.data.id}`);
853
- } else if (isAxiosError(response2.error)) {
854
- toggleNotification({
855
- type: "warning",
856
- message: formatAPIError(response2.error)
857
- });
858
- } else {
859
- toggleNotification({
860
- type: "warning",
861
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
862
- });
863
- }
864
- };
865
- return /* @__PURE__ */ jsxs(ReleasesLayout, { onClickAddRelease: toggleAddReleaseModal, totalReleases, children: [
866
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
867
- /* @__PURE__ */ jsxs(
868
- TabGroup,
869
- {
870
- label: formatMessage({
871
- id: "content-releases.pages.Releases.tab-group.label",
872
- defaultMessage: "Releases list"
873
- }),
874
- variant: "simple",
875
- initialSelectedTabIndex: ["pending", "done"].indexOf(activeTab),
876
- onTabChange: handleTabChange,
877
- children: [
878
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
879
- /* @__PURE__ */ jsxs(Tabs, { children: [
880
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
881
- id: "content-releases.pages.Releases.tab.pending",
882
- defaultMessage: "Pending"
883
- }) }),
884
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
885
- id: "content-releases.pages.Releases.tab.done",
886
- defaultMessage: "Done"
887
- }) })
888
- ] }),
889
- /* @__PURE__ */ jsx(Divider, {})
890
- ] }),
891
- /* @__PURE__ */ jsxs(TabPanels, { children: [
892
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
893
- ReleasesGrid,
894
- {
895
- sectionTitle: "pending",
896
- releases: response?.currentData?.data,
897
- isError
898
- }
899
- ) }),
900
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
901
- ReleasesGrid,
902
- {
903
- sectionTitle: "done",
904
- releases: response?.currentData?.data,
905
- isError
906
- }
907
- ) })
908
- ] })
909
- ]
910
- }
911
- ),
912
- totalReleases > 0 && /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
913
- /* @__PURE__ */ jsx(
914
- PageSizeURLQuery,
915
- {
916
- options: ["8", "16", "32", "64"],
917
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
918
- }
919
- ),
920
- /* @__PURE__ */ jsx(
921
- PaginationURLQuery,
922
- {
923
- pagination: {
924
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
925
- }
926
- }
927
- )
928
- ] })
929
- ] }) }),
930
- releaseModalShown && /* @__PURE__ */ jsx(
931
- ReleaseModal,
932
- {
933
- handleClose: toggleAddReleaseModal,
934
- handleSubmit: handleAddRelease,
935
- isLoading: isSubmittingForm,
936
- initialValues: INITIAL_FORM_VALUES
937
- }
938
- )
939
- ] });
940
- };
941
- const App = () => {
942
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
943
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
944
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
945
- ] }) });
946
- };
947
- export {
948
- App
949
- };
950
- //# sourceMappingURL=App-J4jrthEu.mjs.map