@strapi/content-releases 0.0.0-next.d470b4f75cf00f24f440b80300f1c833c322b871 → 0.0.0-next.d65d44102fd32871728c0d74ec4f2519b7cc0a16

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