@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,763 @@
1
+ import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, prefixPluginTranslations } from "@strapi/helper-plugin";
2
+ import { Cross, More, Plus, PaperPlane } from "@strapi/icons";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import * as React from "react";
5
+ import { skipToken } from "@reduxjs/toolkit/query";
6
+ import { IconButton, Flex, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
+ import { isAxiosError as isAxiosError$1 } from "axios";
8
+ import { Formik, Form } from "formik";
9
+ import { useIntl } from "react-intl";
10
+ import { useParams } from "react-router-dom";
11
+ import * as yup from "yup";
12
+ import { createApi } from "@reduxjs/toolkit/query/react";
13
+ import { Menu } from "@strapi/design-system/v2";
14
+ import styled from "styled-components";
15
+ const __variableDynamicImportRuntimeHelper = (glob, path) => {
16
+ const v = glob[path];
17
+ if (v) {
18
+ return typeof v === "function" ? v() : Promise.resolve(v);
19
+ }
20
+ return new Promise((_, reject) => {
21
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
22
+ });
23
+ };
24
+ const PERMISSIONS = {
25
+ main: [
26
+ {
27
+ action: "plugin::content-releases.read",
28
+ subject: null
29
+ }
30
+ ],
31
+ create: [
32
+ {
33
+ action: "plugin::content-releases.create",
34
+ subject: null
35
+ }
36
+ ],
37
+ update: [
38
+ {
39
+ action: "plugin::content-releases.update",
40
+ subject: null
41
+ }
42
+ ],
43
+ delete: [
44
+ {
45
+ action: "plugin::content-releases.delete",
46
+ subject: null
47
+ }
48
+ ],
49
+ createAction: [
50
+ {
51
+ action: "plugin::content-releases.create-action",
52
+ subject: null
53
+ }
54
+ ],
55
+ deleteAction: [
56
+ {
57
+ action: "plugin::content-releases.delete-action",
58
+ subject: null
59
+ }
60
+ ],
61
+ publish: [
62
+ {
63
+ action: "plugin::content-releases.publish",
64
+ subject: null
65
+ }
66
+ ]
67
+ };
68
+ const pluginId = "content-releases";
69
+ const axiosBaseQuery = async ({
70
+ url,
71
+ method,
72
+ data,
73
+ config
74
+ }) => {
75
+ try {
76
+ const { get, post, del, put } = getFetchClient();
77
+ if (method === "POST") {
78
+ const result2 = await post(url, data, config);
79
+ return { data: result2.data };
80
+ }
81
+ if (method === "DELETE") {
82
+ const result2 = await del(url, config);
83
+ return { data: result2.data };
84
+ }
85
+ if (method === "PUT") {
86
+ const result2 = await put(url, data, config);
87
+ return { data: result2.data };
88
+ }
89
+ const result = await get(url, config);
90
+ return { data: result.data };
91
+ } catch (error) {
92
+ const err = error;
93
+ return {
94
+ error: {
95
+ status: err.response?.status,
96
+ code: err.code,
97
+ response: {
98
+ data: err.response?.data
99
+ }
100
+ }
101
+ };
102
+ }
103
+ };
104
+ const isAxiosError = (err) => {
105
+ return typeof err === "object" && err !== null && "response" in err && typeof err.response === "object" && err.response !== null && "data" in err.response;
106
+ };
107
+ const releaseApi = createApi({
108
+ reducerPath: pluginId,
109
+ baseQuery: axiosBaseQuery,
110
+ tagTypes: ["Release", "ReleaseAction"],
111
+ endpoints: (build) => {
112
+ return {
113
+ getReleasesForEntry: build.query({
114
+ query(params) {
115
+ return {
116
+ url: "/content-releases",
117
+ method: "GET",
118
+ config: {
119
+ params
120
+ }
121
+ };
122
+ },
123
+ providesTags: (result) => result ? [
124
+ ...result.data.map(({ id }) => ({ type: "Release", id })),
125
+ { type: "Release", id: "LIST" }
126
+ ] : []
127
+ }),
128
+ getReleases: build.query({
129
+ query({ page, pageSize, filters } = {
130
+ page: 1,
131
+ pageSize: 16,
132
+ filters: {
133
+ releasedAt: {
134
+ $notNull: false
135
+ }
136
+ }
137
+ }) {
138
+ return {
139
+ url: "/content-releases",
140
+ method: "GET",
141
+ config: {
142
+ params: {
143
+ page: page || 1,
144
+ pageSize: pageSize || 16,
145
+ filters: filters || {
146
+ releasedAt: {
147
+ $notNull: false
148
+ }
149
+ }
150
+ }
151
+ }
152
+ };
153
+ },
154
+ transformResponse(response, meta, arg) {
155
+ const releasedAtValue = arg?.filters?.releasedAt?.$notNull;
156
+ const isActiveDoneTab = releasedAtValue === "true";
157
+ const newResponse = {
158
+ ...response,
159
+ meta: {
160
+ ...response.meta,
161
+ activeTab: isActiveDoneTab ? "done" : "pending"
162
+ }
163
+ };
164
+ return newResponse;
165
+ },
166
+ providesTags: (result) => result ? [
167
+ ...result.data.map(({ id }) => ({ type: "Release", id })),
168
+ { type: "Release", id: "LIST" }
169
+ ] : [{ type: "Release", id: "LIST" }]
170
+ }),
171
+ getRelease: build.query({
172
+ query({ id }) {
173
+ return {
174
+ url: `/content-releases/${id}`,
175
+ method: "GET"
176
+ };
177
+ },
178
+ providesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
179
+ }),
180
+ getReleaseActions: build.query({
181
+ query({ releaseId, page, pageSize }) {
182
+ return {
183
+ url: `/content-releases/${releaseId}/actions`,
184
+ method: "GET",
185
+ config: {
186
+ params: {
187
+ page,
188
+ pageSize
189
+ }
190
+ }
191
+ };
192
+ },
193
+ providesTags: (result, error, arg) => result ? [
194
+ ...result.data.map(({ id }) => ({ type: "ReleaseAction", id })),
195
+ { type: "ReleaseAction", id: "LIST" }
196
+ ] : [{ type: "ReleaseAction", id: "LIST" }]
197
+ }),
198
+ createRelease: build.mutation({
199
+ query(data) {
200
+ return {
201
+ url: "/content-releases",
202
+ method: "POST",
203
+ data
204
+ };
205
+ },
206
+ invalidatesTags: [{ type: "Release", id: "LIST" }]
207
+ }),
208
+ updateRelease: build.mutation({
209
+ query({ id, ...data }) {
210
+ return {
211
+ url: `/content-releases/${id}`,
212
+ method: "PUT",
213
+ data
214
+ };
215
+ },
216
+ invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
217
+ }),
218
+ createReleaseAction: build.mutation({
219
+ query({ body, params }) {
220
+ return {
221
+ url: `/content-releases/${params.releaseId}/actions`,
222
+ method: "POST",
223
+ data: body
224
+ };
225
+ },
226
+ invalidatesTags: [
227
+ { type: "Release", id: "LIST" },
228
+ { type: "ReleaseAction", id: "LIST" }
229
+ ]
230
+ }),
231
+ updateReleaseAction: build.mutation({
232
+ query({ body, params }) {
233
+ return {
234
+ url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,
235
+ method: "PUT",
236
+ data: body
237
+ };
238
+ },
239
+ invalidatesTags: (result, error, arg) => [
240
+ { type: "ReleaseAction", id: arg.params.actionId }
241
+ ]
242
+ }),
243
+ deleteReleaseAction: build.mutation({
244
+ query({ params }) {
245
+ return {
246
+ url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,
247
+ method: "DELETE"
248
+ };
249
+ },
250
+ invalidatesTags: [
251
+ { type: "Release", id: "LIST" },
252
+ { type: "ReleaseAction", id: "LIST" }
253
+ ]
254
+ }),
255
+ publishRelease: build.mutation({
256
+ query({ id }) {
257
+ return {
258
+ url: `/content-releases/${id}/publish`,
259
+ method: "POST"
260
+ };
261
+ },
262
+ invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
263
+ }),
264
+ deleteRelease: build.mutation({
265
+ query({ id }) {
266
+ return {
267
+ url: `/content-releases/${id}`,
268
+ method: "DELETE"
269
+ };
270
+ },
271
+ invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
272
+ })
273
+ };
274
+ }
275
+ });
276
+ const {
277
+ useGetReleasesQuery,
278
+ useGetReleasesForEntryQuery,
279
+ useGetReleaseQuery,
280
+ useGetReleaseActionsQuery,
281
+ useCreateReleaseMutation,
282
+ useCreateReleaseActionMutation,
283
+ useUpdateReleaseMutation,
284
+ useUpdateReleaseActionMutation,
285
+ usePublishReleaseMutation,
286
+ useDeleteReleaseActionMutation,
287
+ useDeleteReleaseMutation
288
+ } = releaseApi;
289
+ const StyledMenuItem = styled(Menu.Item)`
290
+ &:hover {
291
+ background: transparent;
292
+ }
293
+
294
+ svg {
295
+ path {
296
+ fill: ${({ theme }) => theme.colors.danger600};
297
+ }
298
+ }
299
+
300
+ &:hover {
301
+ svg {
302
+ path {
303
+ fill: ${({ theme }) => theme.colors.danger600};
304
+ }
305
+ }
306
+ }
307
+ `;
308
+ const StyledCross = styled(Cross)`
309
+ padding: ${({ theme }) => theme.spaces[1]};
310
+ `;
311
+ const ReleaseActionMenu = ({ releaseId, actionId }) => {
312
+ const { formatMessage } = useIntl();
313
+ const toggleNotification = useNotification();
314
+ const { formatAPIError } = useAPIErrorHandler();
315
+ const [deleteReleaseAction] = useDeleteReleaseActionMutation();
316
+ const handleDeleteAction = async () => {
317
+ const response = await deleteReleaseAction({
318
+ params: { releaseId, actionId }
319
+ });
320
+ if ("data" in response) {
321
+ toggleNotification({
322
+ type: "success",
323
+ message: formatMessage({
324
+ id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
325
+ defaultMessage: "Entry removed from release"
326
+ })
327
+ });
328
+ return;
329
+ }
330
+ if ("error" in response) {
331
+ if (isAxiosError$1(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
+ return (
345
+ // A user can access the dropdown if they have permissions to delete a release-action OR update a release
346
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
347
+ /* @__PURE__ */ jsx(
348
+ Menu.Trigger,
349
+ {
350
+ as: IconButton,
351
+ paddingLeft: 2,
352
+ paddingRight: 2,
353
+ "aria-label": formatMessage({
354
+ id: "content-releases.content-manager-edit-view.release-action-menu",
355
+ defaultMessage: "Release action options"
356
+ }),
357
+ icon: /* @__PURE__ */ jsx(More, {})
358
+ }
359
+ ),
360
+ /* @__PURE__ */ jsx(Menu.Content, { top: 1, children: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { color: "danger600", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
361
+ /* @__PURE__ */ jsx(StyledCross, {}),
362
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
363
+ id: "content-releases.content-manager-edit-view.remove-from-release",
364
+ defaultMessage: "Remove from release"
365
+ }) })
366
+ ] }) }) }) })
367
+ ] }) })
368
+ );
369
+ };
370
+ const getBorderLeftRadiusValue = (actionType) => {
371
+ return actionType === "publish" ? 1 : 0;
372
+ };
373
+ const getBorderRightRadiusValue = (actionType) => {
374
+ return actionType === "publish" ? 0 : 1;
375
+ };
376
+ const FieldWrapper = styled(Field)`
377
+ border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
378
+ border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
379
+ border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
380
+ border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
381
+
382
+ > label {
383
+ color: inherit;
384
+ padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};
385
+ text-align: center;
386
+ vertical-align: middle;
387
+ text-transform: capitalize;
388
+ }
389
+
390
+ &:active,
391
+ &[data-checked='true'] {
392
+ color: ${({ theme }) => theme.colors.primary700};
393
+ background-color: ${({ theme }) => theme.colors.primary100};
394
+ border-color: ${({ theme }) => theme.colors.primary700};
395
+ }
396
+
397
+ &[data-checked='false'] {
398
+ border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
399
+ border-right: ${({ actionType }) => actionType === "publish" && "none"};
400
+ }
401
+ `;
402
+ const ActionOption = ({ selected, actionType, handleChange, name }) => {
403
+ return /* @__PURE__ */ jsx(
404
+ FieldWrapper,
405
+ {
406
+ actionType,
407
+ background: "primary0",
408
+ borderColor: "neutral200",
409
+ color: selected === actionType ? "primary600" : "neutral600",
410
+ position: "relative",
411
+ cursor: "pointer",
412
+ "data-checked": selected === actionType,
413
+ children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
414
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
415
+ FieldInput,
416
+ {
417
+ type: "radio",
418
+ id: `${name}-${actionType}`,
419
+ name,
420
+ checked: selected === actionType,
421
+ onChange: handleChange,
422
+ value: actionType
423
+ }
424
+ ) }),
425
+ actionType
426
+ ] })
427
+ }
428
+ );
429
+ };
430
+ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
431
+ return /* @__PURE__ */ jsxs(Flex, { children: [
432
+ /* @__PURE__ */ jsx(
433
+ ActionOption,
434
+ {
435
+ actionType: "publish",
436
+ selected,
437
+ handleChange,
438
+ name
439
+ }
440
+ ),
441
+ /* @__PURE__ */ jsx(
442
+ ActionOption,
443
+ {
444
+ actionType: "unpublish",
445
+ selected,
446
+ handleChange,
447
+ name
448
+ }
449
+ )
450
+ ] });
451
+ };
452
+ const RELEASE_ACTION_FORM_SCHEMA = yup.object().shape({
453
+ type: yup.string().oneOf(["publish", "unpublish"]).required(),
454
+ releaseId: yup.string().required()
455
+ });
456
+ const INITIAL_VALUES = {
457
+ type: "publish",
458
+ releaseId: ""
459
+ };
460
+ const AddActionToReleaseModal = ({
461
+ handleClose,
462
+ contentTypeUid,
463
+ entryId
464
+ }) => {
465
+ const { formatMessage } = useIntl();
466
+ const toggleNotification = useNotification();
467
+ const { formatAPIError } = useAPIErrorHandler();
468
+ const response = useGetReleasesForEntryQuery({
469
+ contentTypeUid,
470
+ entryId,
471
+ hasEntryAttached: false
472
+ });
473
+ const releases = response.data?.data;
474
+ const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
475
+ const handleSubmit = async (values) => {
476
+ const releaseActionEntry = {
477
+ contentType: contentTypeUid,
478
+ id: entryId
479
+ };
480
+ const response2 = await createReleaseAction({
481
+ body: { type: values.type, entry: releaseActionEntry },
482
+ params: { releaseId: values.releaseId }
483
+ });
484
+ if ("data" in response2) {
485
+ toggleNotification({
486
+ type: "success",
487
+ message: formatMessage({
488
+ id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
489
+ defaultMessage: "Entry added to release"
490
+ })
491
+ });
492
+ handleClose();
493
+ return;
494
+ }
495
+ if ("error" in response2) {
496
+ if (isAxiosError$1(response2.error)) {
497
+ toggleNotification({
498
+ type: "warning",
499
+ message: formatAPIError(response2.error)
500
+ });
501
+ } else {
502
+ toggleNotification({
503
+ type: "warning",
504
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
505
+ });
506
+ }
507
+ }
508
+ };
509
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
510
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
511
+ id: "content-releases.content-manager-edit-view.add-to-release",
512
+ defaultMessage: "Add to release"
513
+ }) }) }),
514
+ /* @__PURE__ */ jsx(
515
+ Formik,
516
+ {
517
+ onSubmit: handleSubmit,
518
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
519
+ initialValues: INITIAL_VALUES,
520
+ children: ({ values, setFieldValue }) => {
521
+ return /* @__PURE__ */ jsxs(Form, { children: [
522
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
523
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
524
+ SingleSelect,
525
+ {
526
+ required: true,
527
+ label: formatMessage({
528
+ id: "content-releases.content-manager-edit-view.add-to-release.select-label",
529
+ defaultMessage: "Select a release"
530
+ }),
531
+ placeholder: formatMessage({
532
+ id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
533
+ defaultMessage: "Select"
534
+ }),
535
+ onChange: (value) => setFieldValue("releaseId", value),
536
+ value: values.releaseId,
537
+ children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
538
+ }
539
+ ) }),
540
+ /* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
541
+ id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
542
+ defaultMessage: "What do you want to do with this entry?"
543
+ }) }),
544
+ /* @__PURE__ */ jsx(
545
+ ReleaseActionOptions,
546
+ {
547
+ selected: values.type,
548
+ handleChange: (e) => setFieldValue("type", e.target.value),
549
+ name: "type"
550
+ }
551
+ )
552
+ ] }) }),
553
+ /* @__PURE__ */ jsx(
554
+ ModalFooter,
555
+ {
556
+ startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
557
+ id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
558
+ defaultMessage: "Cancel"
559
+ }) }),
560
+ endActions: (
561
+ /**
562
+ * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
563
+ * for yup.string().required(), even when the value is falsy (including empty string)
564
+ */
565
+ /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
566
+ id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
567
+ defaultMessage: "Continue"
568
+ }) })
569
+ )
570
+ }
571
+ )
572
+ ] });
573
+ }
574
+ }
575
+ )
576
+ ] });
577
+ };
578
+ const CMReleasesContainer = () => {
579
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
580
+ const { formatMessage } = useIntl();
581
+ const {
582
+ isCreatingEntry,
583
+ allLayoutData: { contentType }
584
+ } = useCMEditViewDataManager();
585
+ const params = useParams();
586
+ const canFetch = params?.id != null && contentType?.uid != null;
587
+ const fetchParams = canFetch ? {
588
+ contentTypeUid: contentType.uid,
589
+ entryId: params.id,
590
+ hasEntryAttached: true
591
+ } : skipToken;
592
+ const response = useGetReleasesForEntryQuery(fetchParams);
593
+ const releases = response.data?.data;
594
+ if (!canFetch) {
595
+ return null;
596
+ }
597
+ if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
598
+ return null;
599
+ }
600
+ const toggleModal = () => setIsModalOpen((prev) => !prev);
601
+ const getReleaseColorVariant = (actionType, shade) => {
602
+ if (actionType === "unpublish") {
603
+ return `secondary${shade}`;
604
+ }
605
+ return `success${shade}`;
606
+ };
607
+ return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(
608
+ Box,
609
+ {
610
+ as: "aside",
611
+ "aria-label": formatMessage({
612
+ id: "content-releases.plugin.name",
613
+ defaultMessage: "Releases"
614
+ }),
615
+ background: "neutral0",
616
+ borderColor: "neutral150",
617
+ hasRadius: true,
618
+ padding: 4,
619
+ shadow: "tableShadow",
620
+ children: [
621
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 3, children: [
622
+ /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", children: formatMessage({
623
+ id: "content-releases.plugin.name",
624
+ defaultMessage: "Releases"
625
+ }) }),
626
+ releases?.map((release) => {
627
+ return /* @__PURE__ */ jsxs(
628
+ Flex,
629
+ {
630
+ direction: "column",
631
+ alignItems: "start",
632
+ borderWidth: "1px",
633
+ borderStyle: "solid",
634
+ borderColor: getReleaseColorVariant(release.action.type, "200"),
635
+ overflow: "hidden",
636
+ hasRadius: true,
637
+ children: [
638
+ /* @__PURE__ */ jsx(
639
+ Box,
640
+ {
641
+ paddingTop: 3,
642
+ paddingBottom: 3,
643
+ paddingLeft: 4,
644
+ paddingRight: 4,
645
+ background: getReleaseColorVariant(release.action.type, "100"),
646
+ width: "100%",
647
+ children: /* @__PURE__ */ jsx(
648
+ Typography,
649
+ {
650
+ fontSize: 1,
651
+ variant: "pi",
652
+ textColor: getReleaseColorVariant(release.action.type, "600"),
653
+ children: formatMessage(
654
+ {
655
+ id: "content-releases.content-manager-edit-view.list-releases.title",
656
+ defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
657
+ },
658
+ { isPublish: release.action.type === "publish" }
659
+ )
660
+ }
661
+ )
662
+ }
663
+ ),
664
+ /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
665
+ /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
666
+ /* @__PURE__ */ jsx(ReleaseActionMenu, { releaseId: release.id, actionId: release.action.id })
667
+ ] })
668
+ ]
669
+ },
670
+ release.id
671
+ );
672
+ }),
673
+ /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
674
+ Button,
675
+ {
676
+ justifyContent: "center",
677
+ paddingLeft: 4,
678
+ paddingRight: 4,
679
+ color: "neutral700",
680
+ variant: "tertiary",
681
+ startIcon: /* @__PURE__ */ jsx(Plus, {}),
682
+ onClick: toggleModal,
683
+ children: formatMessage({
684
+ id: "content-releases.content-manager-edit-view.add-to-release",
685
+ defaultMessage: "Add to release"
686
+ })
687
+ }
688
+ ) })
689
+ ] }),
690
+ isModalOpen && /* @__PURE__ */ jsx(
691
+ AddActionToReleaseModal,
692
+ {
693
+ handleClose: toggleModal,
694
+ contentTypeUid: contentType.uid,
695
+ entryId: params.id
696
+ }
697
+ )
698
+ ]
699
+ }
700
+ ) });
701
+ };
702
+ const admin = {
703
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
704
+ register(app) {
705
+ if (window.strapi.features.isEnabled("cms-content-releases") && window.strapi.future.isEnabled("contentReleases")) {
706
+ app.addMenuLink({
707
+ to: `/plugins/${pluginId}`,
708
+ icon: PaperPlane,
709
+ intlLabel: {
710
+ id: `${pluginId}.plugin.name`,
711
+ defaultMessage: "Releases"
712
+ },
713
+ async Component() {
714
+ const { App } = await import("./App-b83f4a97.mjs");
715
+ return App;
716
+ },
717
+ permissions: PERMISSIONS.main
718
+ });
719
+ app.addMiddlewares([() => releaseApi.middleware]);
720
+ app.addReducers({
721
+ [releaseApi.reducerPath]: releaseApi.reducer
722
+ });
723
+ app.injectContentManagerComponent("editView", "right-links", {
724
+ name: `${pluginId}-link`,
725
+ Component: CMReleasesContainer
726
+ });
727
+ }
728
+ },
729
+ async registerTrads({ locales }) {
730
+ const importedTrads = await Promise.all(
731
+ locales.map((locale) => {
732
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-d837b82d.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
733
+ return {
734
+ data: prefixPluginTranslations(data, "content-releases"),
735
+ locale
736
+ };
737
+ }).catch(() => {
738
+ return {
739
+ data: {},
740
+ locale
741
+ };
742
+ });
743
+ })
744
+ );
745
+ return Promise.resolve(importedTrads);
746
+ }
747
+ };
748
+ export {
749
+ PERMISSIONS as P,
750
+ ReleaseActionOptions as R,
751
+ useUpdateReleaseMutation as a,
752
+ useDeleteReleaseMutation as b,
753
+ usePublishReleaseMutation as c,
754
+ useGetReleaseActionsQuery as d,
755
+ useUpdateReleaseActionMutation as e,
756
+ useGetReleasesQuery as f,
757
+ useCreateReleaseMutation as g,
758
+ admin as h,
759
+ isAxiosError as i,
760
+ pluginId as p,
761
+ useGetReleaseQuery as u
762
+ };
763
+ //# sourceMappingURL=index-c39292e3.mjs.map