@strapi/content-releases 5.0.0-beta.6 → 5.0.0-beta.7
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.
- package/dist/_chunks/{App-CbOy9Yd2.js → App-BdcItFff.js} +107 -114
- package/dist/_chunks/App-BdcItFff.js.map +1 -0
- package/dist/_chunks/{App-CVlffj0R.mjs → App-CJdkbHnd.mjs} +101 -107
- package/dist/_chunks/App-CJdkbHnd.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-DAHdUpAA.js → PurchaseContentReleases-Be3acS2L.js} +4 -3
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Ex09YpKR.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +5 -4
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/{index-Bwn36oqx.js → index-B6Y2hJ10.js} +84 -86
- package/dist/_chunks/index-B6Y2hJ10.js.map +1 -0
- package/dist/_chunks/{index-B7mc1tVq.mjs → index-BvhZTh4j.mjs} +86 -86
- package/dist/_chunks/index-BvhZTh4j.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/services/baseQuery.d.ts +26 -0
- package/dist/admin/src/services/release.d.ts +216 -81
- package/package.json +11 -12
- package/dist/_chunks/App-CVlffj0R.mjs.map +0 -1
- package/dist/_chunks/App-CbOy9Yd2.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-DAHdUpAA.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Ex09YpKR.mjs.map +0 -1
- package/dist/_chunks/index-B7mc1tVq.mjs.map +0 -1
- package/dist/_chunks/index-Bwn36oqx.js.map +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
|
@@ -2,17 +2,16 @@ import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { skipToken } from "@reduxjs/toolkit/query";
|
|
5
|
-
import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, useQueryParams } from "@strapi/admin/strapi-admin";
|
|
5
|
+
import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, isFetchError, useQueryParams } from "@strapi/admin/strapi-admin";
|
|
6
6
|
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
-
import { Menu, IconButton, Flex, Typography, Field,
|
|
7
|
+
import { Menu, IconButton, Flex, Typography, Field, VisuallyHidden, Box, Button, EmptyStateLayout, LinkButton, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
|
|
8
8
|
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
9
|
-
import { isAxiosError as isAxiosError$1 } from "axios";
|
|
10
9
|
import { Formik, Form } from "formik";
|
|
11
10
|
import { useIntl } from "react-intl";
|
|
12
11
|
import { Link, useParams } from "react-router-dom";
|
|
13
12
|
import * as yup from "yup";
|
|
14
13
|
import { createApi } from "@reduxjs/toolkit/query/react";
|
|
15
|
-
import styled from "styled-components";
|
|
14
|
+
import { styled } from "styled-components";
|
|
16
15
|
const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
|
17
16
|
const v = glob[path];
|
|
18
17
|
if (v) {
|
|
@@ -95,7 +94,7 @@ const PERMISSIONS = {
|
|
|
95
94
|
]
|
|
96
95
|
};
|
|
97
96
|
const pluginId = "content-releases";
|
|
98
|
-
const
|
|
97
|
+
const fetchBaseQuery = async ({
|
|
99
98
|
url,
|
|
100
99
|
method,
|
|
101
100
|
data,
|
|
@@ -121,7 +120,7 @@ const axiosBaseQuery = async ({
|
|
|
121
120
|
const err = error;
|
|
122
121
|
return {
|
|
123
122
|
error: {
|
|
124
|
-
status: err.
|
|
123
|
+
status: err.status,
|
|
125
124
|
code: err.code,
|
|
126
125
|
response: {
|
|
127
126
|
data: err.response?.data
|
|
@@ -130,12 +129,9 @@ const axiosBaseQuery = async ({
|
|
|
130
129
|
};
|
|
131
130
|
}
|
|
132
131
|
};
|
|
133
|
-
const isAxiosError = (err) => {
|
|
134
|
-
return typeof err === "object" && err !== null && "response" in err && typeof err.response === "object" && err.response !== null && "data" in err.response;
|
|
135
|
-
};
|
|
136
132
|
const releaseApi = createApi({
|
|
137
133
|
reducerPath: pluginId,
|
|
138
|
-
baseQuery:
|
|
134
|
+
baseQuery: fetchBaseQuery,
|
|
139
135
|
tagTypes: ["Release", "ReleaseAction", "EntriesInRelease"],
|
|
140
136
|
endpoints: (build) => {
|
|
141
137
|
return {
|
|
@@ -378,10 +374,10 @@ const getTimezoneOffset = (timezone, date) => {
|
|
|
378
374
|
};
|
|
379
375
|
const StyledMenuItem = styled(Menu.Item)`
|
|
380
376
|
&:hover {
|
|
381
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
377
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
382
378
|
|
|
383
379
|
svg {
|
|
384
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
380
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
385
381
|
}
|
|
386
382
|
|
|
387
383
|
a {
|
|
@@ -390,7 +386,7 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
390
386
|
}
|
|
391
387
|
|
|
392
388
|
svg {
|
|
393
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
389
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
394
390
|
}
|
|
395
391
|
|
|
396
392
|
a {
|
|
@@ -429,7 +425,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
429
425
|
return;
|
|
430
426
|
}
|
|
431
427
|
if ("error" in response) {
|
|
432
|
-
if (
|
|
428
|
+
if (isFetchError(response.error)) {
|
|
433
429
|
toggleNotification({
|
|
434
430
|
type: "danger",
|
|
435
431
|
message: formatAPIError(response.error)
|
|
@@ -445,7 +441,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
445
441
|
if (!canDeleteAction) {
|
|
446
442
|
return null;
|
|
447
443
|
}
|
|
448
|
-
return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
444
|
+
return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
449
445
|
/* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
|
|
450
446
|
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
451
447
|
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
@@ -485,7 +481,7 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
485
481
|
return /* @__PURE__ */ jsx(
|
|
486
482
|
StyledMenuItem,
|
|
487
483
|
{
|
|
488
|
-
|
|
484
|
+
tag: Link,
|
|
489
485
|
isLink: true,
|
|
490
486
|
to: {
|
|
491
487
|
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
@@ -503,13 +499,16 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
503
499
|
};
|
|
504
500
|
const EditReleaseItem = ({ releaseId }) => {
|
|
505
501
|
const { formatMessage } = useIntl();
|
|
506
|
-
return
|
|
507
|
-
/* @
|
|
508
|
-
/* @__PURE__ */ jsx(
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
502
|
+
return (
|
|
503
|
+
/* @ts-expect-error inference isn't working in DS */
|
|
504
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { tag: Link, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
505
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
506
|
+
/* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
507
|
+
id: "content-releases.content-manager-edit-view.edit-release",
|
|
508
|
+
defaultMessage: "Edit release"
|
|
509
|
+
}) })
|
|
510
|
+
] }) })
|
|
511
|
+
);
|
|
513
512
|
};
|
|
514
513
|
const Root = ({ children, hasTriggerBorder = false }) => {
|
|
515
514
|
const { formatMessage } = useIntl();
|
|
@@ -520,7 +519,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
|
|
|
520
519
|
/* @__PURE__ */ jsx(
|
|
521
520
|
Menu.Trigger,
|
|
522
521
|
{
|
|
523
|
-
|
|
522
|
+
tag: hasTriggerBorder ? StyledIconButton : IconButton,
|
|
524
523
|
paddingLeft: 2,
|
|
525
524
|
paddingRight: 2,
|
|
526
525
|
"aria-label": formatMessage({
|
|
@@ -546,11 +545,11 @@ const getBorderLeftRadiusValue = (actionType) => {
|
|
|
546
545
|
const getBorderRightRadiusValue = (actionType) => {
|
|
547
546
|
return actionType === "publish" ? 0 : 1;
|
|
548
547
|
};
|
|
549
|
-
const FieldWrapper = styled(Field)`
|
|
550
|
-
border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
551
|
-
border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
552
|
-
border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
553
|
-
border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
548
|
+
const FieldWrapper = styled(Field.Root)`
|
|
549
|
+
border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
550
|
+
border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
551
|
+
border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
552
|
+
border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
554
553
|
|
|
555
554
|
> label {
|
|
556
555
|
color: inherit;
|
|
@@ -561,14 +560,14 @@ const FieldWrapper = styled(Field)`
|
|
|
561
560
|
}
|
|
562
561
|
|
|
563
562
|
&[data-checked='true'] {
|
|
564
|
-
color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
565
|
-
background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
566
|
-
border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
563
|
+
color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
564
|
+
background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
565
|
+
border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
567
566
|
}
|
|
568
567
|
|
|
569
568
|
&[data-checked='false'] {
|
|
570
|
-
border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
|
|
571
|
-
border-right: ${({ actionType }) => actionType === "publish" && "none"};
|
|
569
|
+
border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
|
|
570
|
+
border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
|
|
572
571
|
}
|
|
573
572
|
|
|
574
573
|
&[data-checked='false'][data-disabled='false']:hover {
|
|
@@ -597,7 +596,7 @@ const ActionOption = ({
|
|
|
597
596
|
return /* @__PURE__ */ jsx(
|
|
598
597
|
FieldWrapper,
|
|
599
598
|
{
|
|
600
|
-
actionType,
|
|
599
|
+
$actionType: actionType,
|
|
601
600
|
background: "primary0",
|
|
602
601
|
borderColor: "neutral200",
|
|
603
602
|
color: selected === actionType ? "primary600" : "neutral600",
|
|
@@ -605,12 +604,11 @@ const ActionOption = ({
|
|
|
605
604
|
cursor: "pointer",
|
|
606
605
|
"data-checked": selected === actionType,
|
|
607
606
|
"data-disabled": disabled && selected !== actionType,
|
|
608
|
-
children: /* @__PURE__ */ jsxs(
|
|
607
|
+
children: /* @__PURE__ */ jsxs(Field.Label, { children: [
|
|
609
608
|
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
|
|
610
|
-
|
|
609
|
+
Field.Input,
|
|
611
610
|
{
|
|
612
611
|
type: "radio",
|
|
613
|
-
id: `${name}-${actionType}`,
|
|
614
612
|
name,
|
|
615
613
|
checked: selected === actionType,
|
|
616
614
|
onChange: handleChange,
|
|
@@ -676,7 +674,7 @@ const NoReleases = () => {
|
|
|
676
674
|
to: {
|
|
677
675
|
pathname: "/plugins/content-releases"
|
|
678
676
|
},
|
|
679
|
-
|
|
677
|
+
tag: Link,
|
|
680
678
|
variant: "secondary",
|
|
681
679
|
children: formatMessage({
|
|
682
680
|
id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
|
|
@@ -727,7 +725,7 @@ const AddActionToReleaseModal = ({
|
|
|
727
725
|
return;
|
|
728
726
|
}
|
|
729
727
|
if ("error" in response2) {
|
|
730
|
-
if (
|
|
728
|
+
if (isFetchError(response2.error)) {
|
|
731
729
|
toggleNotification({
|
|
732
730
|
type: "danger",
|
|
733
731
|
message: formatAPIError(response2.error)
|
|
@@ -754,24 +752,25 @@ const AddActionToReleaseModal = ({
|
|
|
754
752
|
children: ({ values, setFieldValue }) => {
|
|
755
753
|
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
756
754
|
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
757
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
755
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
756
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
757
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-label",
|
|
758
|
+
defaultMessage: "Select a release"
|
|
759
|
+
}) }),
|
|
760
|
+
/* @__PURE__ */ jsx(
|
|
761
|
+
SingleSelect,
|
|
762
|
+
{
|
|
763
|
+
placeholder: formatMessage({
|
|
764
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
|
|
765
|
+
defaultMessage: "Select"
|
|
766
|
+
}),
|
|
767
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
768
|
+
value: values.releaseId,
|
|
769
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
770
|
+
}
|
|
771
|
+
)
|
|
772
|
+
] }) }),
|
|
773
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
775
774
|
id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
|
|
776
775
|
defaultMessage: "What do you want to do with this entry?"
|
|
777
776
|
}) }),
|
|
@@ -814,6 +813,7 @@ const CMReleasesContainer = () => {
|
|
|
814
813
|
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
815
814
|
const { id, slug, collectionType } = useParams();
|
|
816
815
|
const isCreatingEntry = id === "create";
|
|
816
|
+
const entryId = parseInt(id, 10);
|
|
817
817
|
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
818
818
|
const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
|
|
819
819
|
const { schema } = unstable_useDocument({
|
|
@@ -825,7 +825,7 @@ const CMReleasesContainer = () => {
|
|
|
825
825
|
const canFetch = id != null && contentTypeUid != null;
|
|
826
826
|
const fetchParams = canFetch ? {
|
|
827
827
|
contentTypeUid,
|
|
828
|
-
entryId
|
|
828
|
+
entryId,
|
|
829
829
|
hasEntryAttached: true
|
|
830
830
|
} : skipToken;
|
|
831
831
|
const response = useGetReleasesForEntryQuery(fetchParams);
|
|
@@ -849,7 +849,7 @@ const CMReleasesContainer = () => {
|
|
|
849
849
|
return /* @__PURE__ */ jsxs(
|
|
850
850
|
Box,
|
|
851
851
|
{
|
|
852
|
-
|
|
852
|
+
tag: "aside",
|
|
853
853
|
"aria-label": formatMessage({
|
|
854
854
|
id: "content-releases.plugin.name",
|
|
855
855
|
defaultMessage: "Releases"
|
|
@@ -965,7 +965,7 @@ const CMReleasesContainer = () => {
|
|
|
965
965
|
{
|
|
966
966
|
handleClose: toggleModal,
|
|
967
967
|
contentTypeUid,
|
|
968
|
-
entryId
|
|
968
|
+
entryId
|
|
969
969
|
}
|
|
970
970
|
)
|
|
971
971
|
]
|
|
@@ -1047,7 +1047,7 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1047
1047
|
return true;
|
|
1048
1048
|
}
|
|
1049
1049
|
if ("error" in response2) {
|
|
1050
|
-
if (
|
|
1050
|
+
if (isFetchError(response2.error)) {
|
|
1051
1051
|
toggleNotification({
|
|
1052
1052
|
type: "warning",
|
|
1053
1053
|
message: formatAPIError(response2.error)
|
|
@@ -1089,24 +1089,25 @@ const ReleaseAction = ({ documentIds, model }) => {
|
|
|
1089
1089
|
initialValues: INITIAL_VALUES,
|
|
1090
1090
|
children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
|
|
1091
1091
|
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
1092
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1092
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
1093
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
1094
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-label",
|
|
1095
|
+
defaultMessage: "Select a release"
|
|
1096
|
+
}) }),
|
|
1097
|
+
/* @__PURE__ */ jsx(
|
|
1098
|
+
SingleSelect,
|
|
1099
|
+
{
|
|
1100
|
+
placeholder: formatMessage({
|
|
1101
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
|
|
1102
|
+
defaultMessage: "Select"
|
|
1103
|
+
}),
|
|
1104
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
1105
|
+
value: values.releaseId,
|
|
1106
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
1107
|
+
}
|
|
1108
|
+
)
|
|
1109
|
+
] }) }),
|
|
1110
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
1110
1111
|
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
|
|
1111
1112
|
defaultMessage: "What do you want to do with these entries?"
|
|
1112
1113
|
}) }),
|
|
@@ -1166,7 +1167,7 @@ const admin = {
|
|
|
1166
1167
|
id: `${pluginId}.plugin.name`,
|
|
1167
1168
|
defaultMessage: "Releases"
|
|
1168
1169
|
},
|
|
1169
|
-
Component: () => import("./App-
|
|
1170
|
+
Component: () => import("./App-CJdkbHnd.mjs").then((mod) => ({ default: mod.App })),
|
|
1170
1171
|
permissions: PERMISSIONS.main
|
|
1171
1172
|
});
|
|
1172
1173
|
app.addMiddlewares([() => releaseApi.middleware]);
|
|
@@ -1192,7 +1193,7 @@ const admin = {
|
|
|
1192
1193
|
},
|
|
1193
1194
|
permissions: [],
|
|
1194
1195
|
async Component() {
|
|
1195
|
-
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-
|
|
1196
|
+
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-_MxP6-Dt.mjs");
|
|
1196
1197
|
return { default: PurchaseContentReleases };
|
|
1197
1198
|
},
|
|
1198
1199
|
lockIcon: true
|
|
@@ -1229,11 +1230,10 @@ export {
|
|
|
1229
1230
|
useGetReleaseActionsQuery as f,
|
|
1230
1231
|
getTimezoneOffset as g,
|
|
1231
1232
|
useUpdateReleaseActionMutation as h,
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
admin as k,
|
|
1233
|
+
ReleaseActionMenu as i,
|
|
1234
|
+
admin as j,
|
|
1235
1235
|
pluginId as p,
|
|
1236
1236
|
releaseApi as r,
|
|
1237
1237
|
useGetReleasesQuery as u
|
|
1238
1238
|
};
|
|
1239
|
-
//# sourceMappingURL=index-
|
|
1239
|
+
//# sourceMappingURL=index-BvhZTh4j.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BvhZTh4j.mjs","sources":["../../admin/src/constants.ts","../../admin/src/pluginId.ts","../../admin/src/services/baseQuery.ts","../../admin/src/services/release.ts","../../admin/src/utils/time.ts","../../admin/src/components/ReleaseActionMenu.tsx","../../admin/src/components/ReleaseActionOptions.tsx","../../admin/src/components/CMReleasesContainer.tsx","../../admin/src/components/ReleaseAction.tsx","../../admin/src/utils/prefixPluginTranslations.ts","../../admin/src/index.ts"],"sourcesContent":["import type { Permission as StrapiPermission } from '@strapi/admin/strapi-admin';\n\nexport const PERMISSIONS = {\n main: [\n {\n action: 'plugin::content-releases.read',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n create: [\n {\n action: 'plugin::content-releases.create',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.update',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n delete: [\n {\n action: 'plugin::content-releases.delete',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n createAction: [\n {\n action: 'plugin::content-releases.create-action',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n deleteAction: [\n {\n action: 'plugin::content-releases.delete-action',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n publish: [\n {\n action: 'plugin::content-releases.publish',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n} satisfies Record<string, StrapiPermission[]>;\n","export const pluginId = 'content-releases';\n","import { getFetchClient, type FetchOptions, type FetchError } from '@strapi/admin/strapi-admin';\n\nexport interface QueryArguments<TSend> {\n url: string;\n method: 'PUT' | 'GET' | 'POST' | 'DELETE';\n data?: TSend;\n config?: FetchOptions;\n}\n\nconst fetchBaseQuery = async <TData = unknown, TSend = unknown>({\n url,\n method,\n data,\n config,\n}: QueryArguments<TSend>) => {\n try {\n const { get, post, del, put } = getFetchClient();\n\n if (method === 'POST') {\n const result = await post<TData, TSend>(url, data, config);\n return { data: result.data };\n }\n\n if (method === 'DELETE') {\n const result = await del<TData>(url, config);\n return { data: result.data };\n }\n\n if (method === 'PUT') {\n const result = await put<TData>(url, data, config);\n return { data: result.data };\n }\n\n /**\n * Default is GET.\n */\n const result = await get<TData>(url, config);\n\n return { data: result.data };\n } catch (error) {\n const err = error as FetchError;\n /**\n * Handle error of type FetchError\n *\n * This format mimics what we want from an FetchError which is what the\n * rest of the app works with, except this format is \"serializable\" since\n * it goes into the redux store.\n *\n * NOTE – passing the whole response will highlight this \"serializability\" issue.\n */\n return {\n error: {\n status: err.status,\n code: err.code,\n response: {\n data: err.response?.data,\n },\n },\n };\n }\n};\n\nexport { fetchBaseQuery };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport {\n CreateReleaseAction,\n CreateManyReleaseActions,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport { pluginId } from '../pluginId';\n\nimport { fetchBaseQuery } from './baseQuery';\n\nimport type {\n GetReleaseActions,\n UpdateReleaseAction,\n ReleaseActionGroupBy,\n} from '../../../shared/contracts/release-actions';\nimport type {\n CreateRelease,\n DeleteRelease,\n GetContentTypeEntryReleases,\n GetReleases,\n UpdateRelease,\n GetRelease,\n PublishRelease,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\n\nexport interface GetReleasesQueryParams {\n page?: number;\n pageSize?: number;\n filters?: {\n releasedAt?: {\n // TODO: this should be a boolean, find a way to avoid strings\n $notNull?: boolean | 'true' | 'false';\n };\n };\n}\n\nexport interface GetReleaseActionsQueryParams {\n page?: number;\n pageSize?: number;\n groupBy?: ReleaseActionGroupBy;\n}\n\ntype GetReleasesTabResponse = GetReleases.Response & {\n meta: {\n activeTab: 'pending' | 'done';\n };\n};\n\nconst releaseApi = createApi({\n reducerPath: pluginId,\n baseQuery: fetchBaseQuery,\n tagTypes: ['Release', 'ReleaseAction', 'EntriesInRelease'],\n endpoints: (build) => {\n return {\n getReleasesForEntry: build.query<\n GetContentTypeEntryReleases.Response,\n Partial<GetContentTypeEntryReleases.Request['query']>\n >({\n query(params) {\n return {\n url: '/content-releases',\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: (result) =>\n result\n ? [\n ...result.data.map(({ id }) => ({ type: 'Release' as const, id })),\n { type: 'Release', id: 'LIST' },\n ]\n : [],\n }),\n getReleases: build.query<GetReleasesTabResponse, GetReleasesQueryParams | void>({\n query(\n { page, pageSize, filters } = {\n page: 1,\n pageSize: 16,\n filters: {\n releasedAt: {\n $notNull: false,\n },\n },\n }\n ) {\n return {\n url: '/content-releases',\n method: 'GET',\n config: {\n params: {\n page: page || 1,\n pageSize: pageSize || 16,\n filters: filters || {\n releasedAt: {\n $notNull: false,\n },\n },\n },\n },\n };\n },\n transformResponse(response: GetReleasesTabResponse, meta, arg) {\n const releasedAtValue = arg?.filters?.releasedAt?.$notNull;\n const isActiveDoneTab = releasedAtValue === 'true';\n const newResponse: GetReleasesTabResponse = {\n ...response,\n meta: {\n ...response.meta,\n activeTab: isActiveDoneTab ? 'done' : 'pending',\n },\n };\n\n return newResponse;\n },\n providesTags: (result) =>\n result\n ? [\n ...result.data.map(({ id }) => ({ type: 'Release' as const, id })),\n { type: 'Release', id: 'LIST' },\n ]\n : [{ type: 'Release', id: 'LIST' }],\n }),\n getRelease: build.query<GetRelease.Response, GetRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}`,\n method: 'GET',\n };\n },\n providesTags: (result, error, arg) => [{ type: 'Release' as const, id: arg.id }],\n }),\n getReleaseActions: build.query<\n GetReleaseActions.Response,\n GetReleaseActions.Request['params'] & GetReleaseActions.Request['query']\n >({\n query({ releaseId, ...params }) {\n return {\n url: `/content-releases/${releaseId}/actions`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: [{ type: 'ReleaseAction', id: 'LIST' }],\n }),\n createRelease: build.mutation<CreateRelease.Response, CreateRelease.Request['body']>({\n query(data) {\n return {\n url: '/content-releases',\n method: 'POST',\n data,\n };\n },\n invalidatesTags: [{ type: 'Release', id: 'LIST' }],\n }),\n updateRelease: build.mutation<\n void,\n UpdateRelease.Request['params'] & UpdateRelease.Request['body']\n >({\n query({ id, ...data }) {\n return {\n url: `/content-releases/${id}`,\n method: 'PUT',\n data,\n };\n },\n invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],\n }),\n createReleaseAction: build.mutation<\n CreateReleaseAction.Response,\n CreateReleaseAction.Request\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions`,\n method: 'POST',\n data: body,\n };\n },\n invalidatesTags: [\n { type: 'Release', id: 'LIST' },\n { type: 'ReleaseAction', id: 'LIST' },\n ],\n }),\n createManyReleaseActions: build.mutation<\n CreateManyReleaseActions.Response,\n CreateManyReleaseActions.Request\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/bulk`,\n method: 'POST',\n data: body,\n };\n },\n invalidatesTags: [\n { type: 'Release', id: 'LIST' },\n { type: 'ReleaseAction', id: 'LIST' },\n { type: 'EntriesInRelease' },\n ],\n }),\n updateReleaseAction: build.mutation<\n UpdateReleaseAction.Response,\n UpdateReleaseAction.Request & { query: GetReleaseActions.Request['query'] } & {\n actionPath: [string, number];\n }\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,\n method: 'PUT',\n data: body,\n };\n },\n invalidatesTags: () => [{ type: 'ReleaseAction', id: 'LIST' }],\n async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {\n // We need to mimic the same params received by the getReleaseActions query\n const paramsWithoutActionId = {\n releaseId: params.releaseId,\n ...query,\n };\n\n const patchResult = dispatch(\n releaseApi.util.updateQueryData('getReleaseActions', paramsWithoutActionId, (draft) => {\n const [key, index] = actionPath;\n const action = draft.data[key][index];\n\n if (action) {\n action.type = body.type;\n }\n })\n );\n\n try {\n await queryFulfilled;\n } catch {\n patchResult.undo();\n }\n },\n }),\n deleteReleaseAction: build.mutation<\n DeleteReleaseAction.Response,\n DeleteReleaseAction.Request\n >({\n query({ params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,\n method: 'DELETE',\n };\n },\n invalidatesTags: (result, error, arg) => [\n { type: 'Release', id: 'LIST' },\n { type: 'Release', id: arg.params.releaseId },\n { type: 'ReleaseAction', id: 'LIST' },\n { type: 'EntriesInRelease' },\n ],\n }),\n publishRelease: build.mutation<PublishRelease.Response, PublishRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}/publish`,\n method: 'POST',\n };\n },\n invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],\n }),\n deleteRelease: build.mutation<DeleteRelease.Response, DeleteRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}`,\n method: 'DELETE',\n };\n },\n invalidatesTags: () => [{ type: 'Release', id: 'LIST' }, { type: 'EntriesInRelease' }],\n }),\n getMappedEntriesInReleases: build.query<\n MapEntriesToReleases.Response['data'],\n MapEntriesToReleases.Request['query']\n >({\n query(params) {\n return {\n url: '/content-releases/mapEntriesToReleases',\n method: 'GET',\n config: {\n params,\n },\n };\n },\n transformResponse(response: MapEntriesToReleases.Response) {\n return response.data;\n },\n providesTags: [{ type: 'EntriesInRelease' }],\n }),\n };\n },\n});\n\nconst {\n useGetReleasesQuery,\n useGetReleasesForEntryQuery,\n useGetReleaseQuery,\n useGetReleaseActionsQuery,\n useCreateReleaseMutation,\n useCreateReleaseActionMutation,\n useCreateManyReleaseActionsMutation,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseActionMutation,\n useDeleteReleaseMutation,\n useGetMappedEntriesInReleasesQuery,\n} = releaseApi;\n\nexport {\n useGetReleasesQuery,\n useGetReleasesForEntryQuery,\n useGetReleaseQuery,\n useGetReleaseActionsQuery,\n useCreateReleaseMutation,\n useCreateReleaseActionMutation,\n useCreateManyReleaseActionsMutation,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseActionMutation,\n useDeleteReleaseMutation,\n useGetMappedEntriesInReleasesQuery,\n releaseApi,\n};\n","export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch (error) {\n // When timezone is invalid we catch the error and return empty to don't break the app\n return '';\n }\n};\n","import * as React from 'react';\n\nimport {\n useAPIErrorHandler,\n useNotification,\n useAuth,\n useRBAC,\n isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton, Typography, Menu } from '@strapi/design-system';\nimport { Cross, More, Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link as NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { DeleteReleaseAction, ReleaseAction } from '../../../shared/contracts/release-actions';\nimport { Release } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useDeleteReleaseActionMutation } from '../services/release';\n\nconst StyledMenuItem = styled(Menu.Item)<{ $variant?: 'neutral' | 'danger' }>`\n &:hover {\n background: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}100`]};\n\n svg {\n fill: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}600`]};\n }\n\n a {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n }\n\n svg {\n fill: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}600`]};\n }\n\n a {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n\n span,\n a {\n width: 100%;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteReleaseActionItemProps\n * -----------------------------------------------------------------------------------------------*/\nconst StyledIconButton = styled(IconButton)`\n /* Setting this style inline with borderColor will not apply the style */\n border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};\n`;\ninterface DeleteReleaseActionItemProps {\n releaseId: DeleteReleaseAction.Request['params']['releaseId'];\n actionId: DeleteReleaseAction.Request['params']['actionId'];\n}\n\nconst DeleteReleaseActionItem = ({ releaseId, actionId }: DeleteReleaseActionItemProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [deleteReleaseAction] = useDeleteReleaseActionMutation();\n const {\n allowedActions: { canDeleteAction },\n } = useRBAC(PERMISSIONS);\n\n const handleDeleteAction = async () => {\n const response = await deleteReleaseAction({\n params: { releaseId, actionId },\n });\n\n if ('data' in response) {\n // Handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.content-manager-edit-view.remove-from-release.notification.success',\n defaultMessage: 'Entry removed from release',\n }),\n });\n\n return;\n }\n\n if ('error' in response) {\n if (isFetchError(response.error)) {\n // Handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n if (!canDeleteAction) {\n return null;\n }\n\n return (\n <StyledMenuItem $variant=\"danger\" onSelect={handleDeleteAction}>\n <Flex gap={2}>\n <Cross width=\"1.6rem\" height=\"1.6rem\" />\n <Typography textColor=\"danger600\" variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.remove-from-release',\n defaultMessage: 'Remove from release',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseActionEntryLinkItem\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleaseActionEntryLinkItemProps {\n contentTypeUid: ReleaseAction['contentType'];\n entryId: ReleaseAction['entry']['id'];\n locale: ReleaseAction['locale'];\n}\n\nconst ReleaseActionEntryLinkItem = ({\n contentTypeUid,\n entryId,\n locale,\n}: ReleaseActionEntryLinkItemProps) => {\n const { formatMessage } = useIntl();\n const userPermissions = useAuth('ReleaseActionEntryLinkItem', (state) => state.permissions);\n\n // Confirm user has permissions to access the entry for the given locale\n const canUpdateEntryForLocale = React.useMemo(() => {\n const updatePermissions = userPermissions.find(\n (permission) =>\n permission.subject === contentTypeUid &&\n permission.action === 'plugin::content-manager.explorer.update'\n );\n\n if (!updatePermissions) {\n return false;\n }\n\n return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));\n }, [contentTypeUid, locale, userPermissions]);\n\n const {\n allowedActions: { canUpdate: canUpdateContentType },\n } = useRBAC({\n updateContentType: [\n {\n action: 'plugin::content-manager.explorer.update',\n subject: contentTypeUid,\n },\n ],\n });\n\n if (!canUpdateContentType || !canUpdateEntryForLocale) {\n return null;\n }\n\n return (\n <StyledMenuItem\n /* @ts-expect-error inference isn't working in DS */\n tag={NavLink}\n isLink\n to={{\n pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,\n search: locale && `?plugins[i18n][locale]=${locale}`,\n }}\n >\n <Flex gap={2}>\n <Pencil width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.edit-entry',\n defaultMessage: 'Edit entry',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EditReleaseItem\n * -----------------------------------------------------------------------------------------------*/\ninterface EditReleaseItemProps {\n releaseId: Release['id'];\n}\n\nconst EditReleaseItem = ({ releaseId }: EditReleaseItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n /* @ts-expect-error inference isn't working in DS */\n <StyledMenuItem tag={NavLink} isLink to={`/plugins/content-releases/${releaseId}`}>\n <Flex gap={2}>\n <Pencil width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.edit-release',\n defaultMessage: 'Edit release',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RootProps {\n children: React.ReactNode;\n hasTriggerBorder?: boolean;\n}\n\nconst Root = ({ children, hasTriggerBorder = false }: RootProps) => {\n const { formatMessage } = useIntl();\n\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n return (\n // A user can access the dropdown if they have permissions to delete a release-action OR update a release\n allowedActions.canDeleteAction || allowedActions.canUpdate ? (\n <Menu.Root>\n {/*\n TODO Fix in the DS\n - tag={IconButton} has TS error: Property 'icon' does not exist on type 'IntrinsicAttributes & TriggerProps & RefAttributes<HTMLButtonElement>'\n - The Icon doesn't actually show unless you hack it with some padding...and it's still a little strange\n */}\n <Menu.Trigger\n // @ts-expect-error See above\n tag={hasTriggerBorder ? StyledIconButton : IconButton}\n paddingLeft={2}\n paddingRight={2}\n aria-label={formatMessage({\n id: 'content-releases.content-manager-edit-view.release-action-menu',\n defaultMessage: 'Release action options',\n })}\n icon={<More />}\n />\n {/*\n TODO: Using Menu instead of SimpleMenu mainly because there is no positioning provided from the DS,\n Refactor this once fixed in the DS\n */}\n <Menu.Content top={1} popoverPlacement=\"bottom-end\">\n {children}\n </Menu.Content>\n </Menu.Root>\n ) : null\n );\n};\n\nexport const ReleaseActionMenu = {\n Root,\n EditReleaseItem,\n DeleteReleaseActionItem,\n ReleaseActionEntryLinkItem,\n};\n","import * as React from 'react';\n\nimport { VisuallyHidden, Field, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface FieldWrapperProps extends Field.Props {\n actionType: 'publish' | 'unpublish';\n}\n\nconst getBorderLeftRadiusValue = (actionType: FieldWrapperProps['actionType']) => {\n return actionType === 'publish' ? 1 : 0;\n};\n\nconst getBorderRightRadiusValue = (actionType: FieldWrapperProps['actionType']) => {\n return actionType === 'publish' ? 0 : 1;\n};\n\nconst FieldWrapper = styled(Field.Root)<{\n $actionType: 'publish' | 'unpublish';\n}>`\n border-top-left-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderLeftRadiusValue($actionType)]};\n border-bottom-left-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderLeftRadiusValue($actionType)]};\n border-top-right-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderRightRadiusValue($actionType)]};\n border-bottom-right-radius: ${({ $actionType, theme }) =>\n theme.spaces[getBorderRightRadiusValue($actionType)]};\n\n > label {\n color: inherit;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n text-align: center;\n vertical-align: middle;\n text-transform: capitalize;\n }\n\n &[data-checked='true'] {\n color: ${({ theme, $actionType }) =>\n $actionType === 'publish' ? theme.colors.primary700 : theme.colors.danger600};\n background-color: ${({ theme, $actionType }) =>\n $actionType === 'publish' ? theme.colors.primary100 : theme.colors.danger100};\n border-color: ${({ theme, $actionType }) =>\n $actionType === 'publish' ? theme.colors.primary700 : theme.colors.danger600};\n }\n\n &[data-checked='false'] {\n border-left: ${({ $actionType }) => $actionType === 'unpublish' && 'none'};\n border-right: ${({ $actionType }) => $actionType === 'publish' && 'none'};\n }\n\n &[data-checked='false'][data-disabled='false']:hover {\n color: ${({ theme }) => theme.colors.neutral700};\n background-color: ${({ theme }) => theme.colors.neutral100};\n border-color: ${({ theme }) => theme.colors.neutral200};\n\n & > label {\n cursor: pointer;\n }\n }\n\n &[data-disabled='true'] {\n color: ${({ theme }) => theme.colors.neutral600};\n background-color: ${({ theme }) => theme.colors.neutral150};\n border-color: ${({ theme }) => theme.colors.neutral300};\n }\n`;\n\ninterface ActionOptionProps {\n selected: 'publish' | 'unpublish';\n handleChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n name: string;\n disabled?: boolean;\n}\n\ninterface OptionProps extends ActionOptionProps {\n actionType: 'publish' | 'unpublish';\n}\n\nconst ActionOption = ({\n selected,\n actionType,\n handleChange,\n name,\n disabled = false,\n}: OptionProps) => {\n return (\n <FieldWrapper\n $actionType={actionType}\n background=\"primary0\"\n borderColor=\"neutral200\"\n color={selected === actionType ? 'primary600' : 'neutral600'}\n position=\"relative\"\n cursor=\"pointer\"\n data-checked={selected === actionType}\n data-disabled={disabled && selected !== actionType}\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n name={name}\n checked={selected === actionType}\n onChange={handleChange}\n value={actionType}\n disabled={disabled}\n />\n </VisuallyHidden>\n {actionType}\n </Field.Label>\n </FieldWrapper>\n );\n};\n\nexport const ReleaseActionOptions = ({\n selected,\n handleChange,\n name,\n disabled = false,\n}: ActionOptionProps) => {\n return (\n <Flex>\n <ActionOption\n actionType=\"publish\"\n selected={selected}\n handleChange={handleChange}\n name={name}\n disabled={disabled}\n />\n <ActionOption\n actionType=\"unpublish\"\n selected={selected}\n handleChange={handleChange}\n name={name}\n disabled={disabled}\n />\n </Flex>\n );\n};\n","import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n ModalBody,\n ModalHeader,\n ModalLayout,\n SingleSelect,\n SingleSelectOption,\n Typography,\n ModalFooter,\n EmptyStateLayout,\n LinkButton,\n Field,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink, useParams } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { CreateReleaseAction } from '../../../shared/contracts/release-actions';\nimport { GetContentTypeEntryReleases } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useCreateReleaseActionMutation, useGetReleasesForEntryQuery } from '../services/release';\nimport { getTimezoneOffset } from '../utils/time';\n\nimport { ReleaseActionMenu } from './ReleaseActionMenu';\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * AddActionToReleaseModal\n * -----------------------------------------------------------------------------------------------*/\n\nexport const RELEASE_ACTION_FORM_SCHEMA = yup.object().shape({\n type: yup.string().oneOf(['publish', 'unpublish']).required(),\n releaseId: yup.string().required(),\n});\n\nexport interface FormValues {\n type: CreateReleaseAction.Request['body']['type'];\n releaseId: CreateReleaseAction.Request['params']['releaseId'];\n}\n\nexport const INITIAL_VALUES = {\n type: 'publish',\n releaseId: '',\n} satisfies FormValues;\n\ninterface AddActionToReleaseModalProps {\n handleClose: () => void;\n contentTypeUid: GetContentTypeEntryReleases.Request['query']['contentTypeUid'];\n entryId: GetContentTypeEntryReleases.Request['query']['entryId'];\n}\n\nexport const NoReleases = () => {\n const { formatMessage } = useIntl();\n return (\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n content={formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.no-releases-message',\n defaultMessage:\n 'No available releases. Open the list of releases and create a new one from there.',\n })}\n action={\n <LinkButton\n to={{\n pathname: '/plugins/content-releases',\n }}\n tag={ReactRouterLink}\n variant=\"secondary\"\n >\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.redirect-button',\n defaultMessage: 'Open the list of releases',\n })}\n </LinkButton>\n }\n />\n );\n};\n\nconst AddActionToReleaseModal = ({\n handleClose,\n contentTypeUid,\n entryId,\n}: AddActionToReleaseModalProps) => {\n const releaseHeaderId = React.useId();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const locale = query.plugins?.i18n?.locale;\n\n // Get all 'pending' releases that do not have the entry attached\n const response = useGetReleasesForEntryQuery({\n contentTypeUid,\n entryId,\n hasEntryAttached: false,\n });\n\n const releases = response.data?.data;\n const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();\n\n const handleSubmit = async (values: FormValues) => {\n const releaseActionEntry = {\n contentType: contentTypeUid,\n id: entryId,\n locale,\n };\n const response = await createReleaseAction({\n body: { type: values.type, entry: releaseActionEntry },\n params: { releaseId: values.releaseId },\n });\n\n if ('data' in response) {\n // Handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.notification.success',\n defaultMessage: 'Entry added to release',\n }),\n });\n\n handleClose();\n return;\n }\n\n if ('error' in response) {\n if (isFetchError(response.error)) {\n // Handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n return (\n <ModalLayout onClose={handleClose} labelledBy={releaseHeaderId}>\n <ModalHeader>\n <Typography id={releaseHeaderId} fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release',\n defaultMessage: 'Add to release',\n })}\n </Typography>\n </ModalHeader>\n <Formik\n onSubmit={handleSubmit}\n validationSchema={RELEASE_ACTION_FORM_SCHEMA}\n initialValues={INITIAL_VALUES}\n >\n {({ values, setFieldValue }) => {\n return (\n <Form>\n {releases?.length === 0 ? (\n <NoReleases />\n ) : (\n <ModalBody>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingBottom={6}>\n <Field.Root required>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.select-label',\n defaultMessage: 'Select a release',\n })}\n </Field.Label>\n <SingleSelect\n placeholder={formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.select-placeholder',\n defaultMessage: 'Select',\n })}\n onChange={(value) => setFieldValue('releaseId', value)}\n value={values.releaseId}\n >\n {releases?.map((release) => (\n <SingleSelectOption key={release.id} value={release.id}>\n {release.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Box>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.action-type-label',\n defaultMessage: 'What do you want to do with this entry?',\n })}\n </Field.Label>\n <ReleaseActionOptions\n selected={values.type}\n handleChange={(e) => setFieldValue('type', e.target.value)}\n name=\"type\"\n />\n </Flex>\n </ModalBody>\n )}\n <ModalFooter\n startActions={\n <Button onClick={handleClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.cancel-button',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n /**\n * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true\n * for yup.string().required(), even when the value is falsy (including empty string)\n */\n <Button type=\"submit\" disabled={!values.releaseId} loading={isLoading}>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.continue-button',\n defaultMessage: 'Continue',\n })}\n </Button>\n }\n />\n </Form>\n );\n }}\n </Formik>\n </ModalLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CMReleasesContainer\n * -----------------------------------------------------------------------------------------------*/\n\nexport const CMReleasesContainer = () => {\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const { formatMessage, formatDate, formatTime } = useIntl();\n const { id, slug, collectionType } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const isCreatingEntry = id === 'create';\n const entryId = parseInt(id!, 10);\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;\n\n const { schema } = unstable_useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const hasDraftAndPublish = schema?.options?.draftAndPublish;\n\n const contentTypeUid = slug as UID.ContentType;\n const canFetch = id != null && contentTypeUid != null;\n const fetchParams = canFetch\n ? {\n contentTypeUid: contentTypeUid,\n entryId,\n hasEntryAttached: true,\n }\n : skipToken;\n // Get all 'pending' releases that have the entry attached\n const response = useGetReleasesForEntryQuery(fetchParams);\n const releases = response.data?.data;\n\n /**\n * If we don't have a contentTypeUid or entryId then the data was never fetched\n */\n if (!canFetch) {\n return null;\n }\n\n /**\n * - Impossible to add entry to release before it exists\n * - Content types without draft and publish cannot add entries to release\n */\n if (isCreatingEntry || !hasDraftAndPublish) {\n return null;\n }\n\n const toggleModal = () => setIsModalOpen((prev) => !prev);\n\n const getReleaseColorVariant = (\n actionType: 'publish' | 'unpublish',\n shade: '100' | '200' | '600'\n ) => {\n if (actionType === 'unpublish') {\n return `secondary${shade}`;\n }\n\n return `success${shade}`;\n };\n\n if (!canMain) {\n return null;\n }\n\n return (\n <Box\n tag=\"aside\"\n aria-label={formatMessage({\n id: 'content-releases.plugin.name',\n defaultMessage: 'Releases',\n })}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n hasRadius\n padding={4}\n shadow=\"tableShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={3}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" textTransform=\"uppercase\">\n {formatMessage({\n id: 'content-releases.plugin.name',\n defaultMessage: 'Releases',\n })}\n </Typography>\n {releases?.map((release) => {\n return (\n <Flex\n key={release.id}\n direction=\"column\"\n alignItems=\"start\"\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={getReleaseColorVariant(release.actions[0].type, '200')}\n overflow=\"hidden\"\n hasRadius\n >\n <Box\n paddingTop={3}\n paddingBottom={3}\n paddingLeft={4}\n paddingRight={4}\n background={getReleaseColorVariant(release.actions[0].type, '100')}\n width=\"100%\"\n >\n <Typography\n fontSize={1}\n variant=\"pi\"\n textColor={getReleaseColorVariant(release.actions[0].type, '600')}\n >\n {formatMessage(\n {\n id: 'content-releases.content-manager-edit-view.list-releases.title',\n defaultMessage:\n '{isPublish, select, true {Will be published in} other {Will be unpublished in}}',\n },\n { isPublish: release.actions[0].type === 'publish' }\n )}\n </Typography>\n </Box>\n <Flex padding={4} direction=\"column\" gap={2} width=\"100%\" alignItems=\"flex-start\">\n <Flex padding={4} direction=\"column\" gap={2} width=\"100%\" alignItems=\"flex-start\">\n <Typography fontSize={2} fontWeight=\"bold\" variant=\"omega\" textColor=\"neutral700\">\n {release.name}\n </Typography>\n {release.scheduledAt && release.timezone && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-releases.content-manager-edit-view.scheduled.date',\n defaultMessage: '{date} at {time} ({offset})',\n },\n {\n date: formatDate(new Date(release.scheduledAt), {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n timeZone: release.timezone,\n }),\n time: formatTime(new Date(release.scheduledAt), {\n hourCycle: 'h23',\n timeZone: release.timezone,\n }),\n offset: getTimezoneOffset(\n release.timezone,\n new Date(release.scheduledAt)\n ),\n }\n )}\n </Typography>\n )}\n {canDeleteAction ? (\n <ReleaseActionMenu.Root hasTriggerBorder>\n <ReleaseActionMenu.EditReleaseItem releaseId={release.id} />\n <ReleaseActionMenu.DeleteReleaseActionItem\n releaseId={release.id}\n actionId={release.actions[0].id}\n />\n </ReleaseActionMenu.Root>\n ) : null}\n </Flex>\n </Flex>\n </Flex>\n );\n })}\n {canCreateAction ? (\n <Button\n justifyContent=\"center\"\n paddingLeft={4}\n paddingRight={4}\n color=\"neutral700\"\n variant=\"tertiary\"\n startIcon={<Plus />}\n onClick={toggleModal}\n >\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release',\n defaultMessage: 'Add to release',\n })}\n </Button>\n ) : null}\n </Flex>\n {isModalOpen && (\n <AddActionToReleaseModal\n handleClose={toggleModal}\n contentTypeUid={contentTypeUid}\n entryId={entryId}\n />\n )}\n </Box>\n );\n};\n","import * as React from 'react';\n\nimport {\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n SingleSelect,\n SingleSelectOption,\n ModalBody,\n ModalFooter,\n Field,\n} from '@strapi/design-system';\nimport { UID } from '@strapi/types';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { CreateManyReleaseActions } from '../../../shared/contracts/release-actions';\nimport { PERMISSIONS as releasePermissions } from '../constants';\nimport { useCreateManyReleaseActionsMutation, useGetReleasesQuery } from '../services/release';\n\nimport { type FormValues, INITIAL_VALUES, RELEASE_ACTION_FORM_SCHEMA } from './CMReleasesContainer';\nimport { NoReleases } from './CMReleasesContainer';\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\nimport type { BulkActionComponent } from '@strapi/content-manager/strapi-admin';\n\nconst getContentPermissions = (subject: string) => {\n const permissions = {\n publish: [\n {\n action: 'plugin::content-manager.explorer.publish',\n subject,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n };\n\n return permissions;\n};\n\nconst ReleaseAction: BulkActionComponent = ({ documentIds, model }) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n const contentPermissions = getContentPermissions(model);\n const {\n allowedActions: { canPublish },\n } = useRBAC(contentPermissions);\n const {\n allowedActions: { canCreate },\n } = useRBAC(releasePermissions);\n\n // Get all the releases not published\n const response = useGetReleasesQuery();\n const releases = response.data?.data;\n const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();\n\n const handleSubmit = async (values: FormValues) => {\n const locale = query.plugins?.i18n?.locale;\n // @ts-expect-error – this may not work because id needs to be an entity number not a document id (string)\n const releaseActionEntries: CreateManyReleaseActions.Request['body'] = documentIds.map(\n (id) => ({\n type: values.type,\n entry: {\n contentType: model as UID.ContentType,\n id,\n locale,\n },\n })\n );\n\n const response = await createManyReleaseActions({\n body: releaseActionEntries,\n params: { releaseId: values.releaseId },\n });\n\n if ('data' in response) {\n // Handle success\n\n const notificationMessage = formatMessage(\n {\n id: 'content-releases.content-manager-list-view.add-to-release.notification.success.message',\n defaultMessage:\n '{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release.',\n },\n {\n entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,\n totalEntries: response.data.meta.totalEntries,\n }\n );\n\n const notification = {\n type: 'success' as const,\n title: formatMessage(\n {\n id: 'content-releases.content-manager-list-view.add-to-release.notification.success.title',\n defaultMessage: 'Successfully added to release.',\n },\n {\n entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,\n totalEntries: response.data.meta.totalEntries,\n }\n ),\n message: response.data.meta.entriesAlreadyInRelease ? notificationMessage : '',\n };\n\n toggleNotification(notification);\n\n return true;\n }\n\n if ('error' in response) {\n if (isFetchError(response.error)) {\n // Handle fetch error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n if (!canCreate || !canPublish) return null;\n\n return {\n actionType: 'release',\n variant: 'tertiary',\n label: formatMessage({\n id: 'content-manager-list-view.add-to-release',\n defaultMessage: 'Add to Release',\n }),\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager-list-view.add-to-release',\n defaultMessage: 'Add to Release',\n }),\n content: ({ onClose }) => {\n return (\n <Formik\n onSubmit={async (values) => {\n const data = await handleSubmit(values);\n if (data) {\n return onClose();\n }\n }}\n validationSchema={RELEASE_ACTION_FORM_SCHEMA}\n initialValues={INITIAL_VALUES}\n >\n {({ values, setFieldValue }) => (\n <Form>\n {releases?.length === 0 ? (\n <NoReleases />\n ) : (\n <ModalBody>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingBottom={6}>\n <Field.Root required>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.select-label',\n defaultMessage: 'Select a release',\n })}\n </Field.Label>\n <SingleSelect\n placeholder={formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.select-placeholder',\n defaultMessage: 'Select',\n })}\n onChange={(value) => setFieldValue('releaseId', value)}\n value={values.releaseId}\n >\n {releases?.map((release) => (\n <SingleSelectOption key={release.id} value={release.id}>\n {release.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Box>\n <Field.Label>\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.action-type-label',\n defaultMessage: 'What do you want to do with these entries?',\n })}\n </Field.Label>\n <ReleaseActionOptions\n selected={values.type}\n handleChange={(e) => setFieldValue('type', e.target.value)}\n name=\"type\"\n />\n </Flex>\n </ModalBody>\n )}\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.cancel-button',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n /**\n * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true\n * for yup.string().required(), even when the value is falsy (including empty string)\n */\n <Button type=\"submit\" disabled={!values.releaseId} loading={isLoading}>\n {formatMessage({\n id: 'content-releases.content-manager-list-view.add-to-release.continue-button',\n defaultMessage: 'Continue',\n })}\n </Button>\n }\n />\n </Form>\n )}\n </Formik>\n );\n },\n },\n };\n};\n\nexport { ReleaseAction };\n","type TradOptions = Record<string, string>;\n\nconst prefixPluginTranslations = (trad: TradOptions, pluginId: string): TradOptions => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n return Object.keys(trad).reduce((acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n return acc;\n }, {} as TradOptions);\n};\n\nexport { prefixPluginTranslations };\n","import { PaperPlane } from '@strapi/icons';\n\nimport { CMReleasesContainer } from './components/CMReleasesContainer';\nimport { ReleaseAction } from './components/ReleaseAction';\n// import { addColumnToTableHook } from './components/ReleaseListCell';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { releaseApi } from './services/release';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { BulkActionComponent } from '@strapi/content-manager/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\n// eslint-disable-next-line import/no-default-export\nconst admin: Plugin.Config.AdminInput = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(app: StrapiApp) {\n /**\n * Hook that adds the locale column in the Release Details table\n * @constant\n * @type {string}\n */\n app.createHook('ContentReleases/pages/ReleaseDetails/add-locale-in-releases');\n if (window.strapi.features.isEnabled('cms-content-releases')) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: PaperPlane,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Releases',\n },\n Component: () => import('./pages/App').then((mod) => ({ default: mod.App })),\n permissions: PERMISSIONS.main,\n });\n\n /**\n * For some reason every middleware you pass has to a function\n * that returns the actual middleware. It's annoying but no one knows why....\n */\n // @ts-expect-error – this API needs to be typed better.\n app.addMiddlewares([() => releaseApi.middleware]);\n\n app.addReducers({\n [releaseApi.reducerPath]: releaseApi.reducer,\n });\n\n // Insert the Releases container in the 'right-links' zone of the Content Manager's edit view\n app.getPlugin('content-manager').injectComponent('editView', 'right-links', {\n name: `${pluginId}-link`,\n Component: CMReleasesContainer,\n });\n\n // @ts-expect-error – plugins are not typed on the StrapiApp, fix this.\n app.plugins['content-manager'].apis.addBulkAction((actions: BulkActionComponent[]) => {\n // We want to add this action to just before the delete action all the time\n const deleteActionIndex = actions.findIndex((action) => action.name === 'DeleteAction');\n\n actions.splice(deleteActionIndex, 0, ReleaseAction);\n return actions;\n });\n // Hook that adds a column into the CM's LV table\n // app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addColumnToTableHook);\n } else if (\n !window.strapi.features.isEnabled('cms-content-releases') &&\n window.strapi?.flags?.promoteEE\n ) {\n app.addMenuLink({\n to: `/plugins/purchase-content-releases`,\n icon: PaperPlane,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Releases',\n },\n permissions: [],\n async Component() {\n const { PurchaseContentReleases } = await import('./pages/PurchaseContentReleases');\n return { default: PurchaseContentReleases };\n },\n lockIcon: true,\n });\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, 'content-releases'),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["result","NavLink","ReactRouterLink","response","releasePermissions","pluginId"],"mappings":"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"}
|
package/dist/admin/index.js
CHANGED
package/dist/admin/index.mjs
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type FetchOptions } from '@strapi/admin/strapi-admin';
|
|
2
|
+
export interface QueryArguments<TSend> {
|
|
3
|
+
url: string;
|
|
4
|
+
method: 'PUT' | 'GET' | 'POST' | 'DELETE';
|
|
5
|
+
data?: TSend;
|
|
6
|
+
config?: FetchOptions;
|
|
7
|
+
}
|
|
8
|
+
declare const fetchBaseQuery: <TData = unknown, TSend = unknown>({ url, method, data, config, }: QueryArguments<TSend>) => Promise<{
|
|
9
|
+
data: TData;
|
|
10
|
+
error?: undefined;
|
|
11
|
+
} | {
|
|
12
|
+
error: {
|
|
13
|
+
status: number | undefined;
|
|
14
|
+
code: number | undefined;
|
|
15
|
+
response: {
|
|
16
|
+
data: {
|
|
17
|
+
data?: any;
|
|
18
|
+
error: import("@strapi/admin/strapi-admin").ApiError & {
|
|
19
|
+
status?: number | undefined;
|
|
20
|
+
};
|
|
21
|
+
} | undefined;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
data?: undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export { fetchBaseQuery };
|