@strapi/content-releases 0.0.0-experimental.check-license → 4.16.0

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 (89) hide show
  1. package/dist/_chunks/App-b6df6b60.js +797 -0
  2. package/dist/_chunks/App-b6df6b60.js.map +1 -0
  3. package/dist/_chunks/App-b83f4a97.mjs +775 -0
  4. package/dist/_chunks/App-b83f4a97.mjs.map +1 -0
  5. package/dist/_chunks/en-b5dfabe6.js +47 -0
  6. package/dist/_chunks/en-b5dfabe6.js.map +1 -0
  7. package/dist/_chunks/en-d837b82d.mjs +47 -0
  8. package/dist/_chunks/en-d837b82d.mjs.map +1 -0
  9. package/dist/_chunks/index-28e99164.js +784 -0
  10. package/dist/_chunks/index-28e99164.js.map +1 -0
  11. package/dist/_chunks/index-c39292e3.mjs +763 -0
  12. package/dist/_chunks/index-c39292e3.mjs.map +1 -0
  13. package/dist/admin/index.js +16 -35
  14. package/dist/admin/index.js.map +1 -1
  15. package/dist/admin/index.mjs +16 -35
  16. package/dist/admin/index.mjs.map +1 -1
  17. package/dist/admin/src/components/CMReleasesContainer.d.ts +1 -0
  18. package/dist/admin/src/components/ReleaseActionMenu.d.ts +7 -0
  19. package/dist/admin/src/components/ReleaseActionOptions.d.ts +8 -0
  20. package/dist/admin/src/components/ReleaseModal.d.ts +11 -0
  21. package/dist/admin/src/constants.d.ts +13 -0
  22. package/dist/admin/src/index.d.ts +3 -15
  23. package/dist/admin/src/pages/App.d.ts +1 -0
  24. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +10 -0
  25. package/dist/admin/src/pages/ReleasesPage.d.ts +11 -0
  26. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +104 -0
  27. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +38 -0
  28. package/dist/admin/src/pluginId.d.ts +1 -0
  29. package/dist/admin/src/services/axios.d.ts +29 -0
  30. package/dist/admin/src/services/release.d.ts +348 -0
  31. package/dist/server/index.js +861 -6
  32. package/dist/server/index.js.map +1 -1
  33. package/dist/server/index.mjs +842 -6
  34. package/dist/server/index.mjs.map +1 -1
  35. package/dist/server/src/constants.d.ts +9 -0
  36. package/dist/server/src/constants.d.ts.map +1 -0
  37. package/dist/server/src/content-types/index.d.ts +82 -0
  38. package/dist/server/src/content-types/index.d.ts.map +1 -0
  39. package/dist/server/src/content-types/release/index.d.ts +37 -0
  40. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  41. package/dist/server/src/content-types/release/schema.d.ts +36 -0
  42. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  43. package/dist/server/src/content-types/release-action/index.d.ts +44 -0
  44. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  45. package/dist/server/src/content-types/release-action/schema.d.ts +43 -0
  46. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  47. package/dist/server/src/controllers/index.d.ts +18 -0
  48. package/dist/server/src/controllers/index.d.ts.map +1 -0
  49. package/dist/server/src/controllers/release-action.d.ts +9 -0
  50. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  51. package/dist/server/src/controllers/release.d.ts +11 -0
  52. package/dist/server/src/controllers/release.d.ts.map +1 -0
  53. package/dist/server/src/controllers/validation/release-action.d.ts +3 -0
  54. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  55. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  56. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  57. package/dist/server/src/index.d.ts +298 -1
  58. package/dist/server/src/index.d.ts.map +1 -0
  59. package/dist/server/src/register.d.ts +5 -1
  60. package/dist/server/src/register.d.ts.map +1 -0
  61. package/dist/server/src/routes/index.d.ts +35 -0
  62. package/dist/server/src/routes/index.d.ts.map +1 -0
  63. package/dist/server/src/routes/release-action.d.ts +18 -0
  64. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  65. package/dist/server/src/routes/release.d.ts +18 -0
  66. package/dist/server/src/routes/release.d.ts.map +1 -0
  67. package/dist/server/src/services/index.d.ts +77 -0
  68. package/dist/server/src/services/index.d.ts.map +1 -0
  69. package/dist/server/src/services/release.d.ts +55 -0
  70. package/dist/server/src/services/release.d.ts.map +1 -0
  71. package/dist/server/src/services/validation.d.ts +10 -0
  72. package/dist/server/src/services/validation.d.ts.map +1 -0
  73. package/dist/server/src/utils/index.d.ts +4 -0
  74. package/dist/server/src/utils/index.d.ts.map +1 -0
  75. package/dist/shared/contracts/release-actions.d.ts +95 -0
  76. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  77. package/dist/shared/contracts/releases.d.ts +153 -0
  78. package/dist/shared/contracts/releases.d.ts.map +1 -0
  79. package/dist/shared/types.d.ts +24 -0
  80. package/dist/shared/types.d.ts.map +1 -0
  81. package/dist/shared/validation-schemas.d.ts +2 -0
  82. package/dist/shared/validation-schemas.d.ts.map +1 -0
  83. package/package.json +29 -18
  84. package/dist/_chunks/en-21947221.js +0 -5
  85. package/dist/_chunks/en-21947221.js.map +0 -1
  86. package/dist/_chunks/en-92157b33.mjs +0 -5
  87. package/dist/_chunks/en-92157b33.mjs.map +0 -1
  88. package/dist/admin/src/tests/index.test.d.ts +0 -0
  89. package/dist/server/src/__tests__/index.test.d.ts +0 -2
