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

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