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