@strapi/content-releases 0.0.0-experimental.b5b7b8260a4549f3bd7443fbd68be5ccc9857cd7 → 0.0.0-experimental.c5354c231bf2abb4fe353d2ab7812bced4a1c6fa
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-AYV8n9jv.js → App-OP70yd5M.js} +784 -435
- package/dist/_chunks/App-OP70yd5M.js.map +1 -0
- package/dist/_chunks/App-x6Tjj3HN.mjs +1315 -0
- package/dist/_chunks/App-x6Tjj3HN.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-NFIckO1N.mjs → index-1ejXLtzt.mjs} +367 -48
- package/dist/_chunks/index-1ejXLtzt.mjs.map +1 -0
- package/dist/_chunks/{index-FYDbIuRi.js → index-ydocdaZ0.js} +355 -36
- package/dist/_chunks/index-ydocdaZ0.js.map +1 -0
- package/dist/admin/index.js +2 -2
- package/dist/admin/index.mjs +3 -3
- package/dist/server/index.js +1059 -377
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1060 -379
- package/dist/server/index.mjs.map +1 -1
- package/package.json +16 -11
- package/dist/_chunks/App-AYV8n9jv.js.map +0 -1
- package/dist/_chunks/App-KBaxZVmD.mjs +0 -967
- package/dist/_chunks/App-KBaxZVmD.mjs.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-FYDbIuRi.js.map +0 -1
- package/dist/_chunks/index-NFIckO1N.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,11 +8,11 @@ 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
|
-
import { useSelector } from "react-redux";
|
|
15
14
|
import styled from "styled-components";
|
|
15
|
+
import { useDispatch, useSelector } from "react-redux";
|
|
16
16
|
const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
|
17
17
|
const v = glob[path];
|
|
18
18
|
if (v) {
|
|
@@ -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,30 @@ 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
|
+
};
|
|
361
|
+
const useTypedDispatch = useDispatch;
|
|
310
362
|
const useTypedSelector = useSelector;
|
|
311
363
|
const StyledMenuItem = styled(Menu.Item)`
|
|
312
364
|
&:hover {
|
|
@@ -376,7 +428,7 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
376
428
|
}
|
|
377
429
|
};
|
|
378
430
|
return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
379
|
-
/* @__PURE__ */ jsx(Icon, { as: Cross,
|
|
431
|
+
/* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
|
|
380
432
|
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
381
433
|
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
382
434
|
defaultMessage: "Remove from release"
|
|
@@ -415,7 +467,7 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
415
467
|
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
416
468
|
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
417
469
|
},
|
|
418
|
-
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil,
|
|
470
|
+
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
|
|
419
471
|
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
420
472
|
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
421
473
|
defaultMessage: "Edit entry"
|
|
@@ -425,6 +477,21 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
425
477
|
}
|
|
426
478
|
);
|
|
427
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
|
+
};
|
|
428
495
|
const Root = ({ children, hasTriggerBorder = false }) => {
|
|
429
496
|
const { formatMessage } = useIntl();
|
|
430
497
|
return (
|
|
@@ -449,6 +516,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
|
|
|
449
516
|
};
|
|
450
517
|
const ReleaseActionMenu = {
|
|
451
518
|
Root,
|
|
519
|
+
EditReleaseItem,
|
|
452
520
|
DeleteReleaseActionItem,
|
|
453
521
|
ReleaseActionEntryLinkItem
|
|
454
522
|
};
|
|
@@ -472,19 +540,40 @@ const FieldWrapper = styled(Field)`
|
|
|
472
540
|
text-transform: capitalize;
|
|
473
541
|
}
|
|
474
542
|
|
|
475
|
-
&:active,
|
|
476
543
|
&[data-checked='true'] {
|
|
477
|
-
color: ${({ theme }) => theme.colors.primary700};
|
|
478
|
-
background-color: ${({ theme }) => theme.colors.primary100};
|
|
479
|
-
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};
|
|
480
547
|
}
|
|
481
548
|
|
|
482
549
|
&[data-checked='false'] {
|
|
483
550
|
border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
|
|
484
551
|
border-right: ${({ actionType }) => actionType === "publish" && "none"};
|
|
485
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
|
+
}
|
|
486
569
|
`;
|
|
487
|
-
const ActionOption = ({
|
|
570
|
+
const ActionOption = ({
|
|
571
|
+
selected,
|
|
572
|
+
actionType,
|
|
573
|
+
handleChange,
|
|
574
|
+
name,
|
|
575
|
+
disabled = false
|
|
576
|
+
}) => {
|
|
488
577
|
return /* @__PURE__ */ jsx(
|
|
489
578
|
FieldWrapper,
|
|
490
579
|
{
|
|
@@ -495,6 +584,7 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
|
|
|
495
584
|
position: "relative",
|
|
496
585
|
cursor: "pointer",
|
|
497
586
|
"data-checked": selected === actionType,
|
|
587
|
+
"data-disabled": disabled && selected !== actionType,
|
|
498
588
|
children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
|
|
499
589
|
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
|
|
500
590
|
FieldInput,
|
|
@@ -504,7 +594,8 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
|
|
|
504
594
|
name,
|
|
505
595
|
checked: selected === actionType,
|
|
506
596
|
onChange: handleChange,
|
|
507
|
-
value: actionType
|
|
597
|
+
value: actionType,
|
|
598
|
+
disabled
|
|
508
599
|
}
|
|
509
600
|
) }),
|
|
510
601
|
actionType
|
|
@@ -512,7 +603,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
|
|
|
512
603
|
}
|
|
513
604
|
);
|
|
514
605
|
};
|
|
515
|
-
const ReleaseActionOptions = ({
|
|
606
|
+
const ReleaseActionOptions = ({
|
|
607
|
+
selected,
|
|
608
|
+
handleChange,
|
|
609
|
+
name,
|
|
610
|
+
disabled = false
|
|
611
|
+
}) => {
|
|
516
612
|
return /* @__PURE__ */ jsxs(Flex, { children: [
|
|
517
613
|
/* @__PURE__ */ jsx(
|
|
518
614
|
ActionOption,
|
|
@@ -520,7 +616,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
|
|
|
520
616
|
actionType: "publish",
|
|
521
617
|
selected,
|
|
522
618
|
handleChange,
|
|
523
|
-
name
|
|
619
|
+
name,
|
|
620
|
+
disabled
|
|
524
621
|
}
|
|
525
622
|
),
|
|
526
623
|
/* @__PURE__ */ jsx(
|
|
@@ -529,7 +626,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
|
|
|
529
626
|
actionType: "unpublish",
|
|
530
627
|
selected,
|
|
531
628
|
handleChange,
|
|
532
|
-
name
|
|
629
|
+
name,
|
|
630
|
+
disabled
|
|
533
631
|
}
|
|
534
632
|
)
|
|
535
633
|
] });
|
|
@@ -573,6 +671,7 @@ const AddActionToReleaseModal = ({
|
|
|
573
671
|
contentTypeUid,
|
|
574
672
|
entryId
|
|
575
673
|
}) => {
|
|
674
|
+
const releaseHeaderId = React.useId();
|
|
576
675
|
const { formatMessage } = useIntl();
|
|
577
676
|
const toggleNotification = useNotification();
|
|
578
677
|
const { formatAPIError } = useAPIErrorHandler();
|
|
@@ -620,8 +719,8 @@ const AddActionToReleaseModal = ({
|
|
|
620
719
|
}
|
|
621
720
|
}
|
|
622
721
|
};
|
|
623
|
-
return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy:
|
|
624
|
-
/* @__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({
|
|
625
724
|
id: "content-releases.content-manager-edit-view.add-to-release",
|
|
626
725
|
defaultMessage: "Add to release"
|
|
627
726
|
}) }) }),
|
|
@@ -691,16 +790,18 @@ const AddActionToReleaseModal = ({
|
|
|
691
790
|
};
|
|
692
791
|
const CMReleasesContainer = () => {
|
|
693
792
|
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
694
|
-
const { formatMessage } = useIntl();
|
|
793
|
+
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
695
794
|
const {
|
|
696
795
|
isCreatingEntry,
|
|
697
|
-
|
|
796
|
+
hasDraftAndPublish,
|
|
797
|
+
initialData: { id: entryId },
|
|
798
|
+
slug
|
|
698
799
|
} = useCMEditViewDataManager();
|
|
699
|
-
const
|
|
700
|
-
const canFetch =
|
|
800
|
+
const contentTypeUid = slug;
|
|
801
|
+
const canFetch = entryId != null && contentTypeUid != null;
|
|
701
802
|
const fetchParams = canFetch ? {
|
|
702
|
-
contentTypeUid
|
|
703
|
-
entryId
|
|
803
|
+
contentTypeUid,
|
|
804
|
+
entryId,
|
|
704
805
|
hasEntryAttached: true
|
|
705
806
|
} : skipToken;
|
|
706
807
|
const response = useGetReleasesForEntryQuery(fetchParams);
|
|
@@ -708,7 +809,7 @@ const CMReleasesContainer = () => {
|
|
|
708
809
|
if (!canFetch) {
|
|
709
810
|
return null;
|
|
710
811
|
}
|
|
711
|
-
if (isCreatingEntry || !
|
|
812
|
+
if (isCreatingEntry || !hasDraftAndPublish) {
|
|
712
813
|
return null;
|
|
713
814
|
}
|
|
714
815
|
const toggleModal = () => setIsModalOpen((prev) => !prev);
|
|
@@ -775,15 +876,40 @@ const CMReleasesContainer = () => {
|
|
|
775
876
|
)
|
|
776
877
|
}
|
|
777
878
|
),
|
|
778
|
-
/* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap:
|
|
879
|
+
/* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
779
880
|
/* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
|
|
780
|
-
/* @__PURE__ */ jsx(
|
|
781
|
-
|
|
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
|
+
},
|
|
782
886
|
{
|
|
783
|
-
|
|
784
|
-
|
|
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
|
+
)
|
|
785
901
|
}
|
|
786
|
-
) })
|
|
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
|
+
] }) })
|
|
787
913
|
] })
|
|
788
914
|
]
|
|
789
915
|
},
|
|
@@ -811,18 +937,189 @@ const CMReleasesContainer = () => {
|
|
|
811
937
|
AddActionToReleaseModal,
|
|
812
938
|
{
|
|
813
939
|
handleClose: toggleModal,
|
|
814
|
-
contentTypeUid
|
|
815
|
-
entryId
|
|
940
|
+
contentTypeUid,
|
|
941
|
+
entryId
|
|
816
942
|
}
|
|
817
943
|
)
|
|
818
944
|
]
|
|
819
945
|
}
|
|
820
946
|
) });
|
|
821
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
|
+
};
|
|
822
1119
|
const admin = {
|
|
823
1120
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
824
1121
|
register(app) {
|
|
825
|
-
if (window.strapi.features.isEnabled("cms-content-releases")
|
|
1122
|
+
if (window.strapi.features.isEnabled("cms-content-releases")) {
|
|
826
1123
|
app.addMenuLink({
|
|
827
1124
|
to: `/plugins/${pluginId}`,
|
|
828
1125
|
icon: PaperPlane,
|
|
@@ -831,7 +1128,7 @@ const admin = {
|
|
|
831
1128
|
defaultMessage: "Releases"
|
|
832
1129
|
},
|
|
833
1130
|
async Component() {
|
|
834
|
-
const { App } = await import("./App-
|
|
1131
|
+
const { App } = await import("./App-x6Tjj3HN.mjs");
|
|
835
1132
|
return App;
|
|
836
1133
|
},
|
|
837
1134
|
permissions: PERMISSIONS.main
|
|
@@ -844,12 +1141,31 @@ const admin = {
|
|
|
844
1141
|
name: `${pluginId}-link`,
|
|
845
1142
|
Component: CMReleasesContainer
|
|
846
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
|
+
});
|
|
847
1163
|
}
|
|
848
1164
|
},
|
|
849
1165
|
async registerTrads({ locales }) {
|
|
850
1166
|
const importedTrads = await Promise.all(
|
|
851
1167
|
locales.map((locale) => {
|
|
852
|
-
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 }) => {
|
|
853
1169
|
return {
|
|
854
1170
|
data: prefixPluginTranslations(data, "content-releases"),
|
|
855
1171
|
locale
|
|
@@ -868,17 +1184,20 @@ const admin = {
|
|
|
868
1184
|
export {
|
|
869
1185
|
PERMISSIONS as P,
|
|
870
1186
|
ReleaseActionOptions as R,
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
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,
|
|
879
1195
|
isAxiosError as i,
|
|
880
|
-
|
|
1196
|
+
useUpdateReleaseActionMutation as j,
|
|
1197
|
+
ReleaseActionMenu as k,
|
|
1198
|
+
admin as l,
|
|
881
1199
|
pluginId as p,
|
|
882
|
-
|
|
1200
|
+
releaseApi as r,
|
|
1201
|
+
useGetReleasesQuery as u
|
|
883
1202
|
};
|
|
884
|
-
//# sourceMappingURL=index-
|
|
1203
|
+
//# sourceMappingURL=index-1ejXLtzt.mjs.map
|