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

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