@strapi/content-releases 0.0.0-next.6d59515520a3850456f256fb0e4c54b75054ddf4 → 0.0.0-next.734763e5757af27ff96ad1c9662161f3f677052a
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-_20W9dYa.js → App-c5uGEz9O.js} +744 -446
- package/dist/_chunks/App-c5uGEz9O.js.map +1 -0
- package/dist/_chunks/{App-L1jSxCiL.mjs → App-xQ5ljY7-.mjs} +752 -455
- package/dist/_chunks/App-xQ5ljY7-.mjs.map +1 -0
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs +51 -0
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js +51 -0
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
- package/dist/_chunks/{en-gYDqKYFd.js → en-3SGjiVyR.js} +29 -7
- package/dist/_chunks/en-3SGjiVyR.js.map +1 -0
- package/dist/_chunks/{en-MyLPoISH.mjs → en-bpHsnU0n.mjs} +29 -7
- package/dist/_chunks/en-bpHsnU0n.mjs.map +1 -0
- package/dist/_chunks/{index-KJa1Rb5F.js → index-4U0Q_Fgd.js} +350 -34
- package/dist/_chunks/index-4U0Q_Fgd.js.map +1 -0
- package/dist/_chunks/{index-c4zRX_sg.mjs → index-ifoPtgmH.mjs} +363 -47
- package/dist/_chunks/index-ifoPtgmH.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/server/index.js +998 -399
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +997 -399
- package/dist/server/index.mjs.map +1 -1
- package/package.json +14 -11
- package/dist/_chunks/App-L1jSxCiL.mjs.map +0 -1
- package/dist/_chunks/App-_20W9dYa.js.map +0 -1
- package/dist/_chunks/en-MyLPoISH.mjs.map +0 -1
- package/dist/_chunks/en-gYDqKYFd.js.map +0 -1
- package/dist/_chunks/index-KJa1Rb5F.js.map +0 -1
- package/dist/_chunks/index-c4zRX_sg.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, prefixPluginTranslations } from "@strapi/helper-plugin";
|
|
1
|
+
import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, useRBAC, 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";
|
|
@@ -8,7 +8,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";
|
|
10
10
|
import { useIntl } from "react-intl";
|
|
11
|
-
import { NavLink,
|
|
11
|
+
import { NavLink, Link as Link$1 } from "react-router-dom";
|
|
12
12
|
import * as yup from "yup";
|
|
13
13
|
import { createApi } from "@reduxjs/toolkit/query/react";
|
|
14
14
|
import styled from "styled-components";
|
|
@@ -251,6 +251,19 @@ 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
|
+
]
|
|
266
|
+
}),
|
|
254
267
|
updateReleaseAction: build.mutation({
|
|
255
268
|
query({ body, params }) {
|
|
256
269
|
return {
|
|
@@ -259,7 +272,27 @@ const releaseApi = createApi({
|
|
|
259
272
|
data: body
|
|
260
273
|
};
|
|
261
274
|
},
|
|
262
|
-
invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }]
|
|
275
|
+
invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
|
|
276
|
+
async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
|
|
277
|
+
const paramsWithoutActionId = {
|
|
278
|
+
releaseId: params.releaseId,
|
|
279
|
+
...query
|
|
280
|
+
};
|
|
281
|
+
const patchResult = dispatch(
|
|
282
|
+
releaseApi.util.updateQueryData("getReleaseActions", paramsWithoutActionId, (draft) => {
|
|
283
|
+
const [key, index] = actionPath;
|
|
284
|
+
const action = draft.data[key][index];
|
|
285
|
+
if (action) {
|
|
286
|
+
action.type = body.type;
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
);
|
|
290
|
+
try {
|
|
291
|
+
await queryFulfilled;
|
|
292
|
+
} catch {
|
|
293
|
+
patchResult.undo();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
263
296
|
}),
|
|
264
297
|
deleteReleaseAction: build.mutation({
|
|
265
298
|
query({ params }) {
|
|
@@ -268,8 +301,9 @@ const releaseApi = createApi({
|
|
|
268
301
|
method: "DELETE"
|
|
269
302
|
};
|
|
270
303
|
},
|
|
271
|
-
invalidatesTags: [
|
|
304
|
+
invalidatesTags: (result, error, arg) => [
|
|
272
305
|
{ type: "Release", id: "LIST" },
|
|
306
|
+
{ type: "Release", id: arg.params.releaseId },
|
|
273
307
|
{ type: "ReleaseAction", id: "LIST" }
|
|
274
308
|
]
|
|
275
309
|
}),
|
|
@@ -289,7 +323,7 @@ const releaseApi = createApi({
|
|
|
289
323
|
method: "DELETE"
|
|
290
324
|
};
|
|
291
325
|
},
|
|
292
|
-
invalidatesTags: (
|
|
326
|
+
invalidatesTags: () => [{ type: "Release", id: "LIST" }]
|
|
293
327
|
})
|
|
294
328
|
};
|
|
295
329
|
}
|
|
@@ -301,12 +335,29 @@ const {
|
|
|
301
335
|
useGetReleaseActionsQuery,
|
|
302
336
|
useCreateReleaseMutation,
|
|
303
337
|
useCreateReleaseActionMutation,
|
|
338
|
+
useCreateManyReleaseActionsMutation,
|
|
304
339
|
useUpdateReleaseMutation,
|
|
305
340
|
useUpdateReleaseActionMutation,
|
|
306
341
|
usePublishReleaseMutation,
|
|
307
342
|
useDeleteReleaseActionMutation,
|
|
308
343
|
useDeleteReleaseMutation
|
|
309
344
|
} = releaseApi;
|
|
345
|
+
const getTimezoneOffset = (timezone, date) => {
|
|
346
|
+
try {
|
|
347
|
+
const offsetPart = new Intl.DateTimeFormat("en", {
|
|
348
|
+
timeZone: timezone,
|
|
349
|
+
timeZoneName: "longOffset"
|
|
350
|
+
}).formatToParts(date).find((part) => part.type === "timeZoneName");
|
|
351
|
+
const offset = offsetPart ? offsetPart.value : "";
|
|
352
|
+
let utcOffset = offset.replace("GMT", "UTC");
|
|
353
|
+
if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
|
|
354
|
+
utcOffset = `${utcOffset}+00:00`;
|
|
355
|
+
}
|
|
356
|
+
return utcOffset;
|
|
357
|
+
} catch (error) {
|
|
358
|
+
return "";
|
|
359
|
+
}
|
|
360
|
+
};
|
|
310
361
|
const useTypedDispatch = useDispatch;
|
|
311
362
|
const useTypedSelector = useSelector;
|
|
312
363
|
const StyledMenuItem = styled(Menu.Item)`
|
|
@@ -377,7 +428,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
377
428
|
}
|
|
378
429
|
};
|
|
379
430
|
return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
380
|
-
/* @__PURE__ */ jsx(Icon, { as: Cross,
|
|
431
|
+
/* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
|
|
381
432
|
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
382
433
|
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
383
434
|
defaultMessage: "Remove from release"
|
|
@@ -416,7 +467,7 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
416
467
|
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
417
468
|
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
418
469
|
},
|
|
419
|
-
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil,
|
|
470
|
+
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
|
|
420
471
|
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
421
472
|
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
422
473
|
defaultMessage: "Edit entry"
|
|
@@ -426,6 +477,21 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
426
477
|
}
|
|
427
478
|
);
|
|
428
479
|
};
|
|
480
|
+
const EditReleaseItem = ({ releaseId }) => {
|
|
481
|
+
const { formatMessage } = useIntl();
|
|
482
|
+
return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
|
|
483
|
+
Link,
|
|
484
|
+
{
|
|
485
|
+
href: `/admin/plugins/content-releases/${releaseId}`,
|
|
486
|
+
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
|
|
487
|
+
isExternal: false,
|
|
488
|
+
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
489
|
+
id: "content-releases.content-manager-edit-view.edit-release",
|
|
490
|
+
defaultMessage: "Edit release"
|
|
491
|
+
}) })
|
|
492
|
+
}
|
|
493
|
+
) });
|
|
494
|
+
};
|
|
429
495
|
const Root = ({ children, hasTriggerBorder = false }) => {
|
|
430
496
|
const { formatMessage } = useIntl();
|
|
431
497
|
return (
|
|
@@ -450,6 +516,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
|
|
|
450
516
|
};
|
|
451
517
|
const ReleaseActionMenu = {
|
|
452
518
|
Root,
|
|
519
|
+
EditReleaseItem,
|
|
453
520
|
DeleteReleaseActionItem,
|
|
454
521
|
ReleaseActionEntryLinkItem
|
|
455
522
|
};
|
|
@@ -473,19 +540,40 @@ const FieldWrapper = styled(Field)`
|
|
|
473
540
|
text-transform: capitalize;
|
|
474
541
|
}
|
|
475
542
|
|
|
476
|
-
&:active,
|
|
477
543
|
&[data-checked='true'] {
|
|
478
|
-
color: ${({ theme }) => theme.colors.primary700};
|
|
479
|
-
background-color: ${({ theme }) => theme.colors.primary100};
|
|
480
|
-
border-color: ${({ theme }) => theme.colors.primary700};
|
|
544
|
+
color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
545
|
+
background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
546
|
+
border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
481
547
|
}
|
|
482
548
|
|
|
483
549
|
&[data-checked='false'] {
|
|
484
550
|
border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
|
|
485
551
|
border-right: ${({ actionType }) => actionType === "publish" && "none"};
|
|
486
552
|
}
|
|
553
|
+
|
|
554
|
+
&[data-checked='false'][data-disabled='false']:hover {
|
|
555
|
+
color: ${({ theme }) => theme.colors.neutral700};
|
|
556
|
+
background-color: ${({ theme }) => theme.colors.neutral100};
|
|
557
|
+
border-color: ${({ theme }) => theme.colors.neutral200};
|
|
558
|
+
|
|
559
|
+
& > label {
|
|
560
|
+
cursor: pointer;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
&[data-disabled='true'] {
|
|
565
|
+
color: ${({ theme }) => theme.colors.neutral600};
|
|
566
|
+
background-color: ${({ theme }) => theme.colors.neutral150};
|
|
567
|
+
border-color: ${({ theme }) => theme.colors.neutral300};
|
|
568
|
+
}
|
|
487
569
|
`;
|
|
488
|
-
const ActionOption = ({
|
|
570
|
+
const ActionOption = ({
|
|
571
|
+
selected,
|
|
572
|
+
actionType,
|
|
573
|
+
handleChange,
|
|
574
|
+
name,
|
|
575
|
+
disabled = false
|
|
576
|
+
}) => {
|
|
489
577
|
return /* @__PURE__ */ jsx(
|
|
490
578
|
FieldWrapper,
|
|
491
579
|
{
|
|
@@ -496,6 +584,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
|
|
|
496
584
|
position: "relative",
|
|
497
585
|
cursor: "pointer",
|
|
498
586
|
"data-checked": selected === actionType,
|
|
587
|
+
"data-disabled": disabled && selected !== actionType,
|
|
499
588
|
children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
|
|
500
589
|
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
|
|
501
590
|
FieldInput,
|
|
@@ -505,7 +594,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
|
|
|
505
594
|
name,
|
|
506
595
|
checked: selected === actionType,
|
|
507
596
|
onChange: handleChange,
|
|
508
|
-
value: actionType
|
|
597
|
+
value: actionType,
|
|
598
|
+
disabled
|
|
509
599
|
}
|
|
510
600
|
) }),
|
|
511
601
|
actionType
|
|
@@ -513,7 +603,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
|
|
|
513
603
|
}
|
|
514
604
|
);
|
|
515
605
|
};
|
|
516
|
-
const ReleaseActionOptions = ({
|
|
606
|
+
const ReleaseActionOptions = ({
|
|
607
|
+
selected,
|
|
608
|
+
handleChange,
|
|
609
|
+
name,
|
|
610
|
+
disabled = false
|
|
611
|
+
}) => {
|
|
517
612
|
return /* @__PURE__ */ jsxs(Flex, { children: [
|
|
518
613
|
/* @__PURE__ */ jsx(
|
|
519
614
|
ActionOption,
|
|
@@ -521,7 +616,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
|
|
|
521
616
|
actionType: "publish",
|
|
522
617
|
selected,
|
|
523
618
|
handleChange,
|
|
524
|
-
name
|
|
619
|
+
name,
|
|
620
|
+
disabled
|
|
525
621
|
}
|
|
526
622
|
),
|
|
527
623
|
/* @__PURE__ */ jsx(
|
|
@@ -530,7 +626,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
|
|
|
530
626
|
actionType: "unpublish",
|
|
531
627
|
selected,
|
|
532
628
|
handleChange,
|
|
533
|
-
name
|
|
629
|
+
name,
|
|
630
|
+
disabled
|
|
534
631
|
}
|
|
535
632
|
)
|
|
536
633
|
] });
|
|
@@ -574,6 +671,7 @@ const AddActionToReleaseModal = ({
|
|
|
574
671
|
contentTypeUid,
|
|
575
672
|
entryId
|
|
576
673
|
}) => {
|
|
674
|
+
const releaseHeaderId = React.useId();
|
|
577
675
|
const { formatMessage } = useIntl();
|
|
578
676
|
const toggleNotification = useNotification();
|
|
579
677
|
const { formatAPIError } = useAPIErrorHandler();
|
|
@@ -621,8 +719,8 @@ const AddActionToReleaseModal = ({
|
|
|
621
719
|
}
|
|
622
720
|
}
|
|
623
721
|
};
|
|
624
|
-
return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy:
|
|
625
|
-
/* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id:
|
|
722
|
+
return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
|
|
723
|
+
/* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
|
|
626
724
|
id: "content-releases.content-manager-edit-view.add-to-release",
|
|
627
725
|
defaultMessage: "Add to release"
|
|
628
726
|
}) }) }),
|
|
@@ -692,16 +790,18 @@ const AddActionToReleaseModal = ({
|
|
|
692
790
|
};
|
|
693
791
|
const CMReleasesContainer = () => {
|
|
694
792
|
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
695
|
-
const { formatMessage } = useIntl();
|
|
793
|
+
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
696
794
|
const {
|
|
697
795
|
isCreatingEntry,
|
|
698
|
-
|
|
796
|
+
hasDraftAndPublish,
|
|
797
|
+
initialData: { id: entryId },
|
|
798
|
+
slug
|
|
699
799
|
} = useCMEditViewDataManager();
|
|
700
|
-
const
|
|
701
|
-
const canFetch =
|
|
800
|
+
const contentTypeUid = slug;
|
|
801
|
+
const canFetch = entryId != null && contentTypeUid != null;
|
|
702
802
|
const fetchParams = canFetch ? {
|
|
703
|
-
contentTypeUid
|
|
704
|
-
entryId
|
|
803
|
+
contentTypeUid,
|
|
804
|
+
entryId,
|
|
705
805
|
hasEntryAttached: true
|
|
706
806
|
} : skipToken;
|
|
707
807
|
const response = useGetReleasesForEntryQuery(fetchParams);
|
|
@@ -709,7 +809,7 @@ const CMReleasesContainer = () => {
|
|
|
709
809
|
if (!canFetch) {
|
|
710
810
|
return null;
|
|
711
811
|
}
|
|
712
|
-
if (isCreatingEntry || !
|
|
812
|
+
if (isCreatingEntry || !hasDraftAndPublish) {
|
|
713
813
|
return null;
|
|
714
814
|
}
|
|
715
815
|
const toggleModal = () => setIsModalOpen((prev) => !prev);
|
|
@@ -776,15 +876,40 @@ const CMReleasesContainer = () => {
|
|
|
776
876
|
)
|
|
777
877
|
}
|
|
778
878
|
),
|
|
779
|
-
/* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap:
|
|
879
|
+
/* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
780
880
|
/* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
|
|
781
|
-
|
|
782
|
-
|
|
881
|
+
release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
|
|
882
|
+
{
|
|
883
|
+
id: "content-releases.content-manager-edit-view.scheduled.date",
|
|
884
|
+
defaultMessage: "{date} at {time} ({offset})"
|
|
885
|
+
},
|
|
783
886
|
{
|
|
784
|
-
|
|
785
|
-
|
|
887
|
+
date: formatDate(new Date(release.scheduledAt), {
|
|
888
|
+
day: "2-digit",
|
|
889
|
+
month: "2-digit",
|
|
890
|
+
year: "numeric",
|
|
891
|
+
timeZone: release.timezone
|
|
892
|
+
}),
|
|
893
|
+
time: formatTime(new Date(release.scheduledAt), {
|
|
894
|
+
hourCycle: "h23",
|
|
895
|
+
timeZone: release.timezone
|
|
896
|
+
}),
|
|
897
|
+
offset: getTimezoneOffset(
|
|
898
|
+
release.timezone,
|
|
899
|
+
new Date(release.scheduledAt)
|
|
900
|
+
)
|
|
786
901
|
}
|
|
787
|
-
) })
|
|
902
|
+
) }),
|
|
903
|
+
/* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
|
|
904
|
+
/* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
|
|
905
|
+
/* @__PURE__ */ jsx(
|
|
906
|
+
ReleaseActionMenu.DeleteReleaseActionItem,
|
|
907
|
+
{
|
|
908
|
+
releaseId: release.id,
|
|
909
|
+
actionId: release.action.id
|
|
910
|
+
}
|
|
911
|
+
)
|
|
912
|
+
] }) })
|
|
788
913
|
] })
|
|
789
914
|
]
|
|
790
915
|
},
|
|
@@ -812,14 +937,185 @@ const CMReleasesContainer = () => {
|
|
|
812
937
|
AddActionToReleaseModal,
|
|
813
938
|
{
|
|
814
939
|
handleClose: toggleModal,
|
|
815
|
-
contentTypeUid
|
|
816
|
-
entryId
|
|
940
|
+
contentTypeUid,
|
|
941
|
+
entryId
|
|
817
942
|
}
|
|
818
943
|
)
|
|
819
944
|
]
|
|
820
945
|
}
|
|
821
946
|
) });
|
|
822
947
|
};
|
|
948
|
+
const getContentPermissions = (subject) => {
|
|
949
|
+
const permissions = {
|
|
950
|
+
publish: [
|
|
951
|
+
{
|
|
952
|
+
action: "plugin::content-manager.explorer.publish",
|
|
953
|
+
subject,
|
|
954
|
+
id: "",
|
|
955
|
+
actionParameters: {},
|
|
956
|
+
properties: {},
|
|
957
|
+
conditions: []
|
|
958
|
+
}
|
|
959
|
+
]
|
|
960
|
+
};
|
|
961
|
+
return permissions;
|
|
962
|
+
};
|
|
963
|
+
const ReleaseAction = ({ ids, model }) => {
|
|
964
|
+
const { formatMessage } = useIntl();
|
|
965
|
+
const toggleNotification = useNotification();
|
|
966
|
+
const { formatAPIError } = useAPIErrorHandler();
|
|
967
|
+
const { modifiedData } = useCMEditViewDataManager();
|
|
968
|
+
const contentPermissions = getContentPermissions(model);
|
|
969
|
+
const {
|
|
970
|
+
allowedActions: { canPublish }
|
|
971
|
+
} = useRBAC(contentPermissions);
|
|
972
|
+
const {
|
|
973
|
+
allowedActions: { canCreate }
|
|
974
|
+
} = useRBAC(PERMISSIONS);
|
|
975
|
+
const response = useGetReleasesQuery();
|
|
976
|
+
const releases = response.data?.data;
|
|
977
|
+
const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
|
|
978
|
+
const handleSubmit = async (values) => {
|
|
979
|
+
const locale = modifiedData.locale;
|
|
980
|
+
const releaseActionEntries = ids.map((id) => ({
|
|
981
|
+
type: values.type,
|
|
982
|
+
entry: {
|
|
983
|
+
contentType: model,
|
|
984
|
+
id,
|
|
985
|
+
locale
|
|
986
|
+
}
|
|
987
|
+
}));
|
|
988
|
+
const response2 = await createManyReleaseActions({
|
|
989
|
+
body: releaseActionEntries,
|
|
990
|
+
params: { releaseId: values.releaseId }
|
|
991
|
+
});
|
|
992
|
+
if ("data" in response2) {
|
|
993
|
+
const notificationMessage = formatMessage(
|
|
994
|
+
{
|
|
995
|
+
id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
|
|
996
|
+
defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
|
|
1000
|
+
totalEntries: response2.data.meta.totalEntries
|
|
1001
|
+
}
|
|
1002
|
+
);
|
|
1003
|
+
const notification = {
|
|
1004
|
+
type: "success",
|
|
1005
|
+
title: formatMessage(
|
|
1006
|
+
{
|
|
1007
|
+
id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
|
|
1008
|
+
defaultMessage: "Successfully added to release."
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
|
|
1012
|
+
totalEntries: response2.data.meta.totalEntries
|
|
1013
|
+
}
|
|
1014
|
+
),
|
|
1015
|
+
message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
|
|
1016
|
+
};
|
|
1017
|
+
toggleNotification(notification);
|
|
1018
|
+
return true;
|
|
1019
|
+
}
|
|
1020
|
+
if ("error" in response2) {
|
|
1021
|
+
if (isAxiosError$1(response2.error)) {
|
|
1022
|
+
toggleNotification({
|
|
1023
|
+
type: "warning",
|
|
1024
|
+
message: formatAPIError(response2.error)
|
|
1025
|
+
});
|
|
1026
|
+
} else {
|
|
1027
|
+
toggleNotification({
|
|
1028
|
+
type: "warning",
|
|
1029
|
+
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
};
|
|
1034
|
+
if (!canCreate || !canPublish)
|
|
1035
|
+
return null;
|
|
1036
|
+
return {
|
|
1037
|
+
actionType: "release",
|
|
1038
|
+
variant: "tertiary",
|
|
1039
|
+
label: formatMessage({
|
|
1040
|
+
id: "content-manager-list-view.add-to-release",
|
|
1041
|
+
defaultMessage: "Add to Release"
|
|
1042
|
+
}),
|
|
1043
|
+
dialog: {
|
|
1044
|
+
type: "modal",
|
|
1045
|
+
title: formatMessage({
|
|
1046
|
+
id: "content-manager-list-view.add-to-release",
|
|
1047
|
+
defaultMessage: "Add to Release"
|
|
1048
|
+
}),
|
|
1049
|
+
content: ({ onClose }) => {
|
|
1050
|
+
return /* @__PURE__ */ jsx(
|
|
1051
|
+
Formik,
|
|
1052
|
+
{
|
|
1053
|
+
onSubmit: async (values) => {
|
|
1054
|
+
const data = await handleSubmit(values);
|
|
1055
|
+
if (data) {
|
|
1056
|
+
return onClose();
|
|
1057
|
+
}
|
|
1058
|
+
},
|
|
1059
|
+
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
|
|
1060
|
+
initialValues: INITIAL_VALUES,
|
|
1061
|
+
children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
|
|
1062
|
+
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
1063
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
|
|
1064
|
+
SingleSelect,
|
|
1065
|
+
{
|
|
1066
|
+
required: true,
|
|
1067
|
+
label: formatMessage({
|
|
1068
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-label",
|
|
1069
|
+
defaultMessage: "Select a release"
|
|
1070
|
+
}),
|
|
1071
|
+
placeholder: formatMessage({
|
|
1072
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
|
|
1073
|
+
defaultMessage: "Select"
|
|
1074
|
+
}),
|
|
1075
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
1076
|
+
value: values.releaseId,
|
|
1077
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
1078
|
+
}
|
|
1079
|
+
) }),
|
|
1080
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
|
|
1081
|
+
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
|
|
1082
|
+
defaultMessage: "What do you want to do with these entries?"
|
|
1083
|
+
}) }),
|
|
1084
|
+
/* @__PURE__ */ jsx(
|
|
1085
|
+
ReleaseActionOptions,
|
|
1086
|
+
{
|
|
1087
|
+
selected: values.type,
|
|
1088
|
+
handleChange: (e) => setFieldValue("type", e.target.value),
|
|
1089
|
+
name: "type"
|
|
1090
|
+
}
|
|
1091
|
+
)
|
|
1092
|
+
] }) }),
|
|
1093
|
+
/* @__PURE__ */ jsx(
|
|
1094
|
+
ModalFooter,
|
|
1095
|
+
{
|
|
1096
|
+
startActions: /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
1097
|
+
id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
|
|
1098
|
+
defaultMessage: "Cancel"
|
|
1099
|
+
}) }),
|
|
1100
|
+
endActions: (
|
|
1101
|
+
/**
|
|
1102
|
+
* TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
|
|
1103
|
+
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
1104
|
+
*/
|
|
1105
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
1106
|
+
id: "content-releases.content-manager-list-view.add-to-release.continue-button",
|
|
1107
|
+
defaultMessage: "Continue"
|
|
1108
|
+
}) })
|
|
1109
|
+
)
|
|
1110
|
+
}
|
|
1111
|
+
)
|
|
1112
|
+
] })
|
|
1113
|
+
}
|
|
1114
|
+
);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
};
|
|
1118
|
+
};
|
|
823
1119
|
const admin = {
|
|
824
1120
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
825
1121
|
register(app) {
|
|
@@ -832,7 +1128,7 @@ const admin = {
|
|
|
832
1128
|
defaultMessage: "Releases"
|
|
833
1129
|
},
|
|
834
1130
|
async Component() {
|
|
835
|
-
const { App } = await import("./App-
|
|
1131
|
+
const { App } = await import("./App-xQ5ljY7-.mjs");
|
|
836
1132
|
return App;
|
|
837
1133
|
},
|
|
838
1134
|
permissions: PERMISSIONS.main
|
|
@@ -845,12 +1141,31 @@ const admin = {
|
|
|
845
1141
|
name: `${pluginId}-link`,
|
|
846
1142
|
Component: CMReleasesContainer
|
|
847
1143
|
});
|
|
1144
|
+
app.plugins["content-manager"].apis.addBulkAction((actions) => {
|
|
1145
|
+
const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
|
|
1146
|
+
actions.splice(deleteActionIndex, 0, ReleaseAction);
|
|
1147
|
+
return actions;
|
|
1148
|
+
});
|
|
1149
|
+
} else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
|
|
1150
|
+
app.addMenuLink({
|
|
1151
|
+
to: `/plugins/purchase-content-releases`,
|
|
1152
|
+
icon: PaperPlane,
|
|
1153
|
+
intlLabel: {
|
|
1154
|
+
id: `${pluginId}.plugin.name`,
|
|
1155
|
+
defaultMessage: "Releases"
|
|
1156
|
+
},
|
|
1157
|
+
async Component() {
|
|
1158
|
+
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-3tRbmbY3.mjs");
|
|
1159
|
+
return PurchaseContentReleases;
|
|
1160
|
+
},
|
|
1161
|
+
lockIcon: true
|
|
1162
|
+
});
|
|
848
1163
|
}
|
|
849
1164
|
},
|
|
850
1165
|
async registerTrads({ locales }) {
|
|
851
1166
|
const importedTrads = await Promise.all(
|
|
852
1167
|
locales.map((locale) => {
|
|
853
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-
|
|
1168
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-bpHsnU0n.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
|
|
854
1169
|
return {
|
|
855
1170
|
data: prefixPluginTranslations(data, "content-releases"),
|
|
856
1171
|
locale
|
|
@@ -869,19 +1184,20 @@ const admin = {
|
|
|
869
1184
|
export {
|
|
870
1185
|
PERMISSIONS as P,
|
|
871
1186
|
ReleaseActionOptions as R,
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
1187
|
+
useCreateReleaseMutation as a,
|
|
1188
|
+
useGetReleaseQuery as b,
|
|
1189
|
+
useUpdateReleaseMutation as c,
|
|
1190
|
+
useDeleteReleaseMutation as d,
|
|
1191
|
+
usePublishReleaseMutation as e,
|
|
1192
|
+
useTypedDispatch as f,
|
|
1193
|
+
getTimezoneOffset as g,
|
|
1194
|
+
useGetReleaseActionsQuery as h,
|
|
880
1195
|
isAxiosError as i,
|
|
881
|
-
|
|
882
|
-
|
|
1196
|
+
useUpdateReleaseActionMutation as j,
|
|
1197
|
+
ReleaseActionMenu as k,
|
|
1198
|
+
admin as l,
|
|
883
1199
|
pluginId as p,
|
|
884
1200
|
releaseApi as r,
|
|
885
|
-
|
|
1201
|
+
useGetReleasesQuery as u
|
|
886
1202
|
};
|
|
887
|
-
//# sourceMappingURL=index-
|
|
1203
|
+
//# sourceMappingURL=index-ifoPtgmH.mjs.map
|