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