@strapi/content-releases 0.0.0-experimental.d362bf200f5f9359a4bbd4a549603de5ee1f04ca → 0.0.0-experimental.d5b46d578a5c055b8dcc66939e1b5d540976fafb
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-1LckaIGY.js → App-OP70yd5M.js} +210 -224
- package/dist/_chunks/App-OP70yd5M.js.map +1 -0
- package/dist/_chunks/{App-X01LBg5V.mjs → App-x6Tjj3HN.mjs} +202 -216
- package/dist/_chunks/App-x6Tjj3HN.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-3SGjiVyR.js} +10 -2
- package/dist/_chunks/en-3SGjiVyR.js.map +1 -0
- package/dist/_chunks/{en-RdapH-9X.mjs → en-bpHsnU0n.mjs} +10 -2
- package/dist/_chunks/en-bpHsnU0n.mjs.map +1 -0
- package/dist/_chunks/{index-OD9AlD-6.mjs → index-1ejXLtzt.mjs} +273 -103
- package/dist/_chunks/index-1ejXLtzt.mjs.map +1 -0
- package/dist/_chunks/{index-cYWov2wa.js → index-ydocdaZ0.js} +270 -100
- package/dist/_chunks/index-ydocdaZ0.js.map +1 -0
- package/dist/admin/index.js +15 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +16 -2
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/index.js +62 -60
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +62 -61
- package/dist/server/index.mjs.map +1 -1
- package/package.json +28 -21
- package/dist/_chunks/App-1LckaIGY.js.map +0 -1
- package/dist/_chunks/App-X01LBg5V.mjs.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-OD9AlD-6.mjs.map +0 -1
- package/dist/_chunks/index-cYWov2wa.js.map +0 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
- package/dist/admin/src/components/RelativeTime.d.ts +0 -28
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
- package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
- package/dist/admin/src/constants.d.ts +0 -58
- package/dist/admin/src/index.d.ts +0 -3
- package/dist/admin/src/pages/App.d.ts +0 -1
- package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
- package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
- package/dist/admin/src/pluginId.d.ts +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
- package/dist/admin/src/services/release.d.ts +0 -369
- package/dist/admin/src/store/hooks.d.ts +0 -7
- package/dist/admin/src/utils/prefixPluginTranslations.d.ts +0 -3
- package/dist/admin/src/utils/time.d.ts +0 -1
- package/dist/server/src/bootstrap.d.ts +0 -5
- package/dist/server/src/bootstrap.d.ts.map +0 -1
- package/dist/server/src/constants.d.ts +0 -12
- package/dist/server/src/constants.d.ts.map +0 -1
- package/dist/server/src/content-types/index.d.ts +0 -99
- package/dist/server/src/content-types/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/index.d.ts +0 -48
- package/dist/server/src/content-types/release/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release/schema.d.ts +0 -47
- package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/index.d.ts +0 -50
- package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
- package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
- package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
- package/dist/server/src/controllers/index.d.ts +0 -19
- package/dist/server/src/controllers/index.d.ts.map +0 -1
- package/dist/server/src/controllers/release-action.d.ts +0 -10
- package/dist/server/src/controllers/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/release.d.ts +0 -11
- package/dist/server/src/controllers/release.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release-action.d.ts +0 -8
- package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
- package/dist/server/src/controllers/validation/release.d.ts +0 -2
- package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
- package/dist/server/src/destroy.d.ts +0 -5
- package/dist/server/src/destroy.d.ts.map +0 -1
- package/dist/server/src/index.d.ts +0 -2095
- package/dist/server/src/index.d.ts.map +0 -1
- package/dist/server/src/migrations/index.d.ts +0 -13
- package/dist/server/src/migrations/index.d.ts.map +0 -1
- package/dist/server/src/register.d.ts +0 -5
- package/dist/server/src/register.d.ts.map +0 -1
- package/dist/server/src/routes/index.d.ts +0 -35
- package/dist/server/src/routes/index.d.ts.map +0 -1
- package/dist/server/src/routes/release-action.d.ts +0 -18
- package/dist/server/src/routes/release-action.d.ts.map +0 -1
- package/dist/server/src/routes/release.d.ts +0 -18
- package/dist/server/src/routes/release.d.ts.map +0 -1
- package/dist/server/src/services/index.d.ts +0 -1826
- package/dist/server/src/services/index.d.ts.map +0 -1
- package/dist/server/src/services/release.d.ts +0 -66
- package/dist/server/src/services/release.d.ts.map +0 -1
- package/dist/server/src/services/scheduling.d.ts +0 -18
- package/dist/server/src/services/scheduling.d.ts.map +0 -1
- package/dist/server/src/services/validation.d.ts +0 -18
- package/dist/server/src/services/validation.d.ts.map +0 -1
- package/dist/server/src/utils/index.d.ts +0 -14
- package/dist/server/src/utils/index.d.ts.map +0 -1
- package/dist/shared/contracts/release-actions.d.ts +0 -131
- package/dist/shared/contracts/release-actions.d.ts.map +0 -1
- package/dist/shared/contracts/releases.d.ts +0 -166
- package/dist/shared/contracts/releases.d.ts.map +0 -1
- package/dist/shared/types.d.ts +0 -24
- package/dist/shared/types.d.ts.map +0 -1
- package/dist/shared/validation-schemas.d.ts +0 -2
- package/dist/shared/validation-schemas.d.ts.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
const helperPlugin = require("@strapi/helper-plugin");
|
|
2
3
|
const icons = require("@strapi/icons");
|
|
3
4
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
5
|
const React = require("react");
|
|
5
6
|
const query = require("@reduxjs/toolkit/query");
|
|
6
|
-
const strapiAdmin = require("@strapi/admin/strapi-admin");
|
|
7
7
|
const designSystem = require("@strapi/design-system");
|
|
8
8
|
const v2 = require("@strapi/design-system/v2");
|
|
9
9
|
const axios = require("axios");
|
|
@@ -13,6 +13,7 @@ const reactRouterDom = require("react-router-dom");
|
|
|
13
13
|
const yup = require("yup");
|
|
14
14
|
const react = require("@reduxjs/toolkit/query/react");
|
|
15
15
|
const styled = require("styled-components");
|
|
16
|
+
const reactRedux = require("react-redux");
|
|
16
17
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
17
18
|
function _interopNamespace(e) {
|
|
18
19
|
if (e && e.__esModule)
|
|
@@ -124,7 +125,7 @@ const axiosBaseQuery = async ({
|
|
|
124
125
|
config
|
|
125
126
|
}) => {
|
|
126
127
|
try {
|
|
127
|
-
const { get, post, del, put } =
|
|
128
|
+
const { get, post, del, put } = helperPlugin.getFetchClient();
|
|
128
129
|
if (method === "POST") {
|
|
129
130
|
const result2 = await post(url, data, config);
|
|
130
131
|
return { data: result2.data };
|
|
@@ -273,6 +274,19 @@ const releaseApi = react.createApi({
|
|
|
273
274
|
{ type: "ReleaseAction", id: "LIST" }
|
|
274
275
|
]
|
|
275
276
|
}),
|
|
277
|
+
createManyReleaseActions: build.mutation({
|
|
278
|
+
query({ body, params }) {
|
|
279
|
+
return {
|
|
280
|
+
url: `/content-releases/${params.releaseId}/actions/bulk`,
|
|
281
|
+
method: "POST",
|
|
282
|
+
data: body
|
|
283
|
+
};
|
|
284
|
+
},
|
|
285
|
+
invalidatesTags: [
|
|
286
|
+
{ type: "Release", id: "LIST" },
|
|
287
|
+
{ type: "ReleaseAction", id: "LIST" }
|
|
288
|
+
]
|
|
289
|
+
}),
|
|
276
290
|
updateReleaseAction: build.mutation({
|
|
277
291
|
query({ body, params }) {
|
|
278
292
|
return {
|
|
@@ -344,6 +358,7 @@ const {
|
|
|
344
358
|
useGetReleaseActionsQuery,
|
|
345
359
|
useCreateReleaseMutation,
|
|
346
360
|
useCreateReleaseActionMutation,
|
|
361
|
+
useCreateManyReleaseActionsMutation,
|
|
347
362
|
useUpdateReleaseMutation,
|
|
348
363
|
useUpdateReleaseActionMutation,
|
|
349
364
|
usePublishReleaseMutation,
|
|
@@ -366,6 +381,8 @@ const getTimezoneOffset = (timezone, date) => {
|
|
|
366
381
|
return "";
|
|
367
382
|
}
|
|
368
383
|
};
|
|
384
|
+
const useTypedDispatch = reactRedux.useDispatch;
|
|
385
|
+
const useTypedSelector = reactRedux.useSelector;
|
|
369
386
|
const StyledMenuItem = styled__default.default(v2.Menu.Item)`
|
|
370
387
|
&:hover {
|
|
371
388
|
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
@@ -402,12 +419,9 @@ const StyledIconButton = styled__default.default(designSystem.IconButton)`
|
|
|
402
419
|
`;
|
|
403
420
|
const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
404
421
|
const { formatMessage } = reactIntl.useIntl();
|
|
405
|
-
const
|
|
406
|
-
const { formatAPIError } =
|
|
422
|
+
const toggleNotification = helperPlugin.useNotification();
|
|
423
|
+
const { formatAPIError } = helperPlugin.useAPIErrorHandler();
|
|
407
424
|
const [deleteReleaseAction] = useDeleteReleaseActionMutation();
|
|
408
|
-
const {
|
|
409
|
-
allowedActions: { canDeleteAction }
|
|
410
|
-
} = strapiAdmin.useRBAC(PERMISSIONS);
|
|
411
425
|
const handleDeleteAction = async () => {
|
|
412
426
|
const response = await deleteReleaseAction({
|
|
413
427
|
params: { releaseId, actionId }
|
|
@@ -425,27 +439,24 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
425
439
|
if ("error" in response) {
|
|
426
440
|
if (axios.isAxiosError(response.error)) {
|
|
427
441
|
toggleNotification({
|
|
428
|
-
type: "
|
|
442
|
+
type: "warning",
|
|
429
443
|
message: formatAPIError(response.error)
|
|
430
444
|
});
|
|
431
445
|
} else {
|
|
432
446
|
toggleNotification({
|
|
433
|
-
type: "
|
|
447
|
+
type: "warning",
|
|
434
448
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
435
449
|
});
|
|
436
450
|
}
|
|
437
451
|
}
|
|
438
452
|
};
|
|
439
|
-
|
|
440
|
-
return null;
|
|
441
|
-
}
|
|
442
|
-
return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
|
|
453
|
+
return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
|
|
443
454
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Cross, width: 3, height: 3 }),
|
|
444
455
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
445
456
|
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
446
457
|
defaultMessage: "Remove from release"
|
|
447
458
|
}) })
|
|
448
|
-
] }) });
|
|
459
|
+
] }) }) });
|
|
449
460
|
};
|
|
450
461
|
const ReleaseActionEntryLinkItem = ({
|
|
451
462
|
contentTypeUid,
|
|
@@ -453,44 +464,41 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
453
464
|
locale
|
|
454
465
|
}) => {
|
|
455
466
|
const { formatMessage } = reactIntl.useIntl();
|
|
456
|
-
const
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
allowedActions: { canUpdateContentType }
|
|
468
|
-
} = strapiAdmin.useRBAC({
|
|
469
|
-
updateContentType: [
|
|
470
|
-
{
|
|
471
|
-
action: "plugin::content-manager.explorer.update",
|
|
472
|
-
subject: contentTypeUid
|
|
473
|
-
}
|
|
474
|
-
]
|
|
475
|
-
});
|
|
476
|
-
if (!canUpdateContentType || !canUpdateEntryForLocale) {
|
|
477
|
-
return null;
|
|
478
|
-
}
|
|
479
|
-
return /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
480
|
-
v2.Link,
|
|
467
|
+
const collectionTypePermissions = useTypedSelector(
|
|
468
|
+
(state) => state.rbacProvider.collectionTypesRelatedPermissions
|
|
469
|
+
);
|
|
470
|
+
const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
|
|
471
|
+
const canUpdateEntryForLocale = Boolean(
|
|
472
|
+
!locale || updatePermissions?.find(
|
|
473
|
+
(permission) => permission.properties?.locales?.includes(locale)
|
|
474
|
+
)
|
|
475
|
+
);
|
|
476
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
477
|
+
helperPlugin.CheckPermissions,
|
|
481
478
|
{
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
479
|
+
permissions: [
|
|
480
|
+
{
|
|
481
|
+
action: "plugin::content-manager.explorer.update",
|
|
482
|
+
subject: contentTypeUid
|
|
483
|
+
}
|
|
484
|
+
],
|
|
485
|
+
children: canUpdateEntryForLocale && /* @__PURE__ */ jsxRuntime.jsx(StyledMenuItem, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
486
|
+
v2.Link,
|
|
487
|
+
{
|
|
488
|
+
as: reactRouterDom.NavLink,
|
|
489
|
+
to: {
|
|
490
|
+
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
491
|
+
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
492
|
+
},
|
|
493
|
+
startIcon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: icons.Pencil, width: 3, height: 3 }),
|
|
494
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", children: formatMessage({
|
|
495
|
+
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
496
|
+
defaultMessage: "Edit entry"
|
|
497
|
+
}) })
|
|
498
|
+
}
|
|
499
|
+
) })
|
|
492
500
|
}
|
|
493
|
-
)
|
|
501
|
+
);
|
|
494
502
|
};
|
|
495
503
|
const EditReleaseItem = ({ releaseId }) => {
|
|
496
504
|
const { formatMessage } = reactIntl.useIntl();
|
|
@@ -509,10 +517,9 @@ const EditReleaseItem = ({ releaseId }) => {
|
|
|
509
517
|
};
|
|
510
518
|
const Root = ({ children, hasTriggerBorder = false }) => {
|
|
511
519
|
const { formatMessage } = reactIntl.useIntl();
|
|
512
|
-
const { allowedActions } = strapiAdmin.useRBAC(PERMISSIONS);
|
|
513
520
|
return (
|
|
514
521
|
// A user can access the dropdown if they have permissions to delete a release-action OR update a release
|
|
515
|
-
|
|
522
|
+
/* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
|
|
516
523
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
517
524
|
v2.Menu.Trigger,
|
|
518
525
|
{
|
|
@@ -527,7 +534,7 @@ const Root = ({ children, hasTriggerBorder = false }) => {
|
|
|
527
534
|
}
|
|
528
535
|
),
|
|
529
536
|
/* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
|
|
530
|
-
] })
|
|
537
|
+
] }) })
|
|
531
538
|
);
|
|
532
539
|
};
|
|
533
540
|
const ReleaseActionMenu = {
|
|
@@ -659,13 +666,12 @@ const INITIAL_VALUES = {
|
|
|
659
666
|
const NoReleases = () => {
|
|
660
667
|
const { formatMessage } = reactIntl.useIntl();
|
|
661
668
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
662
|
-
|
|
669
|
+
helperPlugin.NoContent,
|
|
663
670
|
{
|
|
664
|
-
|
|
665
|
-
content: formatMessage({
|
|
671
|
+
content: {
|
|
666
672
|
id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
|
|
667
673
|
defaultMessage: "No available releases. Open the list of releases and create a new one from there."
|
|
668
|
-
}
|
|
674
|
+
},
|
|
669
675
|
action: /* @__PURE__ */ jsxRuntime.jsx(
|
|
670
676
|
v2.LinkButton,
|
|
671
677
|
{
|
|
@@ -690,10 +696,9 @@ const AddActionToReleaseModal = ({
|
|
|
690
696
|
}) => {
|
|
691
697
|
const releaseHeaderId = React__namespace.useId();
|
|
692
698
|
const { formatMessage } = reactIntl.useIntl();
|
|
693
|
-
const
|
|
694
|
-
const { formatAPIError } =
|
|
695
|
-
const
|
|
696
|
-
const locale = query2.plugins?.i18n?.locale;
|
|
699
|
+
const toggleNotification = helperPlugin.useNotification();
|
|
700
|
+
const { formatAPIError } = helperPlugin.useAPIErrorHandler();
|
|
701
|
+
const { modifiedData } = helperPlugin.useCMEditViewDataManager();
|
|
697
702
|
const response = useGetReleasesForEntryQuery({
|
|
698
703
|
contentTypeUid,
|
|
699
704
|
entryId,
|
|
@@ -702,6 +707,7 @@ const AddActionToReleaseModal = ({
|
|
|
702
707
|
const releases = response.data?.data;
|
|
703
708
|
const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
|
|
704
709
|
const handleSubmit = async (values) => {
|
|
710
|
+
const locale = modifiedData.locale;
|
|
705
711
|
const releaseActionEntry = {
|
|
706
712
|
contentType: contentTypeUid,
|
|
707
713
|
id: entryId,
|
|
@@ -725,12 +731,12 @@ const AddActionToReleaseModal = ({
|
|
|
725
731
|
if ("error" in response2) {
|
|
726
732
|
if (axios.isAxiosError(response2.error)) {
|
|
727
733
|
toggleNotification({
|
|
728
|
-
type: "
|
|
734
|
+
type: "warning",
|
|
729
735
|
message: formatAPIError(response2.error)
|
|
730
736
|
});
|
|
731
737
|
} else {
|
|
732
738
|
toggleNotification({
|
|
733
|
-
type: "
|
|
739
|
+
type: "warning",
|
|
734
740
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
735
741
|
});
|
|
736
742
|
}
|
|
@@ -808,21 +814,17 @@ const AddActionToReleaseModal = ({
|
|
|
808
814
|
const CMReleasesContainer = () => {
|
|
809
815
|
const [isModalOpen, setIsModalOpen] = React__namespace.useState(false);
|
|
810
816
|
const { formatMessage, formatDate, formatTime } = reactIntl.useIntl();
|
|
811
|
-
const { id, slug, collectionType } = reactRouterDom.useParams();
|
|
812
|
-
const isCreatingEntry = id === "create";
|
|
813
817
|
const {
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
});
|
|
820
|
-
const hasDraftAndPublish = schema?.options?.draftAndPublish;
|
|
818
|
+
isCreatingEntry,
|
|
819
|
+
hasDraftAndPublish,
|
|
820
|
+
initialData: { id: entryId },
|
|
821
|
+
slug
|
|
822
|
+
} = helperPlugin.useCMEditViewDataManager();
|
|
821
823
|
const contentTypeUid = slug;
|
|
822
|
-
const canFetch =
|
|
824
|
+
const canFetch = entryId != null && contentTypeUid != null;
|
|
823
825
|
const fetchParams = canFetch ? {
|
|
824
826
|
contentTypeUid,
|
|
825
|
-
entryId
|
|
827
|
+
entryId,
|
|
826
828
|
hasEntryAttached: true
|
|
827
829
|
} : query.skipToken;
|
|
828
830
|
const response = useGetReleasesForEntryQuery(fetchParams);
|
|
@@ -840,10 +842,7 @@ const CMReleasesContainer = () => {
|
|
|
840
842
|
}
|
|
841
843
|
return `success${shade}`;
|
|
842
844
|
};
|
|
843
|
-
|
|
844
|
-
return null;
|
|
845
|
-
}
|
|
846
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
845
|
+
return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
847
846
|
designSystem.Box,
|
|
848
847
|
{
|
|
849
848
|
as: "aside",
|
|
@@ -900,7 +899,7 @@ const CMReleasesContainer = () => {
|
|
|
900
899
|
)
|
|
901
900
|
}
|
|
902
901
|
),
|
|
903
|
-
/* @__PURE__ */ jsxRuntime.
|
|
902
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
904
903
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
|
|
905
904
|
release.scheduledAt && release.timezone && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
|
|
906
905
|
{
|
|
@@ -924,7 +923,7 @@ const CMReleasesContainer = () => {
|
|
|
924
923
|
)
|
|
925
924
|
}
|
|
926
925
|
) }),
|
|
927
|
-
|
|
926
|
+
/* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxRuntime.jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
|
|
928
927
|
/* @__PURE__ */ jsxRuntime.jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
|
|
929
928
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
930
929
|
ReleaseActionMenu.DeleteReleaseActionItem,
|
|
@@ -933,14 +932,14 @@ const CMReleasesContainer = () => {
|
|
|
933
932
|
actionId: release.action.id
|
|
934
933
|
}
|
|
935
934
|
)
|
|
936
|
-
] })
|
|
937
|
-
] })
|
|
935
|
+
] }) })
|
|
936
|
+
] })
|
|
938
937
|
]
|
|
939
938
|
},
|
|
940
939
|
release.id
|
|
941
940
|
);
|
|
942
941
|
}),
|
|
943
|
-
|
|
942
|
+
/* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
944
943
|
designSystem.Button,
|
|
945
944
|
{
|
|
946
945
|
justifyContent: "center",
|
|
@@ -955,41 +954,206 @@ const CMReleasesContainer = () => {
|
|
|
955
954
|
defaultMessage: "Add to release"
|
|
956
955
|
})
|
|
957
956
|
}
|
|
958
|
-
)
|
|
957
|
+
) })
|
|
959
958
|
] }),
|
|
960
959
|
isModalOpen && /* @__PURE__ */ jsxRuntime.jsx(
|
|
961
960
|
AddActionToReleaseModal,
|
|
962
961
|
{
|
|
963
962
|
handleClose: toggleModal,
|
|
964
963
|
contentTypeUid,
|
|
965
|
-
entryId
|
|
964
|
+
entryId
|
|
966
965
|
}
|
|
967
966
|
)
|
|
968
967
|
]
|
|
969
968
|
}
|
|
970
|
-
);
|
|
969
|
+
) });
|
|
971
970
|
};
|
|
972
|
-
const
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
971
|
+
const getContentPermissions = (subject) => {
|
|
972
|
+
const permissions = {
|
|
973
|
+
publish: [
|
|
974
|
+
{
|
|
975
|
+
action: "plugin::content-manager.explorer.publish",
|
|
976
|
+
subject,
|
|
977
|
+
id: "",
|
|
978
|
+
actionParameters: {},
|
|
979
|
+
properties: {},
|
|
980
|
+
conditions: []
|
|
981
|
+
}
|
|
982
|
+
]
|
|
983
|
+
};
|
|
984
|
+
return permissions;
|
|
985
|
+
};
|
|
986
|
+
const ReleaseAction = ({ ids, model }) => {
|
|
987
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
988
|
+
const toggleNotification = helperPlugin.useNotification();
|
|
989
|
+
const { formatAPIError } = helperPlugin.useAPIErrorHandler();
|
|
990
|
+
const { modifiedData } = helperPlugin.useCMEditViewDataManager();
|
|
991
|
+
const contentPermissions = getContentPermissions(model);
|
|
992
|
+
const {
|
|
993
|
+
allowedActions: { canPublish }
|
|
994
|
+
} = helperPlugin.useRBAC(contentPermissions);
|
|
995
|
+
const {
|
|
996
|
+
allowedActions: { canCreate }
|
|
997
|
+
} = helperPlugin.useRBAC(PERMISSIONS);
|
|
998
|
+
const response = useGetReleasesQuery();
|
|
999
|
+
const releases = response.data?.data;
|
|
1000
|
+
const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
|
|
1001
|
+
const handleSubmit = async (values) => {
|
|
1002
|
+
const locale = modifiedData.locale;
|
|
1003
|
+
const releaseActionEntries = ids.map((id) => ({
|
|
1004
|
+
type: values.type,
|
|
1005
|
+
entry: {
|
|
1006
|
+
contentType: model,
|
|
1007
|
+
id,
|
|
1008
|
+
locale
|
|
1009
|
+
}
|
|
1010
|
+
}));
|
|
1011
|
+
const response2 = await createManyReleaseActions({
|
|
1012
|
+
body: releaseActionEntries,
|
|
1013
|
+
params: { releaseId: values.releaseId }
|
|
1014
|
+
});
|
|
1015
|
+
if ("data" in response2) {
|
|
1016
|
+
const notificationMessage = formatMessage(
|
|
1017
|
+
{
|
|
1018
|
+
id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
|
|
1019
|
+
defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
|
|
1020
|
+
},
|
|
1021
|
+
{
|
|
1022
|
+
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
|
|
1023
|
+
totalEntries: response2.data.meta.totalEntries
|
|
1024
|
+
}
|
|
1025
|
+
);
|
|
1026
|
+
const notification = {
|
|
1027
|
+
type: "success",
|
|
1028
|
+
title: formatMessage(
|
|
1029
|
+
{
|
|
1030
|
+
id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
|
|
1031
|
+
defaultMessage: "Successfully added to release."
|
|
1032
|
+
},
|
|
1033
|
+
{
|
|
1034
|
+
entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
|
|
1035
|
+
totalEntries: response2.data.meta.totalEntries
|
|
1036
|
+
}
|
|
1037
|
+
),
|
|
1038
|
+
message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
|
|
1039
|
+
};
|
|
1040
|
+
toggleNotification(notification);
|
|
1041
|
+
return true;
|
|
1042
|
+
}
|
|
1043
|
+
if ("error" in response2) {
|
|
1044
|
+
if (axios.isAxiosError(response2.error)) {
|
|
1045
|
+
toggleNotification({
|
|
1046
|
+
type: "warning",
|
|
1047
|
+
message: formatAPIError(response2.error)
|
|
1048
|
+
});
|
|
1049
|
+
} else {
|
|
1050
|
+
toggleNotification({
|
|
1051
|
+
type: "warning",
|
|
1052
|
+
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
1053
|
+
});
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
};
|
|
1057
|
+
if (!canCreate || !canPublish)
|
|
1058
|
+
return null;
|
|
1059
|
+
return {
|
|
1060
|
+
actionType: "release",
|
|
1061
|
+
variant: "tertiary",
|
|
1062
|
+
label: formatMessage({
|
|
1063
|
+
id: "content-manager-list-view.add-to-release",
|
|
1064
|
+
defaultMessage: "Add to Release"
|
|
1065
|
+
}),
|
|
1066
|
+
dialog: {
|
|
1067
|
+
type: "modal",
|
|
1068
|
+
title: formatMessage({
|
|
1069
|
+
id: "content-manager-list-view.add-to-release",
|
|
1070
|
+
defaultMessage: "Add to Release"
|
|
1071
|
+
}),
|
|
1072
|
+
content: ({ onClose }) => {
|
|
1073
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1074
|
+
formik.Formik,
|
|
1075
|
+
{
|
|
1076
|
+
onSubmit: async (values) => {
|
|
1077
|
+
const data = await handleSubmit(values);
|
|
1078
|
+
if (data) {
|
|
1079
|
+
return onClose();
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
validationSchema: RELEASE_ACTION_FORM_SCHEMA,
|
|
1083
|
+
initialValues: INITIAL_VALUES,
|
|
1084
|
+
children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { children: [
|
|
1085
|
+
releases?.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(NoReleases, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalBody, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
1086
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1087
|
+
designSystem.SingleSelect,
|
|
1088
|
+
{
|
|
1089
|
+
required: true,
|
|
1090
|
+
label: formatMessage({
|
|
1091
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-label",
|
|
1092
|
+
defaultMessage: "Select a release"
|
|
1093
|
+
}),
|
|
1094
|
+
placeholder: formatMessage({
|
|
1095
|
+
id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
|
|
1096
|
+
defaultMessage: "Select"
|
|
1097
|
+
}),
|
|
1098
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
1099
|
+
value: values.releaseId,
|
|
1100
|
+
children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
1101
|
+
}
|
|
1102
|
+
) }),
|
|
1103
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.FieldLabel, { children: formatMessage({
|
|
1104
|
+
id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
|
|
1105
|
+
defaultMessage: "What do you want to do with these entries?"
|
|
1106
|
+
}) }),
|
|
1107
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1108
|
+
ReleaseActionOptions,
|
|
1109
|
+
{
|
|
1110
|
+
selected: values.type,
|
|
1111
|
+
handleChange: (e) => setFieldValue("type", e.target.value),
|
|
1112
|
+
name: "type"
|
|
1113
|
+
}
|
|
1114
|
+
)
|
|
1115
|
+
] }) }),
|
|
1116
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1117
|
+
designSystem.ModalFooter,
|
|
1118
|
+
{
|
|
1119
|
+
startActions: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
|
|
1120
|
+
id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
|
|
1121
|
+
defaultMessage: "Cancel"
|
|
1122
|
+
}) }),
|
|
1123
|
+
endActions: (
|
|
1124
|
+
/**
|
|
1125
|
+
* TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
|
|
1126
|
+
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
1127
|
+
*/
|
|
1128
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
1129
|
+
id: "content-releases.content-manager-list-view.add-to-release.continue-button",
|
|
1130
|
+
defaultMessage: "Continue"
|
|
1131
|
+
}) })
|
|
1132
|
+
)
|
|
1133
|
+
}
|
|
1134
|
+
)
|
|
1135
|
+
] })
|
|
1136
|
+
}
|
|
1137
|
+
);
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
};
|
|
980
1141
|
};
|
|
981
1142
|
const admin = {
|
|
982
1143
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
983
1144
|
register(app) {
|
|
984
1145
|
if (window.strapi.features.isEnabled("cms-content-releases")) {
|
|
985
1146
|
app.addMenuLink({
|
|
986
|
-
to:
|
|
1147
|
+
to: `/plugins/${pluginId}`,
|
|
987
1148
|
icon: icons.PaperPlane,
|
|
988
1149
|
intlLabel: {
|
|
989
1150
|
id: `${pluginId}.plugin.name`,
|
|
990
1151
|
defaultMessage: "Releases"
|
|
991
1152
|
},
|
|
992
|
-
Component
|
|
1153
|
+
async Component() {
|
|
1154
|
+
const { App } = await Promise.resolve().then(() => require("./App-OP70yd5M.js"));
|
|
1155
|
+
return App;
|
|
1156
|
+
},
|
|
993
1157
|
permissions: PERMISSIONS.main
|
|
994
1158
|
});
|
|
995
1159
|
app.addMiddlewares([() => releaseApi.middleware]);
|
|
@@ -1000,6 +1164,11 @@ const admin = {
|
|
|
1000
1164
|
name: `${pluginId}-link`,
|
|
1001
1165
|
Component: CMReleasesContainer
|
|
1002
1166
|
});
|
|
1167
|
+
app.plugins["content-manager"].apis.addBulkAction((actions) => {
|
|
1168
|
+
const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
|
|
1169
|
+
actions.splice(deleteActionIndex, 0, ReleaseAction);
|
|
1170
|
+
return actions;
|
|
1171
|
+
});
|
|
1003
1172
|
} else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
|
|
1004
1173
|
app.addMenuLink({
|
|
1005
1174
|
to: `/plugins/purchase-content-releases`,
|
|
@@ -1009,7 +1178,7 @@ const admin = {
|
|
|
1009
1178
|
defaultMessage: "Releases"
|
|
1010
1179
|
},
|
|
1011
1180
|
async Component() {
|
|
1012
|
-
const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-
|
|
1181
|
+
const { PurchaseContentReleases } = await Promise.resolve().then(() => require("./PurchaseContentReleases-bpIYXOfu.js"));
|
|
1013
1182
|
return PurchaseContentReleases;
|
|
1014
1183
|
},
|
|
1015
1184
|
lockIcon: true
|
|
@@ -1019,9 +1188,9 @@ const admin = {
|
|
|
1019
1188
|
async registerTrads({ locales }) {
|
|
1020
1189
|
const importedTrads = await Promise.all(
|
|
1021
1190
|
locales.map((locale) => {
|
|
1022
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-
|
|
1191
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-3SGjiVyR.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
|
|
1023
1192
|
return {
|
|
1024
|
-
data: prefixPluginTranslations(data, "content-releases"),
|
|
1193
|
+
data: helperPlugin.prefixPluginTranslations(data, "content-releases"),
|
|
1025
1194
|
locale
|
|
1026
1195
|
};
|
|
1027
1196
|
}).catch(() => {
|
|
@@ -1049,6 +1218,7 @@ exports.useGetReleaseActionsQuery = useGetReleaseActionsQuery;
|
|
|
1049
1218
|
exports.useGetReleaseQuery = useGetReleaseQuery;
|
|
1050
1219
|
exports.useGetReleasesQuery = useGetReleasesQuery;
|
|
1051
1220
|
exports.usePublishReleaseMutation = usePublishReleaseMutation;
|
|
1221
|
+
exports.useTypedDispatch = useTypedDispatch;
|
|
1052
1222
|
exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
|
|
1053
1223
|
exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
|
|
1054
|
-
//# sourceMappingURL=index-
|
|
1224
|
+
//# sourceMappingURL=index-ydocdaZ0.js.map
|