@@ -0,0 +1,775 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useParams, useHistory, Switch, Route } from "react-router-dom";
3
+ import { P as PERMISSIONS, u as useGetReleaseQuery, a as useUpdateReleaseMutation, b as useDeleteReleaseMutation, c as usePublishReleaseMutation, d as useGetReleaseActionsQuery, e as useUpdateReleaseActionMutation, R as ReleaseActionOptions, i as isAxiosError, f as useGetReleasesQuery, g as useCreateReleaseMutation, p as pluginId } from "./index-c39292e3.mjs";
4
+ import * as React from "react";
5
+ import { ModalLayout, ModalHeader, Typography, ModalBody, TextInput, ModalFooter, Button, Flex, ContentLayout, Main, Box, HeaderLayout, Link, IconButton, Popover, EmptyStateLayout, Tr, Td, TabGroup, Tabs, Tab, TabPanels, TabPanel, Grid, GridItem } from "@strapi/design-system";
6
+ import { CheckPermissions, useNotification, useAPIErrorHandler, LoadingIndicatorPage, ConfirmDialog, AnErrorOccurred, RelativeTime, useQueryParams, Table, PageSizeURLQuery, PaginationURLQuery } from "@strapi/helper-plugin";
7
+ import { Pencil, Trash, ArrowLeft, More, EmptyDocuments, Plus } from "@strapi/icons";
8
+ import { useIntl } from "react-intl";
9
+ import styled from "styled-components";
10
+ import { Formik, Form } from "formik";
11
+ import * as yup from "yup";
12
+ import { Link as Link$1 } from "@strapi/design-system/v2";
13
+ import "@reduxjs/toolkit/query";
14
+ import "axios";
15
+ import "@reduxjs/toolkit/query/react";
16
+ const RELEASE_SCHEMA = yup.object().shape({
17
+ name: yup.string().trim().required()
18
+ }).required().noUnknown();
19
+ const ReleaseModal = ({
20
+ handleClose,
21
+ handleSubmit,
22
+ initialValues,
23
+ isLoading = false
24
+ }) => {
25
+ const { formatMessage } = useIntl();
26
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
27
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
28
+ id: "content-releases.modal.add-release-title",
29
+ defaultMessage: "New release"
30
+ }) }) }),
31
+ /* @__PURE__ */ jsx(
32
+ Formik,
33
+ {
34
+ validateOnChange: false,
35
+ onSubmit: handleSubmit,
36
+ initialValues,
37
+ validationSchema: RELEASE_SCHEMA,
38
+ children: ({ values, errors, handleChange }) => /* @__PURE__ */ jsxs(Form, { children: [
39
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(
40
+ TextInput,
41
+ {
42
+ label: formatMessage({
43
+ id: "content-releases.modal.form.input.label.release-name",
44
+ defaultMessage: "Name"
45
+ }),
46
+ name: "name",
47
+ value: values.name,
48
+ error: errors.name,
49
+ onChange: handleChange,
50
+ required: true
51
+ }
52
+ ) }),
53
+ /* @__PURE__ */ jsx(
54
+ ModalFooter,
55
+ {
56
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
57
+ endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, disabled: !values.name, type: "submit", children: formatMessage({
58
+ id: "content-releases.modal.form.button.submit",
59
+ defaultMessage: "Continue"
60
+ }) })
61
+ }
62
+ )
63
+ ] })
64
+ }
65
+ )
66
+ ] });
67
+ };
68
+ const ReleaseInfoWrapper = styled(Flex)`
69
+ align-self: stretch;
70
+ border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
71
+ border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
72
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
73
+ `;
74
+ const StyledFlex = styled(Flex)`
75
+ align-self: stretch;
76
+ `;
77
+ const PencilIcon = styled(Pencil)`
78
+ width: ${({ theme }) => theme.spaces[4]};
79
+ height: ${({ theme }) => theme.spaces[4]};
80
+ path {
81
+ fill: ${({ theme }) => theme.colors.neutral600};
82
+ }
83
+ `;
84
+ const TrashIcon = styled(Trash)`
85
+ width: ${({ theme }) => theme.spaces[4]};
86
+ height: ${({ theme }) => theme.spaces[4]};
87
+ path {
88
+ fill: ${({ theme }) => theme.colors.danger600};
89
+ }
90
+ `;
91
+ const PopoverButton = ({ onClick, children }) => {
92
+ return /* @__PURE__ */ jsx(
93
+ StyledFlex,
94
+ {
95
+ paddingTop: 2,
96
+ paddingBottom: 2,
97
+ paddingLeft: 4,
98
+ paddingRight: 4,
99
+ alignItems: "center",
100
+ gap: 2,
101
+ as: "button",
102
+ hasRadius: true,
103
+ onClick,
104
+ children
105
+ }
106
+ );
107
+ };
108
+ const ReleaseDetailsLayout = ({
109
+ toggleEditReleaseModal,
110
+ toggleWarningSubmit,
111
+ children
112
+ }) => {
113
+ const { formatMessage } = useIntl();
114
+ const { releaseId } = useParams();
115
+ const [isPopoverVisible, setIsPopoverVisible] = React.useState(false);
116
+ const moreButtonRef = React.useRef(null);
117
+ const { data, isLoading: isLoadingDetails, isError } = useGetReleaseQuery({ id: releaseId });
118
+ const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
119
+ const toggleNotification = useNotification();
120
+ const { formatAPIError } = useAPIErrorHandler();
121
+ const release = data?.data;
122
+ const handleTogglePopover = () => {
123
+ setIsPopoverVisible((prev) => !prev);
124
+ };
125
+ const openReleaseModal = () => {
126
+ toggleEditReleaseModal();
127
+ handleTogglePopover();
128
+ };
129
+ const handlePublishRelease = async () => {
130
+ const response = await publishRelease({ id: releaseId });
131
+ if ("data" in response) {
132
+ toggleNotification({
133
+ type: "success",
134
+ message: formatMessage({
135
+ id: "content-releases.pages.ReleaseDetails.publish-notification-success",
136
+ defaultMessage: "Release was published successfully."
137
+ })
138
+ });
139
+ } else if (isAxiosError(response.error)) {
140
+ toggleNotification({
141
+ type: "warning",
142
+ message: formatAPIError(response.error)
143
+ });
144
+ } else {
145
+ toggleNotification({
146
+ type: "warning",
147
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
148
+ });
149
+ }
150
+ };
151
+ const openWarningConfirmDialog = () => {
152
+ toggleWarningSubmit();
153
+ handleTogglePopover();
154
+ };
155
+ if (isLoadingDetails) {
156
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(Box, { paddingBottom: 8, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) }) });
157
+ }
158
+ if (isError || !release) {
159
+ return /* @__PURE__ */ jsx(Main, { children: /* @__PURE__ */ jsx(Box, { paddingBottom: 8, children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) }) });
160
+ }
161
+ const totalEntries = release.actions.meta.count || 0;
162
+ const createdBy = `${release.createdBy.firstname} ${release.createdBy.lastname}`;
163
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
164
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 8, children: /* @__PURE__ */ jsx(
165
+ HeaderLayout,
166
+ {
167
+ title: release.name,
168
+ subtitle: formatMessage(
169
+ {
170
+ id: "content-releases.pages.Details.header-subtitle",
171
+ defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
172
+ },
173
+ { number: totalEntries }
174
+ ),
175
+ navigationAction: /* @__PURE__ */ jsx(Link, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
176
+ id: "global.back",
177
+ defaultMessage: "Back"
178
+ }) }),
179
+ primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
180
+ /* @__PURE__ */ jsx(
181
+ IconButton,
182
+ {
183
+ label: formatMessage({
184
+ id: "content-releases.header.actions.open-release-actions",
185
+ defaultMessage: "Release actions"
186
+ }),
187
+ ref: moreButtonRef,
188
+ onClick: handleTogglePopover,
189
+ children: /* @__PURE__ */ jsx(More, {})
190
+ }
191
+ ),
192
+ isPopoverVisible && /* @__PURE__ */ jsxs(
193
+ Popover,
194
+ {
195
+ source: moreButtonRef,
196
+ placement: "bottom-end",
197
+ onDismiss: handleTogglePopover,
198
+ spacing: 4,
199
+ minWidth: "242px",
200
+ children: [
201
+ /* @__PURE__ */ jsxs(
202
+ Flex,
203
+ {
204
+ alignItems: "center",
205
+ justifyContent: "center",
206
+ direction: "column",
207
+ padding: 1,
208
+ children: [
209
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.update, children: /* @__PURE__ */ jsxs(PopoverButton, { onClick: openReleaseModal, children: [
210
+ /* @__PURE__ */ jsx(PencilIcon, {}),
211
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
212
+ id: "content-releases.header.actions.edit",
213
+ defaultMessage: "Edit"
214
+ }) })
215
+ ] }) }),
216
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.delete, children: /* @__PURE__ */ jsxs(PopoverButton, { onClick: openWarningConfirmDialog, children: [
217
+ /* @__PURE__ */ jsx(TrashIcon, {}),
218
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
219
+ id: "content-releases.header.actions.delete",
220
+ defaultMessage: "Delete"
221
+ }) })
222
+ ] }) })
223
+ ]
224
+ }
225
+ ),
226
+ /* @__PURE__ */ jsxs(
227
+ ReleaseInfoWrapper,
228
+ {
229
+ direction: "column",
230
+ justifyContent: "center",
231
+ alignItems: "flex-start",
232
+ gap: 1,
233
+ padding: 5,
234
+ children: [
235
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
236
+ id: "content-releases.header.actions.created",
237
+ defaultMessage: "Created"
238
+ }) }),
239
+ /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
240
+ /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
241
+ formatMessage(
242
+ {
243
+ id: "content-releases.header.actions.created.description",
244
+ defaultMessage: " by {createdBy}"
245
+ },
246
+ { createdBy }
247
+ )
248
+ ] })
249
+ ]
250
+ }
251
+ )
252
+ ]
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", children: formatMessage({
256
+ id: "content-releases.header.actions.refresh",
257
+ defaultMessage: "Refresh"
258
+ }) }),
259
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
260
+ Button,
261
+ {
262
+ size: "S",
263
+ variant: "default",
264
+ onClick: handlePublishRelease,
265
+ loading: isPublishing,
266
+ disabled: release.actions.meta.count === 0,
267
+ children: formatMessage({
268
+ id: "content-releases.header.actions.publish",
269
+ defaultMessage: "Publish"
270
+ })
271
+ }
272
+ ) })
273
+ ] })
274
+ }
275
+ ) }),
276
+ children
277
+ ] });
278
+ };
279
+ const ReleaseDetailsBody = () => {
280
+ const { formatMessage } = useIntl();
281
+ const { releaseId } = useParams();
282
+ const [{ query }] = useQueryParams();
283
+ const toggleNotification = useNotification();
284
+ const { formatAPIError } = useAPIErrorHandler();
285
+ const {
286
+ data: releaseData,
287
+ isLoading: isReleaseLoading,
288
+ isError: isReleaseError
289
+ } = useGetReleaseQuery({ id: releaseId });
290
+ const release = releaseData?.data;
291
+ const { isLoading, isFetching, isError, data } = useGetReleaseActionsQuery({
292
+ ...query,
293
+ releaseId
294
+ });
295
+ const [updateReleaseAction] = useUpdateReleaseActionMutation();
296
+ const handleChangeType = async (e, actionId) => {
297
+ const response = await updateReleaseAction({
298
+ params: {
299
+ releaseId,
300
+ actionId
301
+ },
302
+ body: {
303
+ type: e.target.value
304
+ }
305
+ });
306
+ if ("error" in response) {
307
+ if (isAxiosError(response.error)) {
308
+ toggleNotification({
309
+ type: "warning",
310
+ message: formatAPIError(response.error)
311
+ });
312
+ } else {
313
+ toggleNotification({
314
+ type: "warning",
315
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
316
+ });
317
+ }
318
+ }
319
+ };
320
+ if (isLoading || isReleaseLoading) {
321
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
322
+ }
323
+ if (isError || isReleaseError || !release) {
324
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
325
+ }
326
+ const releaseActions = data?.data;
327
+ const releaseMeta = data?.meta;
328
+ if (!releaseActions || !releaseActions.length) {
329
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
330
+ EmptyStateLayout,
331
+ {
332
+ content: formatMessage({
333
+ id: "content-releases.pages.Details.empty-state.content",
334
+ defaultMessage: "This release is empty."
335
+ }),
336
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
337
+ }
338
+ ) });
339
+ }
340
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
341
+ /* @__PURE__ */ jsx(
342
+ Table.Root,
343
+ {
344
+ rows: releaseActions.map((item) => ({
345
+ ...item,
346
+ id: Number(item.entry.id)
347
+ })),
348
+ colCount: releaseActions.length,
349
+ isLoading,
350
+ isFetching,
351
+ children: /* @__PURE__ */ jsxs(Table.Content, { children: [
352
+ /* @__PURE__ */ jsxs(Table.Head, { children: [
353
+ /* @__PURE__ */ jsx(
354
+ Table.HeaderCell,
355
+ {
356
+ fieldSchemaType: "string",
357
+ label: formatMessage({
358
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
359
+ defaultMessage: "name"
360
+ }),
361
+ name: "name"
362
+ }
363
+ ),
364
+ /* @__PURE__ */ jsx(
365
+ Table.HeaderCell,
366
+ {
367
+ fieldSchemaType: "string",
368
+ label: formatMessage({
369
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
370
+ defaultMessage: "locale"
371
+ }),
372
+ name: "locale"
373
+ }
374
+ ),
375
+ /* @__PURE__ */ jsx(
376
+ Table.HeaderCell,
377
+ {
378
+ fieldSchemaType: "string",
379
+ label: formatMessage({
380
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
381
+ defaultMessage: "content-type"
382
+ }),
383
+ name: "content-type"
384
+ }
385
+ ),
386
+ /* @__PURE__ */ jsx(
387
+ Table.HeaderCell,
388
+ {
389
+ fieldSchemaType: "string",
390
+ label: formatMessage({
391
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
392
+ defaultMessage: "action"
393
+ }),
394
+ name: "action"
395
+ }
396
+ )
397
+ ] }),
398
+ /* @__PURE__ */ jsx(Table.LoadingBody, {}),
399
+ /* @__PURE__ */ jsx(Table.Body, { children: releaseActions.map(({ id, type, entry }) => /* @__PURE__ */ jsxs(Tr, { children: [
400
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { children: `${entry.contentType.mainFieldValue || entry.id}` }) }),
401
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { children: `${entry?.locale?.name ? entry.locale.name : "-"}` }) }),
402
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { children: entry.contentType.displayName || "" }) }),
403
+ /* @__PURE__ */ jsx(Td, { children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
404
+ {
405
+ id: "content-releases.page.ReleaseDetails.table.action-published",
406
+ defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
407
+ },
408
+ {
409
+ isPublish: type === "publish",
410
+ b: (children) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children })
411
+ }
412
+ ) }) : /* @__PURE__ */ jsx(
413
+ ReleaseActionOptions,
414
+ {
415
+ selected: type,
416
+ handleChange: (e) => handleChangeType(e, id),
417
+ name: `release-action-${id}-type`
418
+ }
419
+ ) })
420
+ ] }, id)) })
421
+ ] })
422
+ }
423
+ ),
424
+ /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
425
+ /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
426
+ /* @__PURE__ */ jsx(
427
+ PaginationURLQuery,
428
+ {
429
+ pagination: {
430
+ pageCount: releaseMeta?.pagination?.pageCount || 0
431
+ }
432
+ }
433
+ )
434
+ ] })
435
+ ] }) });
436
+ };
437
+ const ReleaseDetailsPage = () => {
438
+ const { formatMessage } = useIntl();
439
+ const { releaseId } = useParams();
440
+ const toggleNotification = useNotification();
441
+ const { formatAPIError } = useAPIErrorHandler();
442
+ const { push } = useHistory();
443
+ const [releaseModalShown, setReleaseModalShown] = React.useState(false);
444
+ const [showWarningSubmit, setWarningSubmit] = React.useState(false);
445
+ const {
446
+ isLoading: isLoadingDetails,
447
+ data,
448
+ isSuccess: isSuccessDetails
449
+ } = useGetReleaseQuery({ id: releaseId });
450
+ const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
451
+ const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
452
+ const toggleEditReleaseModal = () => {
453
+ setReleaseModalShown((prev) => !prev);
454
+ };
455
+ const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
456
+ if (isLoadingDetails) {
457
+ return /* @__PURE__ */ jsx(
458
+ ReleaseDetailsLayout,
459
+ {
460
+ toggleEditReleaseModal,
461
+ toggleWarningSubmit,
462
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
463
+ }
464
+ );
465
+ }
466
+ const title = isSuccessDetails && data?.data?.name || "";
467
+ const handleEditRelease = async (values) => {
468
+ const response = await updateRelease({
469
+ id: releaseId,
470
+ name: values.name
471
+ });
472
+ if ("data" in response) {
473
+ toggleNotification({
474
+ type: "success",
475
+ message: formatMessage({
476
+ id: "content-releases.modal.release-updated-notification-success",
477
+ defaultMessage: "Release updated."
478
+ })
479
+ });
480
+ } else if (isAxiosError(response.error)) {
481
+ toggleNotification({
482
+ type: "warning",
483
+ message: formatAPIError(response.error)
484
+ });
485
+ } else {
486
+ toggleNotification({
487
+ type: "warning",
488
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
489
+ });
490
+ }
491
+ toggleEditReleaseModal();
492
+ };
493
+ const handleDeleteRelease = async () => {
494
+ const response = await deleteRelease({
495
+ id: releaseId
496
+ });
497
+ if ("data" in response) {
498
+ push("/plugins/content-releases");
499
+ } else if (isAxiosError(response.error)) {
500
+ toggleNotification({
501
+ type: "warning",
502
+ message: formatAPIError(response.error)
503
+ });
504
+ } else {
505
+ toggleNotification({
506
+ type: "warning",
507
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
508
+ });
509
+ }
510
+ };
511
+ return /* @__PURE__ */ jsxs(
512
+ ReleaseDetailsLayout,
513
+ {
514
+ toggleEditReleaseModal,
515
+ toggleWarningSubmit,
516
+ children: [
517
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
518
+ releaseModalShown && /* @__PURE__ */ jsx(
519
+ ReleaseModal,
520
+ {
521
+ handleClose: toggleEditReleaseModal,
522
+ handleSubmit: handleEditRelease,
523
+ isLoading: isLoadingDetails || isSubmittingForm,
524
+ initialValues: { name: title || "" }
525
+ }
526
+ ),
527
+ /* @__PURE__ */ jsx(
528
+ ConfirmDialog,
529
+ {
530
+ bodyText: {
531
+ id: "content-releases.dialog.confirmation-message",
532
+ defaultMessage: "Are you sure you want to delete this release?"
533
+ },
534
+ isOpen: showWarningSubmit,
535
+ isConfirmButtonLoading: isDeletingRelease,
536
+ onToggleDialog: toggleWarningSubmit,
537
+ onConfirm: handleDeleteRelease
538
+ }
539
+ )
540
+ ]
541
+ }
542
+ );
543
+ };
544
+ const ProtectedReleaseDetailsPage = () => /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) });
545
+ const ReleasesLayout = ({
546
+ isLoading,
547
+ totalReleases,
548
+ onClickAddRelease,
549
+ children
550
+ }) => {
551
+ const { formatMessage } = useIntl();
552
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
553
+ /* @__PURE__ */ jsx(
554
+ HeaderLayout,
555
+ {
556
+ title: formatMessage({
557
+ id: "content-releases.pages.Releases.title",
558
+ defaultMessage: "Releases"
559
+ }),
560
+ subtitle: !isLoading && formatMessage(
561
+ {
562
+ id: "content-releases.pages.Releases.header-subtitle",
563
+ defaultMessage: "{number, plural, =0 {No releases} one {# release} other {# releases}}"
564
+ },
565
+ { number: totalReleases }
566
+ ),
567
+ primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(Button, { startIcon: /* @__PURE__ */ jsx(Plus, {}), onClick: onClickAddRelease, children: formatMessage({
568
+ id: "content-releases.header.actions.add-release",
569
+ defaultMessage: "New release"
570
+ }) }) })
571
+ }
572
+ ),
573
+ children
574
+ ] });
575
+ };
576
+ const LinkCard = styled(Link$1)`
577
+ display: block;
578
+ `;
579
+ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
580
+ const { formatMessage } = useIntl();
581
+ if (isError) {
582
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
583
+ }
584
+ if (releases?.length === 0) {
585
+ return /* @__PURE__ */ jsx(
586
+ EmptyStateLayout,
587
+ {
588
+ content: formatMessage(
589
+ {
590
+ id: "content-releases.page.Releases.tab.emptyEntries",
591
+ defaultMessage: "No releases"
592
+ },
593
+ {
594
+ target: sectionTitle
595
+ }
596
+ ),
597
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
598
+ }
599
+ );
600
+ }
601
+ 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(
602
+ Flex,
603
+ {
604
+ direction: "column",
605
+ justifyContent: "space-between",
606
+ padding: 4,
607
+ hasRadius: true,
608
+ background: "neutral0",
609
+ shadow: "tableShadow",
610
+ height: "100%",
611
+ width: "100%",
612
+ alignItems: "start",
613
+ gap: 2,
614
+ children: [
615
+ /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
616
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", children: formatMessage(
617
+ {
618
+ id: "content-releases.page.Releases.release-item.entries",
619
+ defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
620
+ },
621
+ { number: actions.meta.count }
622
+ ) })
623
+ ]
624
+ }
625
+ ) }) }, id)) });
626
+ };
627
+ const INITIAL_FORM_VALUES = {
628
+ name: ""
629
+ };
630
+ const ReleasesPage = () => {
631
+ const [releaseModalShown, setReleaseModalShown] = React.useState(false);
632
+ const toggleNotification = useNotification();
633
+ const { formatMessage } = useIntl();
634
+ const { push } = useHistory();
635
+ const { formatAPIError } = useAPIErrorHandler();
636
+ const [{ query }, setQuery] = useQueryParams();
637
+ const response = useGetReleasesQuery(query);
638
+ const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
639
+ const { isLoading, isSuccess, isError } = response;
640
+ const toggleAddReleaseModal = () => {
641
+ setReleaseModalShown((prev) => !prev);
642
+ };
643
+ if (isLoading) {
644
+ return /* @__PURE__ */ jsx(ReleasesLayout, { onClickAddRelease: toggleAddReleaseModal, isLoading: true, children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) }) });
645
+ }
646
+ const totalReleases = isSuccess && response.currentData?.meta?.pagination?.total || 0;
647
+ const handleTabChange = (index) => {
648
+ setQuery({
649
+ ...query,
650
+ page: 1,
651
+ pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
652
+ filters: {
653
+ releasedAt: {
654
+ $notNull: index === 0 ? false : true
655
+ }
656
+ }
657
+ });
658
+ };
659
+ const activeTab = response?.currentData?.meta?.activeTab || "pending";
660
+ const handleAddRelease = async (values) => {
661
+ const response2 = await createRelease({
662
+ name: values.name
663
+ });
664
+ if ("data" in response2) {
665
+ toggleNotification({
666
+ type: "success",
667
+ message: formatMessage({
668
+ id: "content-releases.modal.release-created-notification-success",
669
+ defaultMessage: "Release created."
670
+ })
671
+ });
672
+ push(`/plugins/content-releases/${response2.data.data.id}`);
673
+ } else if (isAxiosError(response2.error)) {
674
+ toggleNotification({
675
+ type: "warning",
676
+ message: formatAPIError(response2.error)
677
+ });
678
+ } else {
679
+ toggleNotification({
680
+ type: "warning",
681
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
682
+ });
683
+ }
684
+ };
685
+ return /* @__PURE__ */ jsxs(ReleasesLayout, { onClickAddRelease: toggleAddReleaseModal, totalReleases, children: [
686
+ /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
687
+ /* @__PURE__ */ jsxs(
688
+ TabGroup,
689
+ {
690
+ label: formatMessage({
691
+ id: "content-releases.pages.Releases.tab-group.label",
692
+ defaultMessage: "Releases list"
693
+ }),
694
+ variant: "simple",
695
+ initialSelectedTabIndex: ["pending", "done"].indexOf(activeTab),
696
+ onTabChange: handleTabChange,
697
+ children: [
698
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxs(Tabs, { children: [
699
+ /* @__PURE__ */ jsx(Tab, { children: formatMessage({
700
+ id: "content-releases.pages.Releases.tab.pending",
701
+ defaultMessage: "Pending"
702
+ }) }),
703
+ /* @__PURE__ */ jsx(Tab, { children: formatMessage({
704
+ id: "content-releases.pages.Releases.tab.done",
705
+ defaultMessage: "Done"
706
+ }) })
707
+ ] }) }),
708
+ /* @__PURE__ */ jsxs(TabPanels, { children: [
709
+ /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
710
+ ReleasesGrid,
711
+ {
712
+ sectionTitle: "pending",
713
+ releases: response?.currentData?.data,
714
+ isError
715
+ }
716
+ ) }),
717
+ /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
718
+ ReleasesGrid,
719
+ {
720
+ sectionTitle: "done",
721
+ releases: response?.currentData?.data,
722
+ isError
723
+ }
724
+ ) })
725
+ ] })
726
+ ]
727
+ }
728
+ ),
729
+ totalReleases > 0 && /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
730
+ /* @__PURE__ */ jsx(
731
+ PageSizeURLQuery,
732
+ {
733
+ options: ["8", "16", "32", "64"],
734
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
735
+ }
736
+ ),
737
+ /* @__PURE__ */ jsx(
738
+ PaginationURLQuery,
739
+ {
740
+ pagination: {
741
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
742
+ }
743
+ }
744
+ )
745
+ ] })
746
+ ] }) }),
747
+ releaseModalShown && /* @__PURE__ */ jsx(
748
+ ReleaseModal,
749
+ {
750
+ handleClose: toggleAddReleaseModal,
751
+ handleSubmit: handleAddRelease,
752
+ isLoading: isSubmittingForm,
753
+ initialValues: INITIAL_FORM_VALUES
754
+ }
755
+ )
756
+ ] });
757
+ };
758
+ const ProtectedReleasesPage = () => /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsx(ReleasesPage, {}) });
759
+ const App = () => {
760
+ return /* @__PURE__ */ jsxs(Switch, { children: [
761
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ProtectedReleasesPage }),
762
+ /* @__PURE__ */ jsx(
763
+ Route,
764
+ {
765
+ exact: true,
766
+ path: `/plugins/${pluginId}/:releaseId`,
767
+ component: ProtectedReleaseDetailsPage
768
+ }
769
+ )
770
+ ] });
771
+ };
772
+ export {
773
+ App
774
+ };
775
+ //# sourceMappingURL=App-b83f4a97.mjs.map