@strapi/content-releases 0.0.0-next.60335b11eca9587b558035fe9ecca90e05db036b → 0.0.0-next.64bd4f3d1efcc9420d27c4f4d2013677ded62360

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