@strapi/content-releases 0.0.0-experimental.check-license → 0.0.0-next.09b9d36b22a205d90c9303f2e37134938cf76c90

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