@strapi/content-releases 0.0.0-next.fc231041206e6f3999b094160cfa05db2892ad54 → 0.0.0-next.fd9757603c653ca239c45d6e28ab536d2dae0b39
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/LICENSE +17 -1
- package/dist/_chunks/{App-l62gIUTX.js → App-dLXY5ei3.js} +48 -31
- package/dist/_chunks/App-dLXY5ei3.js.map +1 -0
- package/dist/_chunks/{App-HVXzE3i3.mjs → App-jrh58sXY.mjs} +51 -34
- package/dist/_chunks/App-jrh58sXY.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +2 -2
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-bpIYXOfu.js} +2 -2
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
- package/dist/_chunks/{en-faJDuv3q.js → en-HrREghh3.js} +11 -2
- package/dist/_chunks/en-HrREghh3.js.map +1 -0
- package/dist/_chunks/{en-RdapH-9X.mjs → en-ltT1TlKQ.mjs} +11 -2
- package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
- package/dist/_chunks/{index-ML_b3php.js → index-CVO0Rqdm.js} +315 -13
- package/dist/_chunks/index-CVO0Rqdm.js.map +1 -0
- package/dist/_chunks/{index-Ys87ROOe.mjs → index-PiOGBETy.mjs} +320 -18
- package/dist/_chunks/index-PiOGBETy.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/server/index.js +79 -10
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +79 -10
- package/dist/server/index.mjs.map +1 -1
- package/package.json +15 -14
- package/dist/_chunks/App-HVXzE3i3.mjs.map +0 -1
- package/dist/_chunks/App-l62gIUTX.js.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
- package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
- package/dist/_chunks/en-faJDuv3q.js.map +0 -1
- package/dist/_chunks/index-ML_b3php.js.map +0 -1
- package/dist/_chunks/index-Ys87ROOe.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, prefixPluginTranslations } from "@strapi/helper-plugin";
|
|
1
|
+
import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, useRBAC, SortIcon, prefixPluginTranslations } from "@strapi/helper-plugin";
|
|
2
2
|
import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { skipToken } from "@reduxjs/toolkit/query";
|
|
6
|
-
import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
|
|
6
|
+
import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button as Button$1, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter, Popover } from "@strapi/design-system";
|
|
7
7
|
import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
|
|
8
8
|
import { isAxiosError as isAxiosError$1 } from "axios";
|
|
9
9
|
import { Formik, Form } from "formik";
|
|
@@ -136,7 +136,7 @@ const isAxiosError = (err) => {
|
|
|
136
136
|
const releaseApi = createApi({
|
|
137
137
|
reducerPath: pluginId,
|
|
138
138
|
baseQuery: axiosBaseQuery,
|
|
139
|
-
tagTypes: ["Release", "ReleaseAction"],
|
|
139
|
+
tagTypes: ["Release", "ReleaseAction", "EntriesInRelease"],
|
|
140
140
|
endpoints: (build) => {
|
|
141
141
|
return {
|
|
142
142
|
getReleasesForEntry: build.query({
|
|
@@ -251,6 +251,20 @@ const releaseApi = createApi({
|
|
|
251
251
|
{ type: "ReleaseAction", id: "LIST" }
|
|
252
252
|
]
|
|
253
253
|
}),
|
|
254
|
+
createManyReleaseActions: build.mutation({
|
|
255
|
+
query({ body, params }) {
|
|
256
|
+
return {
|
|
257
|
+
url: `/content-releases/${params.releaseId}/actions/bulk`,
|
|
258
|
+
method: "POST",
|
|
259
|
+
data: body
|
|
260
|
+
};
|
|
261
|
+
},
|
|
262
|
+
invalidatesTags: [
|
|
263
|
+
{ type: "Release", id: "LIST" },
|
|
264
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
265
|
+
{ type: "EntriesInRelease" }
|
|
266
|
+
]
|
|
267
|
+
}),
|
|
254
268
|
updateReleaseAction: build.mutation({
|
|
255
269
|
query({ body, params }) {
|
|
256
270
|
return {
|
|
@@ -291,7 +305,8 @@ const releaseApi = createApi({
|
|
|
291
305
|
invalidatesTags: (result, error, arg) => [
|
|
292
306
|
{ type: "Release", id: "LIST" },
|
|
293
307
|
{ type: "Release", id: arg.params.releaseId },
|
|
294
|
-
{ type: "ReleaseAction", id: "LIST" }
|
|
308
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
309
|
+
{ type: "EntriesInRelease" }
|
|
295
310
|
]
|
|
296
311
|
}),
|
|
297
312
|
publishRelease: build.mutation({
|
|
@@ -310,7 +325,22 @@ const releaseApi = createApi({
|
|
|
310
325
|
method: "DELETE"
|
|
311
326
|
};
|
|
312
327
|
},
|
|
313
|
-
invalidatesTags: () => [{ type: "Release", id: "LIST" }]
|
|
328
|
+
invalidatesTags: () => [{ type: "Release", id: "LIST" }, { type: "EntriesInRelease" }]
|
|
329
|
+
}),
|
|
330
|
+
getMappedEntriesInReleases: build.query({
|
|
331
|
+
query(params) {
|
|
332
|
+
return {
|
|
333
|
+
url: "/content-releases/mapEntriesToReleases",
|
|
334
|
+
method: "GET",
|
|
335
|
+
config: {
|
|
336
|
+
params
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
},
|
|
340
|
+
transformResponse(response) {
|
|
341
|
+
return response.data;
|
|
342
|
+
},
|
|
343
|
+
providesTags: [{ type: "EntriesInRelease" }]
|
|
314
344
|
})
|
|
315
345
|
};
|
|
316
346
|
}
|
|
@@ -322,11 +352,13 @@ const {
|
|
|
322
352
|
useGetReleaseActionsQuery,
|
|
323
353
|
useCreateReleaseMutation,
|
|
324
354
|
useCreateReleaseActionMutation,
|
|
355
|
+
useCreateManyReleaseActionsMutation,
|
|
325
356
|
useUpdateReleaseMutation,
|
|
326
357
|
useUpdateReleaseActionMutation,
|
|
327
358
|
usePublishReleaseMutation,
|
|
328
359
|
useDeleteReleaseActionMutation,
|
|
329
|
-
useDeleteReleaseMutation
|
|
360
|
+
useDeleteReleaseMutation,
|
|
361
|
+
useGetMappedEntriesInReleasesQuery
|
|
330
362
|
} = releaseApi;
|
|
331
363
|
const getTimezoneOffset = (timezone, date) => {
|
|
332
364
|
try {
|
|
@@ -752,7 +784,7 @@ const AddActionToReleaseModal = ({
|
|
|
752
784
|
/* @__PURE__ */ jsx(
|
|
753
785
|
ModalFooter,
|
|
754
786
|
{
|
|
755
|
-
startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
787
|
+
startActions: /* @__PURE__ */ jsx(Button$1, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
756
788
|
id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
|
|
757
789
|
defaultMessage: "Cancel"
|
|
758
790
|
}) }),
|
|
@@ -761,7 +793,7 @@ const AddActionToReleaseModal = ({
|
|
|
761
793
|
* TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
|
|
762
794
|
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
763
795
|
*/
|
|
764
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
796
|
+
/* @__PURE__ */ jsx(Button$1, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
765
797
|
id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
|
|
766
798
|
defaultMessage: "Continue"
|
|
767
799
|
}) })
|
|
@@ -832,7 +864,7 @@ const CMReleasesContainer = () => {
|
|
|
832
864
|
alignItems: "start",
|
|
833
865
|
borderWidth: "1px",
|
|
834
866
|
borderStyle: "solid",
|
|
835
|
-
borderColor: getReleaseColorVariant(release.
|
|
867
|
+
borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
|
|
836
868
|
overflow: "hidden",
|
|
837
869
|
hasRadius: true,
|
|
838
870
|
children: [
|
|
@@ -843,20 +875,20 @@ const CMReleasesContainer = () => {
|
|
|
843
875
|
paddingBottom: 3,
|
|
844
876
|
paddingLeft: 4,
|
|
845
877
|
paddingRight: 4,
|
|
846
|
-
background: getReleaseColorVariant(release.
|
|
878
|
+
background: getReleaseColorVariant(release.actions[0].type, "100"),
|
|
847
879
|
width: "100%",
|
|
848
880
|
children: /* @__PURE__ */ jsx(
|
|
849
881
|
Typography,
|
|
850
882
|
{
|
|
851
883
|
fontSize: 1,
|
|
852
884
|
variant: "pi",
|
|
853
|
-
textColor: getReleaseColorVariant(release.
|
|
885
|
+
textColor: getReleaseColorVariant(release.actions[0].type, "600"),
|
|
854
886
|
children: formatMessage(
|
|
855
887
|
{
|
|
856
888
|
id: "content-releases.content-manager-edit-view.list-releases.title",
|
|
857
889
|
defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
|
|
858
890
|
},
|
|
859
|
-
{ isPublish: release.
|
|
891
|
+
{ isPublish: release.actions[0].type === "publish" }
|
|
860
892
|
)
|
|
861
893
|
}
|
|
862
894
|
)
|
|
@@ -892,7 +924,7 @@ const CMReleasesContainer = () => {
|
|
|
892
924
|
ReleaseActionMenu.DeleteReleaseActionItem,
|
|
893
925
|
{
|
|
894
926
|
releaseId: release.id,
|
|
895
|
-
actionId: release.
|
|
927
|
+
actionId: release.actions[0].id
|
|
896
928
|
}
|
|
897
929
|
)
|
|
898
930
|
] }) })
|
|
@@ -903,7 +935,7 @@ const CMReleasesContainer = () => {
|
|
|
903
935
|
);
|
|
904
936
|
}),
|
|
905
937
|
/* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
|
|
906
|
-
Button,
|
|
938
|
+
Button$1,
|
|
907
939
|
{
|
|
908
940
|
justifyContent: "center",
|
|
909
941
|
paddingLeft: 4,
|
|
@@ -931,9 +963,272 @@ const CMReleasesContainer = () => {
|
|
|
931
963
|
}
|
|
932
964
|
) });
|
|
933
965
|
};
|
|
966
|
+
const getContentPermissions = (subject) => {
|
|
967
|
+
const permissions = {
|
|
968
|
+
publish: [
|
|
969
|
+
{
|
|
970
|
+
action: "plugin::content-manager.explorer.publish",
|
|
971
|
+
subject,
|
|
972
|
+
id: "",
|
|
973
|
+
actionParameters: {},
|
|
974
|
+
properties: {},
|
|
975
|
+
conditions: []
|
|
976
|
+
}
|
|
977
|
+
]
|
|
978
|
+
};
|
|
979
|
+
return permissions;
|
|
980
|
+
};
|
|
981
|
+
const ReleaseAction = ({ ids, model }) => {
|
|
982
|
+
const { formatMessage } = useIntl();
|
|
983
|
+
const toggleNotification = useNotification();
|
|
984
|
+
const { formatAPIError } = useAPIErrorHandler();
|
|
985
|
+
const { modifiedData } = useCMEditViewDataManager();
|
|
986
|
+
const contentPermissions = getContentPermissions(model);
|
|
987
|
+
const {
|
|
988
|
+
allowedActions: { canPublish }
|
|
989
|
+
} = useRBAC(contentPermissions);
|
|
990
|
+
const {
|
|
991
|
+
allowedActions: { canCreate }
|
|
992
|
+
} = useRBAC(PERMISSIONS);
|
|
993
|
+
const response = useGetReleasesQuery();
|
|
994
|
+
const releases = response.data?.data;
|
|
995
|
+
const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
|
|
996
|
+
const handleSubmit = async (values) => {
|
|
997
|
+
const locale = modifiedData.locale;
|
|
998
|
+
const releaseActionEntries = ids.map((id) => ({
|
|
999
|
+
type: values.type,
|
|
1000
|
+
entry: {
|
|
1001
|
+
contentType: model,
|
|
1002
|
+
id,
|
|
1003
|
+
locale
|
|
1004
|
+
}
|
|
1005
|
+
}));
|
|
1006
|
+
const response2 = await createManyReleaseActions({
|
|
1007
|
+
body: releaseActionEntries,
|
|
1008
|
+
params: { releaseId: values.releaseId }
|
|
1009
|
+
});
|
|
1010
|
+
if ("data" in response2) {
|
|
1011
|
+
const notificationMessage = formatMessage(
|
|
1012
|
+
{
|
|
1013
|
+
id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
|
|
1014
|
+
defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
|
|
1018
|
+
totalEntries: response2.data.meta.totalEntries
|
|
1019
|
+
}
|
|
1020
|
+
);
|
|
1021
|
+
const notification = {
|
|
1022
|
+
type: "success",
|
|
1023
|
+
title: formatMessage(
|
|
1024
|
+
{
|
|
1025
|
+
id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
|
|
1026
|
+
defaultMessage: "Successfully added to release."
|
|
1027
|
+
},
|
|
1028
|
+
{
|
|
1029
|
+
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
|
|
1030
|
+
totalEntries: response2.data.meta.totalEntries
|
|
1031
|
+
}
|
|
1032
|
+
),
|
|
1033
|
+
message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
|
|
1034
|
+
};
|
|
1035
|
+
toggleNotification(notification);
|
|
1036
|
+
return true;
|
|
1037
|
+
}
|
|
1038
|
+
if ("error" in response2) {
|
|
1039
|
+
if (isAxiosError$1(response2.error)) {
|
|
1040
|
+
toggleNotification({
|
|
1041
|
+
type: "warning",
|
|
1042
|
+
message: formatAPIError(response2.error)
|
|
1043
|
+
});
|
|
1044
|
+
} else {
|
|
1045
|
+
toggleNotification({
|
|
1046
|
+
type: "warning",
|
|
1047
|
+
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
};
|
|
1052
|
+
if (!canCreate || !canPublish)
|
|
1053
|
+
return null;
|
|
1054
|
+
return {
|
|
1055
|
+
actionType: "release",
|
|
1056
|
+
variant: "tertiary",
|
|
1057
|
+
label: formatMessage({
|
|
1058
|
+
id: "content-manager-list-view.add-to-release",
|
|
1059
|
+
defaultMessage: "Add to Release"
|
|
1060
|
+
}),
|
|
1061
|
+
dialog: {
|
|
1062
|
+
type: "modal",
|
|
1063
|
+
title: formatMessage({
|
|
1064
|
+
id: "content-manager-list-view.add-to-release",
|
|
1065
|
+
defaultMessage: "Add to Release"
|
|
1066
|
+
}),
|
|
1067
|
+
content: ({ onClose }) => {
|
|
1068
|
+
return /* @__PURE__ */ jsx(
|
|
1069
|
+
Formik,
|
|
1070
|
+
{
|
|
1071
|
+
onSubmit: async (values) => {
|
|
1072
|
+
const data = await handleSubmit(values);
|
|
1073
|
+
if (data) {
|
|
1074
|
+
return onClose();
|
|
1075
|
+
}
|
|
1076
|
+
},
|
|
1077
|
+
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
|
|
1078
|
+
initialValues: INITIAL_VALUES,
|
|
1079
|
+
children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
|
|
1080
|
+
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
1081
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
|
|
1082
|
+
SingleSelect,
|
|
1083
|
+
{
|
|
1084
|
+
required: true,
|
|
1085
|
+
label: formatMessage({
|
|
1086
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-label",
|
|
1087
|
+
defaultMessage: "Select a release"
|
|
1088
|
+
}),
|
|
1089
|
+
placeholder: formatMessage({
|
|
1090
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
|
|
1091
|
+
defaultMessage: "Select"
|
|
1092
|
+
}),
|
|
1093
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
1094
|
+
value: values.releaseId,
|
|
1095
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
1096
|
+
}
|
|
1097
|
+
) }),
|
|
1098
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
|
|
1099
|
+
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
|
|
1100
|
+
defaultMessage: "What do you want to do with these entries?"
|
|
1101
|
+
}) }),
|
|
1102
|
+
/* @__PURE__ */ jsx(
|
|
1103
|
+
ReleaseActionOptions,
|
|
1104
|
+
{
|
|
1105
|
+
selected: values.type,
|
|
1106
|
+
handleChange: (e) => setFieldValue("type", e.target.value),
|
|
1107
|
+
name: "type"
|
|
1108
|
+
}
|
|
1109
|
+
)
|
|
1110
|
+
] }) }),
|
|
1111
|
+
/* @__PURE__ */ jsx(
|
|
1112
|
+
ModalFooter,
|
|
1113
|
+
{
|
|
1114
|
+
startActions: /* @__PURE__ */ jsx(Button$1, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
1115
|
+
id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
|
|
1116
|
+
defaultMessage: "Cancel"
|
|
1117
|
+
}) }),
|
|
1118
|
+
endActions: (
|
|
1119
|
+
/**
|
|
1120
|
+
* TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
|
|
1121
|
+
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
1122
|
+
*/
|
|
1123
|
+
/* @__PURE__ */ jsx(Button$1, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
1124
|
+
id: "content-releases.content-manager-list-view.add-to-release.continue-button",
|
|
1125
|
+
defaultMessage: "Continue"
|
|
1126
|
+
}) })
|
|
1127
|
+
)
|
|
1128
|
+
}
|
|
1129
|
+
)
|
|
1130
|
+
] })
|
|
1131
|
+
}
|
|
1132
|
+
);
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
};
|
|
1136
|
+
};
|
|
1137
|
+
const Button = styled.button`
|
|
1138
|
+
svg {
|
|
1139
|
+
> g,
|
|
1140
|
+
path {
|
|
1141
|
+
fill: ${({ theme }) => theme.colors.neutral500};
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
&:hover {
|
|
1145
|
+
svg {
|
|
1146
|
+
> g,
|
|
1147
|
+
path {
|
|
1148
|
+
fill: ${({ theme }) => theme.colors.neutral600};
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
&:active {
|
|
1153
|
+
svg {
|
|
1154
|
+
> g,
|
|
1155
|
+
path {
|
|
1156
|
+
fill: ${({ theme }) => theme.colors.neutral400};
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
`;
|
|
1161
|
+
const ActionWrapper = styled(Flex)`
|
|
1162
|
+
svg {
|
|
1163
|
+
height: ${4 / 16}rem;
|
|
1164
|
+
}
|
|
1165
|
+
`;
|
|
1166
|
+
const useReleasesList = (entryId) => {
|
|
1167
|
+
const { uid: contentTypeUid } = useTypedSelector(
|
|
1168
|
+
(state) => state["content-manager_listView"].contentType
|
|
1169
|
+
);
|
|
1170
|
+
const listViewData = useTypedSelector((state) => state["content-manager_listView"].data);
|
|
1171
|
+
const entriesIds = listViewData.map((entry) => entry.id);
|
|
1172
|
+
const response = useGetMappedEntriesInReleasesQuery(
|
|
1173
|
+
{ contentTypeUid, entriesIds },
|
|
1174
|
+
{ skip: !entriesIds || !contentTypeUid || entriesIds.length === 0 }
|
|
1175
|
+
);
|
|
1176
|
+
const mappedEntriesInReleases = response.data || {};
|
|
1177
|
+
return mappedEntriesInReleases?.[entryId] || [];
|
|
1178
|
+
};
|
|
1179
|
+
const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
|
1180
|
+
const { contentType } = layout;
|
|
1181
|
+
if (!contentType.options?.draftAndPublish) {
|
|
1182
|
+
return { displayedHeaders, layout };
|
|
1183
|
+
}
|
|
1184
|
+
return {
|
|
1185
|
+
displayedHeaders: [
|
|
1186
|
+
...displayedHeaders,
|
|
1187
|
+
{
|
|
1188
|
+
key: "__release_key__",
|
|
1189
|
+
fieldSchema: { type: "string" },
|
|
1190
|
+
metadatas: { label: "To be released in", searchable: true, sortable: false },
|
|
1191
|
+
name: "releasedAt",
|
|
1192
|
+
cellFormatter: (props) => /* @__PURE__ */ jsx(ReleaseListCell, { ...props })
|
|
1193
|
+
}
|
|
1194
|
+
],
|
|
1195
|
+
layout
|
|
1196
|
+
};
|
|
1197
|
+
};
|
|
1198
|
+
const ReleaseListCell = ({ id }) => {
|
|
1199
|
+
const releases = useReleasesList(id);
|
|
1200
|
+
const [visible, setVisible] = React.useState(false);
|
|
1201
|
+
const buttonRef = React.useRef(null);
|
|
1202
|
+
const { formatMessage } = useIntl();
|
|
1203
|
+
const handleTogglePopover = () => setVisible((prev) => !prev);
|
|
1204
|
+
return /* @__PURE__ */ jsx(Flex, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx(Button, { type: "button", onClick: handleTogglePopover, ref: buttonRef, children: /* @__PURE__ */ jsxs(ActionWrapper, { height: "2rem", width: "2rem", children: [
|
|
1205
|
+
/* @__PURE__ */ jsx(Typography, { style: { maxWidth: "252px", cursor: "pointer" }, textColor: "neutral800", children: releases.length > 0 ? formatMessage(
|
|
1206
|
+
{
|
|
1207
|
+
id: "content-releases.content-manager.list-view.releases-number",
|
|
1208
|
+
defaultMessage: "{number} {number, plural, one {release} other {releases}}"
|
|
1209
|
+
},
|
|
1210
|
+
{
|
|
1211
|
+
number: releases.length
|
|
1212
|
+
}
|
|
1213
|
+
) : "-" }),
|
|
1214
|
+
/* @__PURE__ */ jsxs(Flex, { children: [
|
|
1215
|
+
releases.length > 0 && /* @__PURE__ */ jsx(SortIcon, {}),
|
|
1216
|
+
visible && /* @__PURE__ */ jsx(
|
|
1217
|
+
Popover,
|
|
1218
|
+
{
|
|
1219
|
+
onDismiss: handleTogglePopover,
|
|
1220
|
+
source: buttonRef,
|
|
1221
|
+
spacing: 16,
|
|
1222
|
+
children: /* @__PURE__ */ jsx("ul", { children: releases.map(({ id: id2, name }) => /* @__PURE__ */ jsx(Box, { padding: 3, as: "li", children: /* @__PURE__ */ jsx(Link, { href: `/admin/plugins/content-releases/${id2}`, isExternal: false, children: name }) }, id2)) })
|
|
1223
|
+
}
|
|
1224
|
+
)
|
|
1225
|
+
] })
|
|
1226
|
+
] }) }) });
|
|
1227
|
+
};
|
|
934
1228
|
const admin = {
|
|
935
1229
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
936
1230
|
register(app) {
|
|
1231
|
+
app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
|
|
937
1232
|
if (window.strapi.features.isEnabled("cms-content-releases")) {
|
|
938
1233
|
app.addMenuLink({
|
|
939
1234
|
to: `/plugins/${pluginId}`,
|
|
@@ -943,7 +1238,7 @@ const admin = {
|
|
|
943
1238
|
defaultMessage: "Releases"
|
|
944
1239
|
},
|
|
945
1240
|
async Component() {
|
|
946
|
-
const { App } = await import("./App-
|
|
1241
|
+
const { App } = await import("./App-jrh58sXY.mjs");
|
|
947
1242
|
return App;
|
|
948
1243
|
},
|
|
949
1244
|
permissions: PERMISSIONS.main
|
|
@@ -956,6 +1251,12 @@ const admin = {
|
|
|
956
1251
|
name: `${pluginId}-link`,
|
|
957
1252
|
Component: CMReleasesContainer
|
|
958
1253
|
});
|
|
1254
|
+
app.plugins["content-manager"].apis.addBulkAction((actions) => {
|
|
1255
|
+
const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
|
|
1256
|
+
actions.splice(deleteActionIndex, 0, ReleaseAction);
|
|
1257
|
+
return actions;
|
|
1258
|
+
});
|
|
1259
|
+
app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
|
|
959
1260
|
} else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
|
|
960
1261
|
app.addMenuLink({
|
|
961
1262
|
to: `/plugins/purchase-content-releases`,
|
|
@@ -965,17 +1266,18 @@ const admin = {
|
|
|
965
1266
|
defaultMessage: "Releases"
|
|
966
1267
|
},
|
|
967
1268
|
async Component() {
|
|
968
|
-
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-
|
|
1269
|
+
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-3tRbmbY3.mjs");
|
|
969
1270
|
return PurchaseContentReleases;
|
|
970
1271
|
},
|
|
971
1272
|
lockIcon: true
|
|
1273
|
+
// TODO: to replace with another name in v5
|
|
972
1274
|
});
|
|
973
1275
|
}
|
|
974
1276
|
},
|
|
975
1277
|
async registerTrads({ locales }) {
|
|
976
1278
|
const importedTrads = await Promise.all(
|
|
977
1279
|
locales.map((locale) => {
|
|
978
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-
|
|
1280
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-ltT1TlKQ.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
|
|
979
1281
|
return {
|
|
980
1282
|
data: prefixPluginTranslations(data, "content-releases"),
|
|
981
1283
|
locale
|
|
@@ -1010,4 +1312,4 @@ export {
|
|
|
1010
1312
|
releaseApi as r,
|
|
1011
1313
|
useGetReleasesQuery as u
|
|
1012
1314
|
};
|
|
1013
|
-
//# sourceMappingURL=index-
|
|
1315
|
+
//# sourceMappingURL=index-PiOGBETy.mjs.map
|