@strapi/content-releases 0.0.0-experimental.cae3a5a17d131a6f59673b62d01cfac869ea9cc2 → 0.0.0-experimental.d362bf200f5f9359a4bbd4a549603de5ee1f04ca

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