@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.
Files changed (110) hide show
  1. package/dist/_chunks/{App-OP70yd5M.js → App-CqbuK4M6.js} +440 -433
  2. package/dist/_chunks/App-CqbuK4M6.js.map +1 -0
  3. package/dist/_chunks/{App-x6Tjj3HN.mjs → App-Do-Rnv0A.mjs} +418 -410
  4. package/dist/_chunks/App-Do-Rnv0A.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-bpHsnU0n.mjs → en-B9Ur3VsE.mjs} +2 -1
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-3SGjiVyR.js → en-DtFJ5ViE.js} +2 -1
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-1ejXLtzt.mjs → index-D_pgdqQL.mjs} +227 -420
  14. package/dist/_chunks/index-D_pgdqQL.mjs.map +1 -0
  15. package/dist/_chunks/{index-ydocdaZ0.js → index-Tedsw4GC.js} +227 -422
  16. package/dist/_chunks/index-Tedsw4GC.js.map +1 -0
  17. package/dist/admin/index.js +1 -15
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +2 -16
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
  22. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  23. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  24. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  25. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  26. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  27. package/dist/admin/src/components/ReleaseModal.d.ts +17 -0
  28. package/dist/admin/src/constants.d.ts +58 -0
  29. package/dist/admin/src/index.d.ts +3 -0
  30. package/dist/admin/src/pages/App.d.ts +1 -0
  31. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  32. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  33. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  34. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  35. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  36. package/dist/admin/src/pluginId.d.ts +1 -0
  37. package/dist/admin/src/services/release.d.ts +105 -0
  38. package/dist/admin/src/store/hooks.d.ts +7 -0
  39. package/dist/admin/src/utils/api.d.ts +6 -0
  40. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  41. package/dist/admin/src/utils/time.d.ts +1 -0
  42. package/dist/server/index.js +152 -93
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +153 -93
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/server/src/bootstrap.d.ts +5 -0
  47. package/dist/server/src/bootstrap.d.ts.map +1 -0
  48. package/dist/server/src/constants.d.ts +12 -0
  49. package/dist/server/src/constants.d.ts.map +1 -0
  50. package/dist/server/src/content-types/index.d.ts +99 -0
  51. package/dist/server/src/content-types/index.d.ts.map +1 -0
  52. package/dist/server/src/content-types/release/index.d.ts +48 -0
  53. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  54. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  55. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  56. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  57. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  58. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  59. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  60. package/dist/server/src/controllers/index.d.ts +20 -0
  61. package/dist/server/src/controllers/index.d.ts.map +1 -0
  62. package/dist/server/src/controllers/release-action.d.ts +10 -0
  63. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  64. package/dist/server/src/controllers/release.d.ts +12 -0
  65. package/dist/server/src/controllers/release.d.ts.map +1 -0
  66. package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
  67. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  68. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  69. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  70. package/dist/server/src/destroy.d.ts +5 -0
  71. package/dist/server/src/destroy.d.ts.map +1 -0
  72. package/dist/server/src/index.d.ts +2096 -0
  73. package/dist/server/src/index.d.ts.map +1 -0
  74. package/dist/server/src/migrations/index.d.ts +13 -0
  75. package/dist/server/src/migrations/index.d.ts.map +1 -0
  76. package/dist/server/src/register.d.ts +5 -0
  77. package/dist/server/src/register.d.ts.map +1 -0
  78. package/dist/server/src/routes/index.d.ts +35 -0
  79. package/dist/server/src/routes/index.d.ts.map +1 -0
  80. package/dist/server/src/routes/release-action.d.ts +18 -0
  81. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  82. package/dist/server/src/routes/release.d.ts +18 -0
  83. package/dist/server/src/routes/release.d.ts.map +1 -0
  84. package/dist/server/src/services/index.d.ts +1826 -0
  85. package/dist/server/src/services/index.d.ts.map +1 -0
  86. package/dist/server/src/services/release.d.ts +66 -0
  87. package/dist/server/src/services/release.d.ts.map +1 -0
  88. package/dist/server/src/services/scheduling.d.ts +18 -0
  89. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  90. package/dist/server/src/services/validation.d.ts +18 -0
  91. package/dist/server/src/services/validation.d.ts.map +1 -0
  92. package/dist/server/src/utils/index.d.ts +14 -0
  93. package/dist/server/src/utils/index.d.ts.map +1 -0
  94. package/dist/shared/contracts/release-actions.d.ts +131 -0
  95. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  96. package/dist/shared/contracts/releases.d.ts +182 -0
  97. package/dist/shared/contracts/releases.d.ts.map +1 -0
  98. package/dist/shared/types.d.ts +24 -0
  99. package/dist/shared/types.d.ts.map +1 -0
  100. package/dist/shared/validation-schemas.d.ts +2 -0
  101. package/dist/shared/validation-schemas.d.ts.map +1 -0
  102. package/package.json +29 -36
  103. package/dist/_chunks/App-OP70yd5M.js.map +0 -1
  104. package/dist/_chunks/App-x6Tjj3HN.mjs.map +0 -1
  105. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
  106. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
  107. package/dist/_chunks/en-3SGjiVyR.js.map +0 -1
  108. package/dist/_chunks/en-bpHsnU0n.mjs.map +0 -1
  109. package/dist/_chunks/index-1ejXLtzt.mjs.map +0 -1
  110. 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 { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
- import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
- import { isAxiosError as isAxiosError$1 } from "axios";
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 { NavLink, Link as Link$1 } from "react-router-dom";
11
+ import { Link, useParams } from "react-router-dom";
12
12
  import * as yup from "yup";
13
- import { createApi } from "@reduxjs/toolkit/query/react";
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 pluginId = "content-releases";
98
- const axiosBaseQuery = async ({
99
- url,
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("getReleaseActions", paramsWithoutActionId, (draft) => {
283
- const [key, index] = actionPath;
284
- const action = draft.data[key][index];
285
- if (action) {
286
- action.type = body.type;
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
- path {
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
- path {
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 (isAxiosError$1(response.error)) {
390
+ if (isFetchError(response.error)) {
418
391
  toggleNotification({
419
- type: "warning",
392
+ type: "danger",
420
393
  message: formatAPIError(response.error)
421
394
  });
422
395
  } else {
423
396
  toggleNotification({
424
- type: "warning",
397
+ type: "danger",
425
398
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
426
399
  });
427
400
  }
428
401
  }
429
402
  };
430
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
431
- /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
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 collectionTypePermissions = useTypedSelector(
445
- (state) => state.rbacProvider.collectionTypesRelatedPermissions
446
- );
447
- const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
448
- const canUpdateEntryForLocale = Boolean(
449
- !locale || updatePermissions?.find(
450
- (permission) => permission.properties?.locales?.includes(locale)
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
- CheckPermissions,
444
+ StyledMenuItem,
455
445
  {
456
- permissions: [
457
- {
458
- action: "plugin::content-manager.explorer.update",
459
- subject: contentTypeUid
460
- }
461
- ],
462
- children: canUpdateEntryForLocale && /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
463
- Link,
464
- {
465
- as: NavLink,
466
- to: {
467
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
468
- search: locale && `?plugins[i18n][locale]=${locale}`
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 /* @__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({
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, hasTriggerBorder = false }) => {
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
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
500
- /* @__PURE__ */ jsx(
501
- Menu.Trigger,
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
- as: hasTriggerBorder ? StyledIconButton : IconButton,
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
- icon: /* @__PURE__ */ jsx(More, {})
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(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
566
+ children: /* @__PURE__ */ jsxs(Field.Label, { children: [
589
567
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
590
- FieldInput,
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
- NoContent,
623
+ EmptyStateLayout,
647
624
  {
648
- content: {
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
- as: Link$1,
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
- handleClose,
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 { modifiedData } = useCMEditViewDataManager();
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
- handleClose();
683
+ onOpenChange();
706
684
  return;
707
685
  }
708
686
  if ("error" in response2) {
709
- if (isAxiosError$1(response2.error)) {
687
+ if (isFetchError(response2.error)) {
710
688
  toggleNotification({
711
- type: "warning",
689
+ type: "danger",
712
690
  message: formatAPIError(response2.error)
713
691
  });
714
692
  } else {
715
693
  toggleNotification({
716
- type: "warning",
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__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
723
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
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(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
736
- /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
737
- SingleSelect,
738
- {
739
- required: true,
740
- label: formatMessage({
741
- id: "content-releases.content-manager-edit-view.add-to-release.select-label",
742
- defaultMessage: "Select a release"
743
- }),
744
- placeholder: formatMessage({
745
- id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
746
- defaultMessage: "Select"
747
- }),
748
- onChange: (value) => setFieldValue("releaseId", value),
749
- value: values.releaseId,
750
- children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
751
- }
752
- ) }),
753
- /* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
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__ */ jsx(
767
- ModalFooter,
768
- {
769
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
770
- id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
771
- defaultMessage: "Cancel"
772
- }) }),
773
- endActions: (
774
- /**
775
- * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
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
- isCreatingEntry,
796
- hasDraftAndPublish,
797
- initialData: { id: entryId },
798
- slug
799
- } = useCMEditViewDataManager();
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 = entryId != null && contentTypeUid != null;
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
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(
796
+ if (!canMain) {
797
+ return null;
798
+ }
799
+ return /* @__PURE__ */ jsxs(
823
800
  Box,
824
801
  {
825
- as: "aside",
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.action.type, "200"),
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.action.type, "100"),
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.action.type, "600"),
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.action.type === "publish" }
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
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
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.action.id
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
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
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
- isModalOpen && /* @__PURE__ */ jsx(
913
+ /* @__PURE__ */ jsx(
937
914
  AddActionToReleaseModal,
938
915
  {
939
- handleClose: toggleModal,
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 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
- };
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: `/plugins/${pluginId}`,
942
+ to: `plugins/${pluginId}`,
1125
943
  icon: PaperPlane,
1126
944
  intlLabel: {
1127
945
  id: `${pluginId}.plugin.name`,
1128
946
  defaultMessage: "Releases"
1129
947
  },
1130
- async Component() {
1131
- const { App } = await import("./App-x6Tjj3HN.mjs");
1132
- return App;
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.addMiddlewares([() => releaseApi.middleware]);
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-3tRbmbY3.mjs");
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-bpHsnU0n.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
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
- useTypedDispatch as f,
1001
+ useGetReleaseActionsQuery as f,
1193
1002
  getTimezoneOffset as g,
1194
- useGetReleaseActionsQuery as h,
1195
- isAxiosError as i,
1196
- useUpdateReleaseActionMutation as j,
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-1ejXLtzt.mjs.map
1010
+ //# sourceMappingURL=index-D_pgdqQL.mjs.map