@strapi/content-releases 0.0.0-experimental.d5b46d578a5c055b8dcc66939e1b5d540976fafb → 0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d
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-OP70yd5M.js → App-CqbuK4M6.js} +440 -433
- package/dist/_chunks/App-CqbuK4M6.js.map +1 -0
- package/dist/_chunks/{App-x6Tjj3HN.mjs → App-Do-Rnv0A.mjs} +418 -410
- package/dist/_chunks/App-Do-Rnv0A.mjs.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/{en-bpHsnU0n.mjs → en-B9Ur3VsE.mjs} +2 -1
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
- package/dist/_chunks/{en-3SGjiVyR.js → en-DtFJ5ViE.js} +2 -1
- package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
- package/dist/_chunks/{index-1ejXLtzt.mjs → index-D_pgdqQL.mjs} +227 -420
- package/dist/_chunks/index-D_pgdqQL.mjs.map +1 -0
- package/dist/_chunks/{index-ydocdaZ0.js → index-Tedsw4GC.js} +227 -422
- package/dist/_chunks/index-Tedsw4GC.js.map +1 -0
- package/dist/admin/index.js +1 -15
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -16
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
- package/dist/admin/src/components/RelativeTime.d.ts +28 -0
- package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
- package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +17 -0
- package/dist/admin/src/constants.d.ts +58 -0
- package/dist/admin/src/index.d.ts +3 -0
- package/dist/admin/src/pages/App.d.ts +1 -0
- package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
- package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
- package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
- package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
- package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
- package/dist/admin/src/pluginId.d.ts +1 -0
- package/dist/admin/src/services/release.d.ts +105 -0
- package/dist/admin/src/store/hooks.d.ts +7 -0
- package/dist/admin/src/utils/api.d.ts +6 -0
- package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
- package/dist/admin/src/utils/time.d.ts +1 -0
- package/dist/server/index.js +152 -93
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +153 -93
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +5 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -0
- package/dist/server/src/constants.d.ts +12 -0
- package/dist/server/src/constants.d.ts.map +1 -0
- package/dist/server/src/content-types/index.d.ts +99 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -0
- package/dist/server/src/content-types/release/index.d.ts +48 -0
- package/dist/server/src/content-types/release/index.d.ts.map +1 -0
- package/dist/server/src/content-types/release/schema.d.ts +47 -0
- package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
- package/dist/server/src/content-types/release-action/index.d.ts +50 -0
- package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
- package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
- package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
- package/dist/server/src/controllers/index.d.ts +20 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -0
- package/dist/server/src/controllers/release-action.d.ts +10 -0
- package/dist/server/src/controllers/release-action.d.ts.map +1 -0
- package/dist/server/src/controllers/release.d.ts +12 -0
- package/dist/server/src/controllers/release.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
- package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/release.d.ts +2 -0
- package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
- package/dist/server/src/destroy.d.ts +5 -0
- package/dist/server/src/destroy.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +2096 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/migrations/index.d.ts +13 -0
- package/dist/server/src/migrations/index.d.ts.map +1 -0
- package/dist/server/src/register.d.ts +5 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/dist/server/src/routes/index.d.ts +35 -0
- package/dist/server/src/routes/index.d.ts.map +1 -0
- package/dist/server/src/routes/release-action.d.ts +18 -0
- package/dist/server/src/routes/release-action.d.ts.map +1 -0
- package/dist/server/src/routes/release.d.ts +18 -0
- package/dist/server/src/routes/release.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +1826 -0
- package/dist/server/src/services/index.d.ts.map +1 -0
- package/dist/server/src/services/release.d.ts +66 -0
- package/dist/server/src/services/release.d.ts.map +1 -0
- package/dist/server/src/services/scheduling.d.ts +18 -0
- package/dist/server/src/services/scheduling.d.ts.map +1 -0
- package/dist/server/src/services/validation.d.ts +18 -0
- package/dist/server/src/services/validation.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +14 -0
- package/dist/server/src/utils/index.d.ts.map +1 -0
- package/dist/shared/contracts/release-actions.d.ts +131 -0
- package/dist/shared/contracts/release-actions.d.ts.map +1 -0
- package/dist/shared/contracts/releases.d.ts +182 -0
- package/dist/shared/contracts/releases.d.ts.map +1 -0
- package/dist/shared/types.d.ts +24 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/validation-schemas.d.ts +2 -0
- package/dist/shared/validation-schemas.d.ts.map +1 -0
- package/package.json +29 -36
- package/dist/_chunks/App-OP70yd5M.js.map +0 -1
- package/dist/_chunks/App-x6Tjj3HN.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
- package/dist/_chunks/en-3SGjiVyR.js.map +0 -1
- package/dist/_chunks/en-bpHsnU0n.mjs.map +0 -1
- package/dist/_chunks/index-1ejXLtzt.mjs.map +0 -1
- package/dist/_chunks/index-ydocdaZ0.js.map +0 -1
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, useRBAC, prefixPluginTranslations } from "@strapi/helper-plugin";
|
|
2
1
|
import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
|
|
3
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
3
|
import * as React from "react";
|
|
5
4
|
import { skipToken } from "@reduxjs/toolkit/query";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { adminApi, useNotification, useAPIErrorHandler, useRBAC, useAuth, isFetchError, useQueryParams } from "@strapi/admin/strapi-admin";
|
|
6
|
+
import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
|
|
7
|
+
import { Menu, Flex, Typography, AccessibleIcon, Field, VisuallyHidden, Box, Button, Modal, SingleSelect, SingleSelectOption, EmptyStateLayout, LinkButton } from "@strapi/design-system";
|
|
8
|
+
import { EmptyDocuments } from "@strapi/icons/symbols";
|
|
9
9
|
import { Formik, Form } from "formik";
|
|
10
10
|
import { useIntl } from "react-intl";
|
|
11
|
-
import {
|
|
11
|
+
import { Link, useParams } from "react-router-dom";
|
|
12
12
|
import * as yup from "yup";
|
|
13
|
-
import {
|
|
14
|
-
import styled from "styled-components";
|
|
15
|
-
import { useDispatch, useSelector } from "react-redux";
|
|
13
|
+
import { styled } from "styled-components";
|
|
16
14
|
const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
|
17
15
|
const v = glob[path];
|
|
18
16
|
if (v) {
|
|
@@ -94,49 +92,9 @@ const PERMISSIONS = {
|
|
|
94
92
|
}
|
|
95
93
|
]
|
|
96
94
|
};
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
method,
|
|
101
|
-
data,
|
|
102
|
-
config
|
|
103
|
-
}) => {
|
|
104
|
-
try {
|
|
105
|
-
const { get, post, del, put } = getFetchClient();
|
|
106
|
-
if (method === "POST") {
|
|
107
|
-
const result2 = await post(url, data, config);
|
|
108
|
-
return { data: result2.data };
|
|
109
|
-
}
|
|
110
|
-
if (method === "DELETE") {
|
|
111
|
-
const result2 = await del(url, config);
|
|
112
|
-
return { data: result2.data };
|
|
113
|
-
}
|
|
114
|
-
if (method === "PUT") {
|
|
115
|
-
const result2 = await put(url, data, config);
|
|
116
|
-
return { data: result2.data };
|
|
117
|
-
}
|
|
118
|
-
const result = await get(url, config);
|
|
119
|
-
return { data: result.data };
|
|
120
|
-
} catch (error) {
|
|
121
|
-
const err = error;
|
|
122
|
-
return {
|
|
123
|
-
error: {
|
|
124
|
-
status: err.response?.status,
|
|
125
|
-
code: err.code,
|
|
126
|
-
response: {
|
|
127
|
-
data: err.response?.data
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
const isAxiosError = (err) => {
|
|
134
|
-
return typeof err === "object" && err !== null && "response" in err && typeof err.response === "object" && err.response !== null && "data" in err.response;
|
|
135
|
-
};
|
|
136
|
-
const releaseApi = createApi({
|
|
137
|
-
reducerPath: pluginId,
|
|
138
|
-
baseQuery: axiosBaseQuery,
|
|
139
|
-
tagTypes: ["Release", "ReleaseAction"],
|
|
95
|
+
const releaseApi = adminApi.enhanceEndpoints({
|
|
96
|
+
addTagTypes: ["Release", "ReleaseAction", "EntriesInRelease"]
|
|
97
|
+
}).injectEndpoints({
|
|
140
98
|
endpoints: (build) => {
|
|
141
99
|
return {
|
|
142
100
|
getReleasesForEntry: build.query({
|
|
@@ -261,7 +219,8 @@ const releaseApi = createApi({
|
|
|
261
219
|
},
|
|
262
220
|
invalidatesTags: [
|
|
263
221
|
{ type: "Release", id: "LIST" },
|
|
264
|
-
{ type: "ReleaseAction", id: "LIST" }
|
|
222
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
223
|
+
{ type: "EntriesInRelease" }
|
|
265
224
|
]
|
|
266
225
|
}),
|
|
267
226
|
updateReleaseAction: build.mutation({
|
|
@@ -279,13 +238,17 @@ const releaseApi = createApi({
|
|
|
279
238
|
...query
|
|
280
239
|
};
|
|
281
240
|
const patchResult = dispatch(
|
|
282
|
-
releaseApi.util.updateQueryData(
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
241
|
+
releaseApi.util.updateQueryData(
|
|
242
|
+
"getReleaseActions",
|
|
243
|
+
paramsWithoutActionId,
|
|
244
|
+
(draft) => {
|
|
245
|
+
const [key, index] = actionPath;
|
|
246
|
+
const action = draft.data[key][index];
|
|
247
|
+
if (action) {
|
|
248
|
+
action.type = body.type;
|
|
249
|
+
}
|
|
287
250
|
}
|
|
288
|
-
|
|
251
|
+
)
|
|
289
252
|
);
|
|
290
253
|
try {
|
|
291
254
|
await queryFulfilled;
|
|
@@ -304,7 +267,8 @@ const releaseApi = createApi({
|
|
|
304
267
|
invalidatesTags: (result, error, arg) => [
|
|
305
268
|
{ type: "Release", id: "LIST" },
|
|
306
269
|
{ type: "Release", id: arg.params.releaseId },
|
|
307
|
-
{ type: "ReleaseAction", id: "LIST" }
|
|
270
|
+
{ type: "ReleaseAction", id: "LIST" },
|
|
271
|
+
{ type: "EntriesInRelease" }
|
|
308
272
|
]
|
|
309
273
|
}),
|
|
310
274
|
publishRelease: build.mutation({
|
|
@@ -323,7 +287,22 @@ const releaseApi = createApi({
|
|
|
323
287
|
method: "DELETE"
|
|
324
288
|
};
|
|
325
289
|
},
|
|
326
|
-
invalidatesTags: () => [{ type: "Release", id: "LIST" }]
|
|
290
|
+
invalidatesTags: () => [{ type: "Release", id: "LIST" }, { type: "EntriesInRelease" }]
|
|
291
|
+
}),
|
|
292
|
+
getMappedEntriesInReleases: build.query({
|
|
293
|
+
query(params) {
|
|
294
|
+
return {
|
|
295
|
+
url: "/content-releases/mapEntriesToReleases",
|
|
296
|
+
method: "GET",
|
|
297
|
+
config: {
|
|
298
|
+
params
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
},
|
|
302
|
+
transformResponse(response) {
|
|
303
|
+
return response.data;
|
|
304
|
+
},
|
|
305
|
+
providesTags: [{ type: "EntriesInRelease" }]
|
|
327
306
|
})
|
|
328
307
|
};
|
|
329
308
|
}
|
|
@@ -340,7 +319,8 @@ const {
|
|
|
340
319
|
useUpdateReleaseActionMutation,
|
|
341
320
|
usePublishReleaseMutation,
|
|
342
321
|
useDeleteReleaseActionMutation,
|
|
343
|
-
useDeleteReleaseMutation
|
|
322
|
+
useDeleteReleaseMutation,
|
|
323
|
+
useGetMappedEntriesInReleasesQuery
|
|
344
324
|
} = releaseApi;
|
|
345
325
|
const getTimezoneOffset = (timezone, date) => {
|
|
346
326
|
try {
|
|
@@ -358,16 +338,12 @@ const getTimezoneOffset = (timezone, date) => {
|
|
|
358
338
|
return "";
|
|
359
339
|
}
|
|
360
340
|
};
|
|
361
|
-
const useTypedDispatch = useDispatch;
|
|
362
|
-
const useTypedSelector = useSelector;
|
|
363
341
|
const StyledMenuItem = styled(Menu.Item)`
|
|
364
342
|
&:hover {
|
|
365
|
-
background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
|
|
343
|
+
background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
|
|
366
344
|
|
|
367
345
|
svg {
|
|
368
|
-
|
|
369
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
370
|
-
}
|
|
346
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
371
347
|
}
|
|
372
348
|
|
|
373
349
|
a {
|
|
@@ -376,9 +352,7 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
376
352
|
}
|
|
377
353
|
|
|
378
354
|
svg {
|
|
379
|
-
|
|
380
|
-
fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
|
|
381
|
-
}
|
|
355
|
+
fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
|
|
382
356
|
}
|
|
383
357
|
|
|
384
358
|
a {
|
|
@@ -390,15 +364,14 @@ const StyledMenuItem = styled(Menu.Item)`
|
|
|
390
364
|
width: 100%;
|
|
391
365
|
}
|
|
392
366
|
`;
|
|
393
|
-
const StyledIconButton = styled(IconButton)`
|
|
394
|
-
/* Setting this style inline with borderColor will not apply the style */
|
|
395
|
-
border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
|
|
396
|
-
`;
|
|
397
367
|
const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
398
368
|
const { formatMessage } = useIntl();
|
|
399
|
-
const toggleNotification = useNotification();
|
|
369
|
+
const { toggleNotification } = useNotification();
|
|
400
370
|
const { formatAPIError } = useAPIErrorHandler();
|
|
401
371
|
const [deleteReleaseAction] = useDeleteReleaseActionMutation();
|
|
372
|
+
const {
|
|
373
|
+
allowedActions: { canDeleteAction }
|
|
374
|
+
} = useRBAC(PERMISSIONS);
|
|
402
375
|
const handleDeleteAction = async () => {
|
|
403
376
|
const response = await deleteReleaseAction({
|
|
404
377
|
params: { releaseId, actionId }
|
|
@@ -414,26 +387,29 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
|
|
|
414
387
|
return;
|
|
415
388
|
}
|
|
416
389
|
if ("error" in response) {
|
|
417
|
-
if (
|
|
390
|
+
if (isFetchError(response.error)) {
|
|
418
391
|
toggleNotification({
|
|
419
|
-
type: "
|
|
392
|
+
type: "danger",
|
|
420
393
|
message: formatAPIError(response.error)
|
|
421
394
|
});
|
|
422
395
|
} else {
|
|
423
396
|
toggleNotification({
|
|
424
|
-
type: "
|
|
397
|
+
type: "danger",
|
|
425
398
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
426
399
|
});
|
|
427
400
|
}
|
|
428
401
|
}
|
|
429
402
|
};
|
|
430
|
-
|
|
431
|
-
|
|
403
|
+
if (!canDeleteAction) {
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
407
|
+
/* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
|
|
432
408
|
/* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
|
|
433
409
|
id: "content-releases.content-manager-edit-view.remove-from-release",
|
|
434
410
|
defaultMessage: "Remove from release"
|
|
435
411
|
}) })
|
|
436
|
-
] }) })
|
|
412
|
+
] }) });
|
|
437
413
|
};
|
|
438
414
|
const ReleaseActionEntryLinkItem = ({
|
|
439
415
|
contentTypeUid,
|
|
@@ -441,77 +417,79 @@ const ReleaseActionEntryLinkItem = ({
|
|
|
441
417
|
locale
|
|
442
418
|
}) => {
|
|
443
419
|
const { formatMessage } = useIntl();
|
|
444
|
-
const
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
!
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
420
|
+
const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
|
|
421
|
+
const canUpdateEntryForLocale = React.useMemo(() => {
|
|
422
|
+
const updatePermissions = userPermissions.find(
|
|
423
|
+
(permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
|
|
424
|
+
);
|
|
425
|
+
if (!updatePermissions) {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
|
|
429
|
+
}, [contentTypeUid, locale, userPermissions]);
|
|
430
|
+
const {
|
|
431
|
+
allowedActions: { canUpdate: canUpdateContentType }
|
|
432
|
+
} = useRBAC({
|
|
433
|
+
updateContentType: [
|
|
434
|
+
{
|
|
435
|
+
action: "plugin::content-manager.explorer.update",
|
|
436
|
+
subject: contentTypeUid
|
|
437
|
+
}
|
|
438
|
+
]
|
|
439
|
+
});
|
|
440
|
+
if (!canUpdateContentType || !canUpdateEntryForLocale) {
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
453
443
|
return /* @__PURE__ */ jsx(
|
|
454
|
-
|
|
444
|
+
StyledMenuItem,
|
|
455
445
|
{
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
children:
|
|
463
|
-
|
|
464
|
-
{
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
},
|
|
470
|
-
startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
|
|
471
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
472
|
-
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
473
|
-
defaultMessage: "Edit entry"
|
|
474
|
-
}) })
|
|
475
|
-
}
|
|
476
|
-
) })
|
|
446
|
+
tag: Link,
|
|
447
|
+
isLink: true,
|
|
448
|
+
to: {
|
|
449
|
+
pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
|
|
450
|
+
search: locale && `?plugins[i18n][locale]=${locale}`
|
|
451
|
+
},
|
|
452
|
+
children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
453
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
454
|
+
/* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
455
|
+
id: "content-releases.content-manager-edit-view.edit-entry",
|
|
456
|
+
defaultMessage: "Edit entry"
|
|
457
|
+
}) })
|
|
458
|
+
] })
|
|
477
459
|
}
|
|
478
460
|
);
|
|
479
461
|
};
|
|
480
462
|
const EditReleaseItem = ({ releaseId }) => {
|
|
481
463
|
const { formatMessage } = useIntl();
|
|
482
|
-
return
|
|
483
|
-
|
|
484
|
-
{
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
isExternal: false,
|
|
488
|
-
children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
464
|
+
return (
|
|
465
|
+
/* @ts-expect-error inference isn't working in DS */
|
|
466
|
+
/* @__PURE__ */ jsx(StyledMenuItem, { tag: Link, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
|
467
|
+
/* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
|
|
468
|
+
/* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
|
|
489
469
|
id: "content-releases.content-manager-edit-view.edit-release",
|
|
490
470
|
defaultMessage: "Edit release"
|
|
491
471
|
}) })
|
|
492
|
-
}
|
|
493
|
-
)
|
|
472
|
+
] }) })
|
|
473
|
+
);
|
|
494
474
|
};
|
|
495
|
-
const Root = ({ children
|
|
475
|
+
const Root = ({ children }) => {
|
|
496
476
|
const { formatMessage } = useIntl();
|
|
477
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
497
478
|
return (
|
|
498
479
|
// A user can access the dropdown if they have permissions to delete a release-action OR update a release
|
|
499
|
-
|
|
500
|
-
/* @__PURE__ */ jsx(
|
|
501
|
-
|
|
480
|
+
allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
|
|
481
|
+
/* @__PURE__ */ jsx(Menu.Trigger, { paddingLeft: 2, paddingRight: 2, children: /* @__PURE__ */ jsx(
|
|
482
|
+
AccessibleIcon,
|
|
502
483
|
{
|
|
503
|
-
|
|
504
|
-
paddingLeft: 2,
|
|
505
|
-
paddingRight: 2,
|
|
506
|
-
"aria-label": formatMessage({
|
|
484
|
+
label: formatMessage({
|
|
507
485
|
id: "content-releases.content-manager-edit-view.release-action-menu",
|
|
508
486
|
defaultMessage: "Release action options"
|
|
509
487
|
}),
|
|
510
|
-
|
|
488
|
+
children: /* @__PURE__ */ jsx(More, {})
|
|
511
489
|
}
|
|
512
|
-
),
|
|
490
|
+
) }),
|
|
513
491
|
/* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
|
|
514
|
-
] })
|
|
492
|
+
] }) : null
|
|
515
493
|
);
|
|
516
494
|
};
|
|
517
495
|
const ReleaseActionMenu = {
|
|
@@ -526,11 +504,11 @@ const getBorderLeftRadiusValue = (actionType) => {
|
|
|
526
504
|
const getBorderRightRadiusValue = (actionType) => {
|
|
527
505
|
return actionType === "publish" ? 0 : 1;
|
|
528
506
|
};
|
|
529
|
-
const FieldWrapper = styled(Field)`
|
|
530
|
-
border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
531
|
-
border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
|
|
532
|
-
border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
533
|
-
border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
|
|
507
|
+
const FieldWrapper = styled(Field.Root)`
|
|
508
|
+
border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
509
|
+
border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
|
|
510
|
+
border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
511
|
+
border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
|
|
534
512
|
|
|
535
513
|
> label {
|
|
536
514
|
color: inherit;
|
|
@@ -541,14 +519,14 @@ const FieldWrapper = styled(Field)`
|
|
|
541
519
|
}
|
|
542
520
|
|
|
543
521
|
&[data-checked='true'] {
|
|
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};
|
|
522
|
+
color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
523
|
+
background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
|
|
524
|
+
border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
|
|
547
525
|
}
|
|
548
526
|
|
|
549
527
|
&[data-checked='false'] {
|
|
550
|
-
border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
|
|
551
|
-
border-right: ${({ actionType }) => actionType === "publish" && "none"};
|
|
528
|
+
border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
|
|
529
|
+
border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
|
|
552
530
|
}
|
|
553
531
|
|
|
554
532
|
&[data-checked='false'][data-disabled='false']:hover {
|
|
@@ -577,7 +555,7 @@ const ActionOption = ({
|
|
|
577
555
|
return /* @__PURE__ */ jsx(
|
|
578
556
|
FieldWrapper,
|
|
579
557
|
{
|
|
580
|
-
actionType,
|
|
558
|
+
$actionType: actionType,
|
|
581
559
|
background: "primary0",
|
|
582
560
|
borderColor: "neutral200",
|
|
583
561
|
color: selected === actionType ? "primary600" : "neutral600",
|
|
@@ -585,12 +563,11 @@ const ActionOption = ({
|
|
|
585
563
|
cursor: "pointer",
|
|
586
564
|
"data-checked": selected === actionType,
|
|
587
565
|
"data-disabled": disabled && selected !== actionType,
|
|
588
|
-
children: /* @__PURE__ */ jsxs(
|
|
566
|
+
children: /* @__PURE__ */ jsxs(Field.Label, { children: [
|
|
589
567
|
/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
|
|
590
|
-
|
|
568
|
+
Field.Input,
|
|
591
569
|
{
|
|
592
570
|
type: "radio",
|
|
593
|
-
id: `${name}-${actionType}`,
|
|
594
571
|
name,
|
|
595
572
|
checked: selected === actionType,
|
|
596
573
|
onChange: handleChange,
|
|
@@ -643,19 +620,20 @@ const INITIAL_VALUES = {
|
|
|
643
620
|
const NoReleases = () => {
|
|
644
621
|
const { formatMessage } = useIntl();
|
|
645
622
|
return /* @__PURE__ */ jsx(
|
|
646
|
-
|
|
623
|
+
EmptyStateLayout,
|
|
647
624
|
{
|
|
648
|
-
|
|
625
|
+
icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
|
|
626
|
+
content: formatMessage({
|
|
649
627
|
id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
|
|
650
628
|
defaultMessage: "No available releases. Open the list of releases and create a new one from there."
|
|
651
|
-
},
|
|
629
|
+
}),
|
|
652
630
|
action: /* @__PURE__ */ jsx(
|
|
653
631
|
LinkButton,
|
|
654
632
|
{
|
|
655
633
|
to: {
|
|
656
634
|
pathname: "/plugins/content-releases"
|
|
657
635
|
},
|
|
658
|
-
|
|
636
|
+
tag: Link,
|
|
659
637
|
variant: "secondary",
|
|
660
638
|
children: formatMessage({
|
|
661
639
|
id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
|
|
@@ -667,15 +645,16 @@ const NoReleases = () => {
|
|
|
667
645
|
);
|
|
668
646
|
};
|
|
669
647
|
const AddActionToReleaseModal = ({
|
|
670
|
-
|
|
648
|
+
open,
|
|
649
|
+
onOpenChange,
|
|
671
650
|
contentTypeUid,
|
|
672
651
|
entryId
|
|
673
652
|
}) => {
|
|
674
|
-
const releaseHeaderId = React.useId();
|
|
675
653
|
const { formatMessage } = useIntl();
|
|
676
|
-
const toggleNotification = useNotification();
|
|
654
|
+
const { toggleNotification } = useNotification();
|
|
677
655
|
const { formatAPIError } = useAPIErrorHandler();
|
|
678
|
-
const {
|
|
656
|
+
const [{ query }] = useQueryParams();
|
|
657
|
+
const locale = query.plugins?.i18n?.locale;
|
|
679
658
|
const response = useGetReleasesForEntryQuery({
|
|
680
659
|
contentTypeUid,
|
|
681
660
|
entryId,
|
|
@@ -684,7 +663,6 @@ const AddActionToReleaseModal = ({
|
|
|
684
663
|
const releases = response.data?.data;
|
|
685
664
|
const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
|
|
686
665
|
const handleSubmit = async (values) => {
|
|
687
|
-
const locale = modifiedData.locale;
|
|
688
666
|
const releaseActionEntry = {
|
|
689
667
|
contentType: contentTypeUid,
|
|
690
668
|
id: entryId,
|
|
@@ -702,25 +680,25 @@ const AddActionToReleaseModal = ({
|
|
|
702
680
|
defaultMessage: "Entry added to release"
|
|
703
681
|
})
|
|
704
682
|
});
|
|
705
|
-
|
|
683
|
+
onOpenChange();
|
|
706
684
|
return;
|
|
707
685
|
}
|
|
708
686
|
if ("error" in response2) {
|
|
709
|
-
if (
|
|
687
|
+
if (isFetchError(response2.error)) {
|
|
710
688
|
toggleNotification({
|
|
711
|
-
type: "
|
|
689
|
+
type: "danger",
|
|
712
690
|
message: formatAPIError(response2.error)
|
|
713
691
|
});
|
|
714
692
|
} else {
|
|
715
693
|
toggleNotification({
|
|
716
|
-
type: "
|
|
694
|
+
type: "danger",
|
|
717
695
|
message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
|
|
718
696
|
});
|
|
719
697
|
}
|
|
720
698
|
}
|
|
721
699
|
};
|
|
722
|
-
return /* @__PURE__ */
|
|
723
|
-
/* @__PURE__ */ jsx(
|
|
700
|
+
return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
|
|
701
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { fontWeight: "bold", children: formatMessage({
|
|
724
702
|
id: "content-releases.content-manager-edit-view.add-to-release",
|
|
725
703
|
defaultMessage: "Add to release"
|
|
726
704
|
}) }) }),
|
|
@@ -732,25 +710,26 @@ const AddActionToReleaseModal = ({
|
|
|
732
710
|
initialValues: INITIAL_VALUES,
|
|
733
711
|
children: ({ values, setFieldValue }) => {
|
|
734
712
|
return /* @__PURE__ */ jsxs(Form, { children: [
|
|
735
|
-
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(
|
|
736
|
-
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
713
|
+
releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
|
714
|
+
/* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
|
|
715
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
716
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-label",
|
|
717
|
+
defaultMessage: "Select a release"
|
|
718
|
+
}) }),
|
|
719
|
+
/* @__PURE__ */ jsx(
|
|
720
|
+
SingleSelect,
|
|
721
|
+
{
|
|
722
|
+
placeholder: formatMessage({
|
|
723
|
+
id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
|
|
724
|
+
defaultMessage: "Select"
|
|
725
|
+
}),
|
|
726
|
+
onChange: (value) => setFieldValue("releaseId", value),
|
|
727
|
+
value: values.releaseId,
|
|
728
|
+
children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
|
|
729
|
+
}
|
|
730
|
+
)
|
|
731
|
+
] }) }),
|
|
732
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
|
754
733
|
id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
|
|
755
734
|
defaultMessage: "What do you want to do with this entry?"
|
|
756
735
|
}) }),
|
|
@@ -763,42 +742,37 @@ const AddActionToReleaseModal = ({
|
|
|
763
742
|
}
|
|
764
743
|
)
|
|
765
744
|
] }) }),
|
|
766
|
-
/* @__PURE__ */
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
* for yup.string().required(), even when the value is falsy (including empty string)
|
|
777
|
-
*/
|
|
778
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
779
|
-
id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
|
|
780
|
-
defaultMessage: "Continue"
|
|
781
|
-
}) })
|
|
782
|
-
)
|
|
783
|
-
}
|
|
784
|
-
)
|
|
745
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
746
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({
|
|
747
|
+
id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
|
|
748
|
+
defaultMessage: "Cancel"
|
|
749
|
+
}) }) }),
|
|
750
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
|
|
751
|
+
id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
|
|
752
|
+
defaultMessage: "Continue"
|
|
753
|
+
}) })
|
|
754
|
+
] })
|
|
785
755
|
] });
|
|
786
756
|
}
|
|
787
757
|
}
|
|
788
758
|
)
|
|
789
|
-
] });
|
|
759
|
+
] }) });
|
|
790
760
|
};
|
|
791
761
|
const CMReleasesContainer = () => {
|
|
792
762
|
const [isModalOpen, setIsModalOpen] = React.useState(false);
|
|
793
763
|
const { formatMessage, formatDate, formatTime } = useIntl();
|
|
794
|
-
const {
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
} =
|
|
764
|
+
const { id, slug, collectionType } = useParams();
|
|
765
|
+
const isCreatingEntry = id === "create";
|
|
766
|
+
const entryId = parseInt(id, 10);
|
|
767
|
+
const { allowedActions } = useRBAC(PERMISSIONS);
|
|
768
|
+
const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
|
|
769
|
+
const { schema } = unstable_useDocument({
|
|
770
|
+
collectionType,
|
|
771
|
+
model: slug
|
|
772
|
+
});
|
|
773
|
+
const hasDraftAndPublish = schema?.options?.draftAndPublish;
|
|
800
774
|
const contentTypeUid = slug;
|
|
801
|
-
const canFetch =
|
|
775
|
+
const canFetch = id != null && contentTypeUid != null;
|
|
802
776
|
const fetchParams = canFetch ? {
|
|
803
777
|
contentTypeUid,
|
|
804
778
|
entryId,
|
|
@@ -819,10 +793,13 @@ const CMReleasesContainer = () => {
|
|
|
819
793
|
}
|
|
820
794
|
return `success${shade}`;
|
|
821
795
|
};
|
|
822
|
-
|
|
796
|
+
if (!canMain) {
|
|
797
|
+
return null;
|
|
798
|
+
}
|
|
799
|
+
return /* @__PURE__ */ jsxs(
|
|
823
800
|
Box,
|
|
824
801
|
{
|
|
825
|
-
|
|
802
|
+
tag: "aside",
|
|
826
803
|
"aria-label": formatMessage({
|
|
827
804
|
id: "content-releases.plugin.name",
|
|
828
805
|
defaultMessage: "Releases"
|
|
@@ -846,7 +823,7 @@ const CMReleasesContainer = () => {
|
|
|
846
823
|
alignItems: "start",
|
|
847
824
|
borderWidth: "1px",
|
|
848
825
|
borderStyle: "solid",
|
|
849
|
-
borderColor: getReleaseColorVariant(release.
|
|
826
|
+
borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
|
|
850
827
|
overflow: "hidden",
|
|
851
828
|
hasRadius: true,
|
|
852
829
|
children: [
|
|
@@ -857,26 +834,26 @@ const CMReleasesContainer = () => {
|
|
|
857
834
|
paddingBottom: 3,
|
|
858
835
|
paddingLeft: 4,
|
|
859
836
|
paddingRight: 4,
|
|
860
|
-
background: getReleaseColorVariant(release.
|
|
837
|
+
background: getReleaseColorVariant(release.actions[0].type, "100"),
|
|
861
838
|
width: "100%",
|
|
862
839
|
children: /* @__PURE__ */ jsx(
|
|
863
840
|
Typography,
|
|
864
841
|
{
|
|
865
842
|
fontSize: 1,
|
|
866
843
|
variant: "pi",
|
|
867
|
-
textColor: getReleaseColorVariant(release.
|
|
844
|
+
textColor: getReleaseColorVariant(release.actions[0].type, "600"),
|
|
868
845
|
children: formatMessage(
|
|
869
846
|
{
|
|
870
847
|
id: "content-releases.content-manager-edit-view.list-releases.title",
|
|
871
848
|
defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
|
|
872
849
|
},
|
|
873
|
-
{ isPublish: release.
|
|
850
|
+
{ isPublish: release.actions[0].type === "publish" }
|
|
874
851
|
)
|
|
875
852
|
}
|
|
876
853
|
)
|
|
877
854
|
}
|
|
878
855
|
),
|
|
879
|
-
/* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
856
|
+
/* @__PURE__ */ jsx(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
|
|
880
857
|
/* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
|
|
881
858
|
release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
|
|
882
859
|
{
|
|
@@ -900,23 +877,23 @@ const CMReleasesContainer = () => {
|
|
|
900
877
|
)
|
|
901
878
|
}
|
|
902
879
|
) }),
|
|
903
|
-
|
|
880
|
+
canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
|
|
904
881
|
/* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
|
|
905
882
|
/* @__PURE__ */ jsx(
|
|
906
883
|
ReleaseActionMenu.DeleteReleaseActionItem,
|
|
907
884
|
{
|
|
908
885
|
releaseId: release.id,
|
|
909
|
-
actionId: release.
|
|
886
|
+
actionId: release.actions[0].id
|
|
910
887
|
}
|
|
911
888
|
)
|
|
912
|
-
] })
|
|
913
|
-
] })
|
|
889
|
+
] }) : null
|
|
890
|
+
] }) })
|
|
914
891
|
]
|
|
915
892
|
},
|
|
916
893
|
release.id
|
|
917
894
|
);
|
|
918
895
|
}),
|
|
919
|
-
|
|
896
|
+
canCreateAction ? /* @__PURE__ */ jsx(
|
|
920
897
|
Button,
|
|
921
898
|
{
|
|
922
899
|
justifyContent: "center",
|
|
@@ -931,221 +908,51 @@ const CMReleasesContainer = () => {
|
|
|
931
908
|
defaultMessage: "Add to release"
|
|
932
909
|
})
|
|
933
910
|
}
|
|
934
|
-
)
|
|
911
|
+
) : null
|
|
935
912
|
] }),
|
|
936
|
-
|
|
913
|
+
/* @__PURE__ */ jsx(
|
|
937
914
|
AddActionToReleaseModal,
|
|
938
915
|
{
|
|
939
|
-
|
|
916
|
+
open: isModalOpen,
|
|
917
|
+
onOpenChange: toggleModal,
|
|
940
918
|
contentTypeUid,
|
|
941
919
|
entryId
|
|
942
920
|
}
|
|
943
921
|
)
|
|
944
922
|
]
|
|
945
923
|
}
|
|
946
|
-
)
|
|
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;
|
|
924
|
+
);
|
|
962
925
|
};
|
|
963
|
-
const
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
}
|
|
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
|
-
};
|
|
926
|
+
const pluginId = "content-releases";
|
|
927
|
+
const prefixPluginTranslations = (trad, pluginId2) => {
|
|
928
|
+
if (!pluginId2) {
|
|
929
|
+
throw new TypeError("pluginId can't be empty");
|
|
930
|
+
}
|
|
931
|
+
return Object.keys(trad).reduce((acc, current) => {
|
|
932
|
+
acc[`${pluginId2}.${current}`] = trad[current];
|
|
933
|
+
return acc;
|
|
934
|
+
}, {});
|
|
1118
935
|
};
|
|
1119
936
|
const admin = {
|
|
1120
937
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1121
938
|
register(app) {
|
|
939
|
+
app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
|
|
1122
940
|
if (window.strapi.features.isEnabled("cms-content-releases")) {
|
|
1123
941
|
app.addMenuLink({
|
|
1124
|
-
to:
|
|
942
|
+
to: `plugins/${pluginId}`,
|
|
1125
943
|
icon: PaperPlane,
|
|
1126
944
|
intlLabel: {
|
|
1127
945
|
id: `${pluginId}.plugin.name`,
|
|
1128
946
|
defaultMessage: "Releases"
|
|
1129
947
|
},
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
},
|
|
1134
|
-
permissions: PERMISSIONS.main
|
|
948
|
+
Component: () => import("./App-Do-Rnv0A.mjs").then((mod) => ({ default: mod.App })),
|
|
949
|
+
permissions: PERMISSIONS.main,
|
|
950
|
+
position: 2
|
|
1135
951
|
});
|
|
1136
|
-
app.
|
|
1137
|
-
app.addReducers({
|
|
1138
|
-
[releaseApi.reducerPath]: releaseApi.reducer
|
|
1139
|
-
});
|
|
1140
|
-
app.injectContentManagerComponent("editView", "right-links", {
|
|
952
|
+
app.getPlugin("content-manager").injectComponent("editView", "right-links", {
|
|
1141
953
|
name: `${pluginId}-link`,
|
|
1142
954
|
Component: CMReleasesContainer
|
|
1143
955
|
});
|
|
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
956
|
} else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
|
|
1150
957
|
app.addMenuLink({
|
|
1151
958
|
to: `/plugins/purchase-content-releases`,
|
|
@@ -1154,18 +961,20 @@ const admin = {
|
|
|
1154
961
|
id: `${pluginId}.plugin.name`,
|
|
1155
962
|
defaultMessage: "Releases"
|
|
1156
963
|
},
|
|
964
|
+
permissions: [],
|
|
1157
965
|
async Component() {
|
|
1158
|
-
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-
|
|
1159
|
-
return PurchaseContentReleases;
|
|
966
|
+
const { PurchaseContentReleases } = await import("./PurchaseContentReleases-_MxP6-Dt.mjs");
|
|
967
|
+
return { default: PurchaseContentReleases };
|
|
1160
968
|
},
|
|
1161
|
-
lockIcon: true
|
|
969
|
+
lockIcon: true,
|
|
970
|
+
position: 2
|
|
1162
971
|
});
|
|
1163
972
|
}
|
|
1164
973
|
},
|
|
1165
974
|
async registerTrads({ locales }) {
|
|
1166
975
|
const importedTrads = await Promise.all(
|
|
1167
976
|
locales.map((locale) => {
|
|
1168
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-
|
|
977
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B9Ur3VsE.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
|
|
1169
978
|
return {
|
|
1170
979
|
data: prefixPluginTranslations(data, "content-releases"),
|
|
1171
980
|
locale
|
|
@@ -1189,15 +998,13 @@ export {
|
|
|
1189
998
|
useUpdateReleaseMutation as c,
|
|
1190
999
|
useDeleteReleaseMutation as d,
|
|
1191
1000
|
usePublishReleaseMutation as e,
|
|
1192
|
-
|
|
1001
|
+
useGetReleaseActionsQuery as f,
|
|
1193
1002
|
getTimezoneOffset as g,
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
ReleaseActionMenu as k,
|
|
1198
|
-
admin as l,
|
|
1003
|
+
useUpdateReleaseActionMutation as h,
|
|
1004
|
+
ReleaseActionMenu as i,
|
|
1005
|
+
admin as j,
|
|
1199
1006
|
pluginId as p,
|
|
1200
1007
|
releaseApi as r,
|
|
1201
1008
|
useGetReleasesQuery as u
|
|
1202
1009
|
};
|
|
1203
|
-
//# sourceMappingURL=index-
|
|
1010
|
+
//# sourceMappingURL=index-D_pgdqQL.mjs.map
|