@strapi/content-releases 0.0.0-next.287aae0bb4a682fba312332372895dbf8e032bf1 → 0.0.0-next.2a1c7a281f8080296033541146ea489dcd441daa

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