@strapi/content-releases 0.0.0-experimental.d23c1d5b0e45dd06ef09977f526c85468be05403 → 0.0.0-experimental.d325780feab1caf1b9e4423588eb1cc73b74c376

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 (111) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-Cmn2Mkn7.mjs → App-CiZCkScI.mjs} +651 -436
  3. package/dist/_chunks/App-CiZCkScI.mjs.map +1 -0
  4. package/dist/_chunks/{App-FVorrIzF.js → App-SGjO5UPV.js} +687 -475
  5. package/dist/_chunks/App-SGjO5UPV.js.map +1 -0
  6. package/dist/_chunks/{PurchaseContentReleases-sD6ADHk2.js → PurchaseContentReleases--qQepXpP.js} +8 -7
  7. package/dist/_chunks/PurchaseContentReleases--qQepXpP.js.map +1 -0
  8. package/dist/_chunks/{PurchaseContentReleases-C8djn9fP.mjs → PurchaseContentReleases-D-n-w-st.mjs} +9 -8
  9. package/dist/_chunks/PurchaseContentReleases-D-n-w-st.mjs.map +1 -0
  10. package/dist/_chunks/ReleasesSettingsPage-Cto_NLUd.js +178 -0
  11. package/dist/_chunks/ReleasesSettingsPage-Cto_NLUd.js.map +1 -0
  12. package/dist/_chunks/ReleasesSettingsPage-DQT8N3A-.mjs +178 -0
  13. package/dist/_chunks/ReleasesSettingsPage-DQT8N3A-.mjs.map +1 -0
  14. package/dist/_chunks/{en-DtFJ5ViE.js → en-BWPPsSH-.js} +18 -2
  15. package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
  16. package/dist/_chunks/{en-B9Ur3VsE.mjs → en-D9Q4YW03.mjs} +18 -2
  17. package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
  18. package/dist/_chunks/{index-DDohgTaQ.mjs → index-BjvFfTtA.mjs} +752 -611
  19. package/dist/_chunks/index-BjvFfTtA.mjs.map +1 -0
  20. package/dist/_chunks/{index-BfJLth9Z.js → index-CyU534vL.js} +745 -607
  21. package/dist/_chunks/index-CyU534vL.js.map +1 -0
  22. package/dist/_chunks/schemas-DBYv9gK8.js +61 -0
  23. package/dist/_chunks/schemas-DBYv9gK8.js.map +1 -0
  24. package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
  25. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -1
  27. package/dist/admin/index.mjs +2 -2
  28. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  29. package/dist/admin/src/components/ReleaseAction.d.ts +1 -1
  30. package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
  31. package/dist/admin/src/components/{CMReleasesContainer.d.ts → ReleaseActionModal.d.ts} +3 -1
  32. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  33. package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
  34. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  35. package/dist/admin/src/constants.d.ts +18 -0
  36. package/dist/admin/src/modules/hooks.d.ts +7 -0
  37. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  38. package/dist/admin/src/services/release.d.ts +53 -370
  39. package/dist/admin/src/utils/api.d.ts +6 -0
  40. package/dist/admin/src/utils/time.d.ts +9 -0
  41. package/dist/admin/src/validation/schemas.d.ts +6 -0
  42. package/dist/server/index.js +889 -614
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +889 -613
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/server/src/bootstrap.d.ts.map +1 -1
  47. package/dist/server/src/constants.d.ts +11 -2
  48. package/dist/server/src/constants.d.ts.map +1 -1
  49. package/dist/server/src/content-types/index.d.ts +3 -5
  50. package/dist/server/src/content-types/index.d.ts.map +1 -1
  51. package/dist/server/src/content-types/release-action/index.d.ts +3 -5
  52. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
  53. package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
  54. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
  55. package/dist/server/src/controllers/index.d.ts +6 -1
  56. package/dist/server/src/controllers/index.d.ts.map +1 -1
  57. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  58. package/dist/server/src/controllers/release.d.ts +7 -1
  59. package/dist/server/src/controllers/release.d.ts.map +1 -1
  60. package/dist/server/src/controllers/settings.d.ts +11 -0
  61. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  62. package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
  63. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  64. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  65. package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
  66. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  67. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  68. package/dist/server/src/index.d.ts +64 -49
  69. package/dist/server/src/index.d.ts.map +1 -1
  70. package/dist/server/src/middlewares/documents.d.ts +6 -0
  71. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  72. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  73. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  74. package/dist/server/src/migrations/index.d.ts.map +1 -1
  75. package/dist/server/src/register.d.ts.map +1 -1
  76. package/dist/server/src/routes/index.d.ts +16 -0
  77. package/dist/server/src/routes/index.d.ts.map +1 -1
  78. package/dist/server/src/routes/release.d.ts.map +1 -1
  79. package/dist/server/src/routes/settings.d.ts +18 -0
  80. package/dist/server/src/routes/settings.d.ts.map +1 -0
  81. package/dist/server/src/services/index.d.ts +36 -38
  82. package/dist/server/src/services/index.d.ts.map +1 -1
  83. package/dist/server/src/services/release-action.d.ts +34 -0
  84. package/dist/server/src/services/release-action.d.ts.map +1 -0
  85. package/dist/server/src/services/release.d.ts +6 -41
  86. package/dist/server/src/services/release.d.ts.map +1 -1
  87. package/dist/server/src/services/settings.d.ts +13 -0
  88. package/dist/server/src/services/settings.d.ts.map +1 -0
  89. package/dist/server/src/services/validation.d.ts +1 -1
  90. package/dist/server/src/services/validation.d.ts.map +1 -1
  91. package/dist/server/src/utils/index.d.ts +29 -8
  92. package/dist/server/src/utils/index.d.ts.map +1 -1
  93. package/dist/shared/contracts/release-actions.d.ts +17 -11
  94. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  95. package/dist/shared/contracts/releases.d.ts +9 -7
  96. package/dist/shared/contracts/releases.d.ts.map +1 -1
  97. package/dist/shared/contracts/settings.d.ts +39 -0
  98. package/dist/shared/contracts/settings.d.ts.map +1 -0
  99. package/package.json +24 -24
  100. package/dist/_chunks/App-Cmn2Mkn7.mjs.map +0 -1
  101. package/dist/_chunks/App-FVorrIzF.js.map +0 -1
  102. package/dist/_chunks/PurchaseContentReleases-C8djn9fP.mjs.map +0 -1
  103. package/dist/_chunks/PurchaseContentReleases-sD6ADHk2.js.map +0 -1
  104. package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
  105. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  106. package/dist/_chunks/index-BfJLth9Z.js.map +0 -1
  107. package/dist/_chunks/index-DDohgTaQ.mjs.map +0 -1
  108. package/dist/admin/src/services/axios.d.ts +0 -29
  109. package/dist/shared/validation-schemas.d.ts +0 -2
  110. package/dist/shared/validation-schemas.d.ts.map +0 -1
  111. package/strapi-server.js +0 -3
@@ -1,25 +1,29 @@
1
- import { Cross, Pencil, More, Plus, EmptyDocuments, PaperPlane } from "@strapi/icons";
2
- import { jsx, jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { skipToken } from "@reduxjs/toolkit/query";
5
- import { getFetchClient, useNotification, useAPIErrorHandler, useRBAC, useAuth, useQueryParams } from "@strapi/admin/strapi-admin";
6
- import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, EmptyStateLayout, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
- import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
- import { unstable_useDocument } from "@strapi/plugin-content-manager/strapi-admin";
9
- import { isAxiosError as isAxiosError$1 } from "axios";
10
- import { Formik, Form } from "formik";
1
+ import { PaperPlane, CaretDown, Cross, Pencil, More } from "@strapi/icons";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { adminApi, useRBAC, useNotification, useAPIErrorHandler, useQueryParams, isFetchError, useTable, useAuth } from "@strapi/admin/strapi-admin";
4
+ import { Field, Flex, VisuallyHidden, Modal, Button, EmptyStateLayout, LinkButton, Box, SingleSelect, SingleSelectOption, Popover, Typography, Link as Link$1, Menu, AccessibleIcon } from "@strapi/design-system";
5
+ import { useFormik, Formik, Form } from "formik";
11
6
  import { useIntl } from "react-intl";
12
- import { NavLink, useParams, Link as Link$1 } from "react-router-dom";
7
+ import { unstable_useDocumentLayout } from "@strapi/content-manager/strapi-admin";
8
+ import { EmptyDocuments } from "@strapi/icons/symbols";
9
+ import { Link, NavLink } from "react-router-dom";
13
10
  import * as yup from "yup";
14
- import { createApi } from "@reduxjs/toolkit/query/react";
15
- import styled from "styled-components";
16
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
11
+ import { styled } from "styled-components";
12
+ import * as React from "react";
13
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
17
14
  const v = glob[path];
18
15
  if (v) {
19
16
  return typeof v === "function" ? v() : Promise.resolve(v);
20
17
  }
21
18
  return new Promise((_, reject) => {
22
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
19
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
20
+ reject.bind(
21
+ null,
22
+ new Error(
23
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
24
+ )
25
+ )
26
+ );
23
27
  });
24
28
  };
25
29
  const PERMISSIONS = {
@@ -94,55 +98,70 @@ const PERMISSIONS = {
94
98
  }
95
99
  ]
96
100
  };
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
- };
101
+ const extendInvalidatesTags = (endpoint, extraTags) => {
102
+ if (!endpoint) {
103
+ return;
131
104
  }
105
+ const originalInvalidatesTags = endpoint.invalidatesTags;
106
+ const newInvalidatesTags = (result, err, args, meta) => {
107
+ const originalTags = typeof originalInvalidatesTags === "function" ? originalInvalidatesTags(result, err, args, meta) : originalInvalidatesTags;
108
+ return [...originalTags ?? [], ...extraTags];
109
+ };
110
+ Object.assign(endpoint, { invalidatesTags: newInvalidatesTags });
132
111
  };
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", "EntriesInRelease"],
112
+ const releaseApi = adminApi.enhanceEndpoints({
113
+ addTagTypes: ["Release", "ReleaseAction", "EntriesInRelease", "ReleaseSettings", "Document"],
114
+ endpoints: {
115
+ updateDocument(endpoint) {
116
+ extendInvalidatesTags(endpoint, [
117
+ { type: "Release", id: "LIST" },
118
+ { type: "ReleaseAction", id: "LIST" }
119
+ ]);
120
+ },
121
+ deleteDocument(endpoint) {
122
+ extendInvalidatesTags(endpoint, [
123
+ { type: "Release", id: "LIST" },
124
+ { type: "ReleaseAction", id: "LIST" }
125
+ ]);
126
+ },
127
+ deleteManyDocuments(endpoint) {
128
+ extendInvalidatesTags(endpoint, [
129
+ { type: "Release", id: "LIST" },
130
+ { type: "ReleaseAction", id: "LIST" }
131
+ ]);
132
+ },
133
+ discardDocument(endpoint) {
134
+ extendInvalidatesTags(endpoint, [
135
+ { type: "Release", id: "LIST" },
136
+ { type: "ReleaseAction", id: "LIST" }
137
+ ]);
138
+ },
139
+ createWorkflow(endpoint) {
140
+ extendInvalidatesTags(endpoint, [
141
+ { type: "Release", id: "LIST" },
142
+ { type: "ReleaseAction", id: "LIST" }
143
+ ]);
144
+ },
145
+ updateWorkflow(endpoint) {
146
+ extendInvalidatesTags(endpoint, [
147
+ { type: "Release", id: "LIST" },
148
+ { type: "ReleaseAction", id: "LIST" }
149
+ ]);
150
+ },
151
+ deleteWorkflow(endpoint) {
152
+ extendInvalidatesTags(endpoint, [
153
+ { type: "Release", id: "LIST" },
154
+ { type: "ReleaseAction", id: "LIST" }
155
+ ]);
156
+ }
157
+ }
158
+ }).injectEndpoints({
140
159
  endpoints: (build) => {
141
160
  return {
142
161
  getReleasesForEntry: build.query({
143
162
  query(params) {
144
163
  return {
145
- url: "/content-releases",
164
+ url: "/content-releases/getByDocumentAttached",
146
165
  method: "GET",
147
166
  config: {
148
167
  params
@@ -204,7 +223,10 @@ const releaseApi = createApi({
204
223
  method: "GET"
205
224
  };
206
225
  },
207
- providesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
226
+ providesTags: (result, error, arg) => [
227
+ { type: "Release", id: "LIST" },
228
+ { type: "Release", id: arg.id }
229
+ ]
208
230
  }),
209
231
  getReleaseActions: build.query({
210
232
  query({ releaseId, ...params }) {
@@ -273,20 +295,28 @@ const releaseApi = createApi({
273
295
  data: body
274
296
  };
275
297
  },
276
- invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
298
+ invalidatesTags: (res, error, arg) => [
299
+ { type: "ReleaseAction", id: "LIST" },
300
+ { type: "Release", id: "LIST" },
301
+ { type: "Release", id: arg.params.releaseId }
302
+ ],
277
303
  async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
278
304
  const paramsWithoutActionId = {
279
305
  releaseId: params.releaseId,
280
306
  ...query
281
307
  };
282
308
  const patchResult = dispatch(
283
- releaseApi.util.updateQueryData("getReleaseActions", paramsWithoutActionId, (draft) => {
284
- const [key, index] = actionPath;
285
- const action = draft.data[key][index];
286
- if (action) {
287
- action.type = body.type;
309
+ releaseApi.util.updateQueryData(
310
+ "getReleaseActions",
311
+ paramsWithoutActionId,
312
+ (draft) => {
313
+ const [key, index] = actionPath;
314
+ const action = draft.data[key][index];
315
+ if (action) {
316
+ action.type = body.type;
317
+ }
288
318
  }
289
- })
319
+ )
290
320
  );
291
321
  try {
292
322
  await queryFulfilled;
@@ -316,7 +346,10 @@ const releaseApi = createApi({
316
346
  method: "POST"
317
347
  };
318
348
  },
319
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
349
+ invalidatesTags: (result, error, arg) => [
350
+ { type: "Release", id: arg.id },
351
+ { type: "Document", id: `ALL_LIST` }
352
+ ]
320
353
  }),
321
354
  deleteRelease: build.mutation({
322
355
  query({ id }) {
@@ -341,6 +374,20 @@ const releaseApi = createApi({
341
374
  return response.data;
342
375
  },
343
376
  providesTags: [{ type: "EntriesInRelease" }]
377
+ }),
378
+ getReleaseSettings: build.query({
379
+ query: () => "/content-releases/settings",
380
+ providesTags: [{ type: "ReleaseSettings" }]
381
+ }),
382
+ updateReleaseSettings: build.mutation({
383
+ query(data) {
384
+ return {
385
+ url: "/content-releases/settings",
386
+ method: "PUT",
387
+ data
388
+ };
389
+ },
390
+ invalidatesTags: [{ type: "ReleaseSettings" }]
344
391
  })
345
392
  };
346
393
  }
@@ -358,205 +405,21 @@ const {
358
405
  usePublishReleaseMutation,
359
406
  useDeleteReleaseActionMutation,
360
407
  useDeleteReleaseMutation,
361
- useGetMappedEntriesInReleasesQuery
408
+ useGetMappedEntriesInReleasesQuery,
409
+ useGetReleaseSettingsQuery,
410
+ useUpdateReleaseSettingsMutation
362
411
  } = releaseApi;
363
- const getTimezoneOffset = (timezone, date) => {
364
- try {
365
- const offsetPart = new Intl.DateTimeFormat("en", {
366
- timeZone: timezone,
367
- timeZoneName: "longOffset"
368
- }).formatToParts(date).find((part) => part.type === "timeZoneName");
369
- const offset = offsetPart ? offsetPart.value : "";
370
- let utcOffset = offset.replace("GMT", "UTC");
371
- if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
372
- utcOffset = `${utcOffset}+00:00`;
373
- }
374
- return utcOffset;
375
- } catch (error) {
376
- return "";
377
- }
378
- };
379
- const StyledMenuItem = styled(Menu.Item)`
380
- &:hover {
381
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
382
-
383
- svg {
384
- path {
385
- fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
386
- }
387
- }
388
-
389
- a {
390
- color: ${({ theme }) => theme.colors.neutral800};
391
- }
392
- }
393
-
394
- svg {
395
- path {
396
- fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
397
- }
398
- }
399
-
400
- a {
401
- color: ${({ theme }) => theme.colors.neutral800};
402
- }
403
-
404
- span,
405
- a {
406
- width: 100%;
407
- }
408
- `;
409
- const StyledIconButton = styled(IconButton)`
410
- /* Setting this style inline with borderColor will not apply the style */
411
- border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
412
- `;
413
- const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
414
- const { formatMessage } = useIntl();
415
- const { toggleNotification } = useNotification();
416
- const { formatAPIError } = useAPIErrorHandler();
417
- const [deleteReleaseAction] = useDeleteReleaseActionMutation();
418
- const {
419
- allowedActions: { canDeleteAction }
420
- } = useRBAC(PERMISSIONS);
421
- const handleDeleteAction = async () => {
422
- const response = await deleteReleaseAction({
423
- params: { releaseId, actionId }
424
- });
425
- if ("data" in response) {
426
- toggleNotification({
427
- type: "success",
428
- message: formatMessage({
429
- id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
430
- defaultMessage: "Entry removed from release"
431
- })
432
- });
433
- return;
434
- }
435
- if ("error" in response) {
436
- if (isAxiosError$1(response.error)) {
437
- toggleNotification({
438
- type: "danger",
439
- message: formatAPIError(response.error)
440
- });
441
- } else {
442
- toggleNotification({
443
- type: "danger",
444
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
445
- });
446
- }
447
- }
448
- };
449
- if (!canDeleteAction) {
450
- return null;
451
- }
452
- return /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
453
- /* @__PURE__ */ jsx(Icon, { as: Cross, width: 3, height: 3 }),
454
- /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
455
- id: "content-releases.content-manager-edit-view.remove-from-release",
456
- defaultMessage: "Remove from release"
457
- }) })
458
- ] }) });
459
- };
460
- const ReleaseActionEntryLinkItem = ({
461
- contentTypeUid,
462
- entryId,
463
- locale
464
- }) => {
465
- const { formatMessage } = useIntl();
466
- const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
467
- const canUpdateEntryForLocale = React.useMemo(() => {
468
- const updatePermissions = userPermissions.find(
469
- (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
470
- );
471
- if (!updatePermissions) {
472
- return false;
473
- }
474
- return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
475
- }, [contentTypeUid, locale, userPermissions]);
476
- const {
477
- allowedActions: { canUpdate: canUpdateContentType }
478
- } = useRBAC({
479
- updateContentType: [
480
- {
481
- action: "plugin::content-manager.explorer.update",
482
- subject: contentTypeUid
483
- }
484
- ]
485
- });
486
- if (!canUpdateContentType || !canUpdateEntryForLocale) {
487
- return null;
488
- }
489
- return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
490
- Link,
491
- {
492
- as: NavLink,
493
- to: {
494
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
495
- search: locale && `?plugins[i18n][locale]=${locale}`
496
- },
497
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
498
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
499
- id: "content-releases.content-manager-edit-view.edit-entry",
500
- defaultMessage: "Edit entry"
501
- }) })
502
- }
503
- ) });
504
- };
505
- const EditReleaseItem = ({ releaseId }) => {
506
- const { formatMessage } = useIntl();
507
- return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
508
- Link,
509
- {
510
- href: `/admin/plugins/content-releases/${releaseId}`,
511
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
512
- isExternal: false,
513
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
514
- id: "content-releases.content-manager-edit-view.edit-release",
515
- defaultMessage: "Edit release"
516
- }) })
517
- }
518
- ) });
519
- };
520
- const Root = ({ children, hasTriggerBorder = false }) => {
521
- const { formatMessage } = useIntl();
522
- const { allowedActions } = useRBAC(PERMISSIONS);
523
- return (
524
- // A user can access the dropdown if they have permissions to delete a release-action OR update a release
525
- allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
526
- /* @__PURE__ */ jsx(
527
- Menu.Trigger,
528
- {
529
- as: hasTriggerBorder ? StyledIconButton : IconButton,
530
- paddingLeft: 2,
531
- paddingRight: 2,
532
- "aria-label": formatMessage({
533
- id: "content-releases.content-manager-edit-view.release-action-menu",
534
- defaultMessage: "Release action options"
535
- }),
536
- icon: /* @__PURE__ */ jsx(More, {})
537
- }
538
- ),
539
- /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
540
- ] }) : null
541
- );
542
- };
543
- const ReleaseActionMenu = {
544
- Root,
545
- EditReleaseItem,
546
- DeleteReleaseActionItem,
547
- ReleaseActionEntryLinkItem
548
- };
549
412
  const getBorderLeftRadiusValue = (actionType) => {
550
413
  return actionType === "publish" ? 1 : 0;
551
414
  };
552
415
  const getBorderRightRadiusValue = (actionType) => {
553
416
  return actionType === "publish" ? 0 : 1;
554
417
  };
555
- const FieldWrapper = styled(Field)`
556
- border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
557
- border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
558
- border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
559
- border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
418
+ const FieldWrapper = styled(Field.Root)`
419
+ border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
420
+ border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
421
+ border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
422
+ border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
560
423
 
561
424
  > label {
562
425
  color: inherit;
@@ -567,14 +430,14 @@ const FieldWrapper = styled(Field)`
567
430
  }
568
431
 
569
432
  &[data-checked='true'] {
570
- color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
571
- background-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
572
- border-color: ${({ theme, actionType }) => actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
433
+ color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
434
+ background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
435
+ border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
573
436
  }
574
437
 
575
438
  &[data-checked='false'] {
576
- border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
577
- border-right: ${({ actionType }) => actionType === "publish" && "none"};
439
+ border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
440
+ border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
578
441
  }
579
442
 
580
443
  &[data-checked='false'][data-disabled='false']:hover {
@@ -603,7 +466,7 @@ const ActionOption = ({
603
466
  return /* @__PURE__ */ jsx(
604
467
  FieldWrapper,
605
468
  {
606
- actionType,
469
+ $actionType: actionType,
607
470
  background: "primary0",
608
471
  borderColor: "neutral200",
609
472
  color: selected === actionType ? "primary600" : "neutral600",
@@ -611,12 +474,11 @@ const ActionOption = ({
611
474
  cursor: "pointer",
612
475
  "data-checked": selected === actionType,
613
476
  "data-disabled": disabled && selected !== actionType,
614
- children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
477
+ children: /* @__PURE__ */ jsxs(Field.Label, { children: [
615
478
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
616
- FieldInput,
479
+ Field.Input,
617
480
  {
618
481
  type: "radio",
619
- id: `${name}-${actionType}`,
620
482
  name,
621
483
  checked: selected === actionType,
622
484
  onChange: handleChange,
@@ -671,7 +533,7 @@ const NoReleases = () => {
671
533
  return /* @__PURE__ */ jsx(
672
534
  EmptyStateLayout,
673
535
  {
674
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
536
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
675
537
  content: formatMessage({
676
538
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
677
539
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
@@ -682,301 +544,192 @@ const NoReleases = () => {
682
544
  to: {
683
545
  pathname: "/plugins/content-releases"
684
546
  },
685
- as: Link$1,
547
+ tag: Link,
686
548
  variant: "secondary",
687
549
  children: formatMessage({
688
550
  id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
689
551
  defaultMessage: "Open the list of releases"
690
552
  })
691
553
  }
692
- )
554
+ ),
555
+ shadow: "none"
693
556
  }
694
557
  );
695
558
  };
696
559
  const AddActionToReleaseModal = ({
697
- handleClose,
698
- contentTypeUid,
699
- entryId
560
+ contentType,
561
+ documentId,
562
+ onInputChange,
563
+ values
700
564
  }) => {
701
- const releaseHeaderId = React.useId();
702
565
  const { formatMessage } = useIntl();
703
- const { toggleNotification } = useNotification();
704
- const { formatAPIError } = useAPIErrorHandler();
705
566
  const [{ query }] = useQueryParams();
706
567
  const locale = query.plugins?.i18n?.locale;
707
568
  const response = useGetReleasesForEntryQuery({
708
- contentTypeUid,
709
- entryId,
710
- hasEntryAttached: false
569
+ contentType,
570
+ entryDocumentId: documentId,
571
+ hasEntryAttached: false,
572
+ locale
711
573
  });
712
574
  const releases = response.data?.data;
575
+ if (releases?.length === 0) {
576
+ return /* @__PURE__ */ jsx(NoReleases, {});
577
+ }
578
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
579
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
580
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
581
+ id: "content-releases.content-manager-edit-view.add-to-release.select-label",
582
+ defaultMessage: "Select a release"
583
+ }) }),
584
+ /* @__PURE__ */ jsx(
585
+ SingleSelect,
586
+ {
587
+ required: true,
588
+ placeholder: formatMessage({
589
+ id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
590
+ defaultMessage: "Select"
591
+ }),
592
+ name: "releaseId",
593
+ onChange: (value) => onInputChange("releaseId", value),
594
+ value: values.releaseId,
595
+ children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
596
+ }
597
+ )
598
+ ] }) }),
599
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
600
+ id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
601
+ defaultMessage: "What do you want to do with this entry?"
602
+ }) }),
603
+ /* @__PURE__ */ jsx(
604
+ ReleaseActionOptions,
605
+ {
606
+ selected: values.type,
607
+ handleChange: (e) => onInputChange("type", e.target.value),
608
+ name: "type"
609
+ }
610
+ )
611
+ ] });
612
+ };
613
+ const ReleaseActionModalForm = ({
614
+ documentId,
615
+ document,
616
+ model,
617
+ collectionType
618
+ }) => {
619
+ const { formatMessage } = useIntl();
620
+ const { allowedActions } = useRBAC(PERMISSIONS);
621
+ const { canCreateAction } = allowedActions;
713
622
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
714
- const handleSubmit = async (values) => {
715
- const releaseActionEntry = {
716
- contentType: contentTypeUid,
717
- id: entryId,
718
- locale
719
- };
720
- const response2 = await createReleaseAction({
721
- body: { type: values.type, entry: releaseActionEntry },
722
- params: { releaseId: values.releaseId }
723
- });
724
- if ("data" in response2) {
725
- toggleNotification({
726
- type: "success",
727
- message: formatMessage({
728
- id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
729
- defaultMessage: "Entry added to release"
730
- })
731
- });
732
- handleClose();
733
- return;
734
- }
735
- if ("error" in response2) {
736
- if (isAxiosError$1(response2.error)) {
623
+ const { toggleNotification } = useNotification();
624
+ const { formatAPIError } = useAPIErrorHandler();
625
+ const [{ query }] = useQueryParams();
626
+ const locale = query.plugins?.i18n?.locale;
627
+ const handleSubmit = async (e, onClose) => {
628
+ try {
629
+ await formik.handleSubmit(e);
630
+ onClose();
631
+ } catch (error) {
632
+ if (isFetchError(error)) {
737
633
  toggleNotification({
738
634
  type: "danger",
739
- message: formatAPIError(response2.error)
635
+ message: formatAPIError(error)
740
636
  });
741
637
  } else {
742
638
  toggleNotification({
743
639
  type: "danger",
744
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
640
+ message: formatMessage({
641
+ id: "notification.error",
642
+ defaultMessage: "An error occurred"
643
+ })
745
644
  });
746
645
  }
747
646
  }
748
647
  };
749
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
750
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
648
+ const formik = useFormik({
649
+ initialValues: INITIAL_VALUES,
650
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
651
+ onSubmit: async (values) => {
652
+ if (collectionType === "collection-types" && !documentId) {
653
+ throw new Error("Document id is required");
654
+ }
655
+ const response = await createReleaseAction({
656
+ body: {
657
+ type: values.type,
658
+ contentType: model,
659
+ entryDocumentId: documentId,
660
+ locale
661
+ },
662
+ params: { releaseId: values.releaseId }
663
+ });
664
+ if ("data" in response) {
665
+ toggleNotification({
666
+ type: "success",
667
+ message: formatMessage({
668
+ id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
669
+ defaultMessage: "Entry added to release"
670
+ })
671
+ });
672
+ return;
673
+ }
674
+ if ("error" in response) {
675
+ throw response.error;
676
+ }
677
+ }
678
+ });
679
+ const {
680
+ edit: { options }
681
+ } = unstable_useDocumentLayout(model);
682
+ if (!window.strapi.isEE || !options?.draftAndPublish || !canCreateAction) {
683
+ return null;
684
+ }
685
+ if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
686
+ return null;
687
+ }
688
+ return {
689
+ label: formatMessage({
751
690
  id: "content-releases.content-manager-edit-view.add-to-release",
752
691
  defaultMessage: "Add to release"
753
- }) }) }),
754
- /* @__PURE__ */ jsx(
755
- Formik,
756
- {
757
- onSubmit: handleSubmit,
758
- validationSchema: RELEASE_ACTION_FORM_SCHEMA,
759
- initialValues: INITIAL_VALUES,
760
- children: ({ values, setFieldValue }) => {
761
- return /* @__PURE__ */ jsxs(Form, { children: [
762
- releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
763
- /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
764
- SingleSelect,
765
- {
766
- required: true,
767
- label: formatMessage({
768
- id: "content-releases.content-manager-edit-view.add-to-release.select-label",
769
- defaultMessage: "Select a release"
770
- }),
771
- placeholder: formatMessage({
772
- id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
773
- defaultMessage: "Select"
774
- }),
775
- onChange: (value) => setFieldValue("releaseId", value),
776
- value: values.releaseId,
777
- children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
778
- }
779
- ) }),
780
- /* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
781
- id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
782
- defaultMessage: "What do you want to do with this entry?"
783
- }) }),
784
- /* @__PURE__ */ jsx(
785
- ReleaseActionOptions,
786
- {
787
- selected: values.type,
788
- handleChange: (e) => setFieldValue("type", e.target.value),
789
- name: "type"
790
- }
791
- )
792
- ] }) }),
793
- /* @__PURE__ */ jsx(
794
- ModalFooter,
795
- {
796
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({
797
- id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
798
- defaultMessage: "Cancel"
799
- }) }),
800
- endActions: (
801
- /**
802
- * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
803
- * for yup.string().required(), even when the value is falsy (including empty string)
804
- */
805
- /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
806
- id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
807
- defaultMessage: "Continue"
808
- }) })
809
- )
810
- }
811
- )
812
- ] });
813
- }
814
- }
815
- )
816
- ] });
817
- };
818
- const CMReleasesContainer = () => {
819
- const [isModalOpen, setIsModalOpen] = React.useState(false);
820
- const { formatMessage, formatDate, formatTime } = useIntl();
821
- const { id, slug, collectionType } = useParams();
822
- const isCreatingEntry = id === "create";
823
- const { allowedActions } = useRBAC(PERMISSIONS);
824
- const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
825
- const { schema } = unstable_useDocument({
826
- collectionType,
827
- model: slug
828
- });
829
- const hasDraftAndPublish = schema?.options?.draftAndPublish;
830
- const contentTypeUid = slug;
831
- const canFetch = id != null && contentTypeUid != null;
832
- const fetchParams = canFetch ? {
833
- contentTypeUid,
834
- entryId: id,
835
- hasEntryAttached: true
836
- } : skipToken;
837
- const response = useGetReleasesForEntryQuery(fetchParams);
838
- const releases = response.data?.data;
839
- if (!canFetch) {
840
- return null;
841
- }
842
- if (isCreatingEntry || !hasDraftAndPublish) {
843
- return null;
844
- }
845
- const toggleModal = () => setIsModalOpen((prev) => !prev);
846
- const getReleaseColorVariant = (actionType, shade) => {
847
- if (actionType === "unpublish") {
848
- return `secondary${shade}`;
849
- }
850
- return `success${shade}`;
851
- };
852
- if (!canMain) {
853
- return null;
854
- }
855
- return /* @__PURE__ */ jsxs(
856
- Box,
857
- {
858
- as: "aside",
859
- "aria-label": formatMessage({
860
- id: "content-releases.plugin.name",
861
- defaultMessage: "Releases"
692
+ }),
693
+ icon: /* @__PURE__ */ jsx(PaperPlane, {}),
694
+ // Entry is creating so we don't want to allow adding it to a release
695
+ disabled: !document,
696
+ position: ["panel", "table-row"],
697
+ dialog: {
698
+ type: "modal",
699
+ title: formatMessage({
700
+ id: "content-releases.content-manager-edit-view.add-to-release",
701
+ defaultMessage: "Add to release"
862
702
  }),
863
- background: "neutral0",
864
- borderColor: "neutral150",
865
- hasRadius: true,
866
- padding: 4,
867
- shadow: "tableShadow",
868
- children: [
869
- /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 3, children: [
870
- /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", children: formatMessage({
871
- id: "content-releases.plugin.name",
872
- defaultMessage: "Releases"
873
- }) }),
874
- releases?.map((release) => {
875
- return /* @__PURE__ */ jsxs(
876
- Flex,
877
- {
878
- direction: "column",
879
- alignItems: "start",
880
- borderWidth: "1px",
881
- borderStyle: "solid",
882
- borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
883
- overflow: "hidden",
884
- hasRadius: true,
885
- children: [
886
- /* @__PURE__ */ jsx(
887
- Box,
888
- {
889
- paddingTop: 3,
890
- paddingBottom: 3,
891
- paddingLeft: 4,
892
- paddingRight: 4,
893
- background: getReleaseColorVariant(release.actions[0].type, "100"),
894
- width: "100%",
895
- children: /* @__PURE__ */ jsx(
896
- Typography,
897
- {
898
- fontSize: 1,
899
- variant: "pi",
900
- textColor: getReleaseColorVariant(release.actions[0].type, "600"),
901
- children: formatMessage(
902
- {
903
- id: "content-releases.content-manager-edit-view.list-releases.title",
904
- defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
905
- },
906
- { isPublish: release.actions[0].type === "publish" }
907
- )
908
- }
909
- )
910
- }
911
- ),
912
- /* @__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: [
913
- /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
914
- release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
915
- {
916
- id: "content-releases.content-manager-edit-view.scheduled.date",
917
- defaultMessage: "{date} at {time} ({offset})"
918
- },
919
- {
920
- date: formatDate(new Date(release.scheduledAt), {
921
- day: "2-digit",
922
- month: "2-digit",
923
- year: "numeric",
924
- timeZone: release.timezone
925
- }),
926
- time: formatTime(new Date(release.scheduledAt), {
927
- hourCycle: "h23",
928
- timeZone: release.timezone
929
- }),
930
- offset: getTimezoneOffset(
931
- release.timezone,
932
- new Date(release.scheduledAt)
933
- )
934
- }
935
- ) }),
936
- canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
937
- /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
938
- /* @__PURE__ */ jsx(
939
- ReleaseActionMenu.DeleteReleaseActionItem,
940
- {
941
- releaseId: release.id,
942
- actionId: release.actions[0].id
943
- }
944
- )
945
- ] }) : null
946
- ] }) })
947
- ]
948
- },
949
- release.id
950
- );
951
- }),
952
- canCreateAction ? /* @__PURE__ */ jsx(
953
- Button,
954
- {
955
- justifyContent: "center",
956
- paddingLeft: 4,
957
- paddingRight: 4,
958
- color: "neutral700",
959
- variant: "tertiary",
960
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
961
- onClick: toggleModal,
962
- children: formatMessage({
963
- id: "content-releases.content-manager-edit-view.add-to-release",
964
- defaultMessage: "Add to release"
965
- })
966
- }
967
- ) : null
968
- ] }),
969
- isModalOpen && /* @__PURE__ */ jsx(
970
- AddActionToReleaseModal,
703
+ content: /* @__PURE__ */ jsx(
704
+ AddActionToReleaseModal,
705
+ {
706
+ contentType: model,
707
+ documentId,
708
+ onInputChange: formik.setFieldValue,
709
+ values: formik.values
710
+ }
711
+ ),
712
+ footer: ({ onClose }) => /* @__PURE__ */ jsxs(Modal.Footer, { children: [
713
+ /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
714
+ id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
715
+ defaultMessage: "Cancel"
716
+ }) }),
717
+ /* @__PURE__ */ jsx(
718
+ Button,
971
719
  {
972
- handleClose: toggleModal,
973
- contentTypeUid,
974
- entryId: id
720
+ type: "submit",
721
+ onClick: (e) => handleSubmit(e, onClose),
722
+ disabled: !formik.values.releaseId,
723
+ loading: isLoading,
724
+ children: formatMessage({
725
+ id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
726
+ defaultMessage: "Continue"
727
+ })
975
728
  }
976
729
  )
977
- ]
730
+ ] })
978
731
  }
979
- );
732
+ };
980
733
  };
981
734
  const getContentPermissions = (subject) => {
982
735
  const permissions = {
@@ -993,7 +746,7 @@ const getContentPermissions = (subject) => {
993
746
  };
994
747
  return permissions;
995
748
  };
996
- const ReleaseAction = ({ documentIds, model }) => {
749
+ const ReleaseAction = ({ documents, model }) => {
997
750
  const { formatMessage } = useIntl();
998
751
  const { toggleNotification } = useNotification();
999
752
  const { formatAPIError } = useAPIErrorHandler();
@@ -1008,16 +761,15 @@ const ReleaseAction = ({ documentIds, model }) => {
1008
761
  const response = useGetReleasesQuery();
1009
762
  const releases = response.data?.data;
1010
763
  const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
764
+ const documentIds = documents.map((doc) => doc.documentId);
1011
765
  const handleSubmit = async (values) => {
1012
766
  const locale = query.plugins?.i18n?.locale;
1013
767
  const releaseActionEntries = documentIds.map(
1014
- (id) => ({
768
+ (entryDocumentId) => ({
1015
769
  type: values.type,
1016
- entry: {
1017
- contentType: model,
1018
- id,
1019
- locale
1020
- }
770
+ contentType: model,
771
+ entryDocumentId,
772
+ locale
1021
773
  })
1022
774
  );
1023
775
  const response2 = await createManyReleaseActions({
@@ -1053,7 +805,7 @@ const ReleaseAction = ({ documentIds, model }) => {
1053
805
  return true;
1054
806
  }
1055
807
  if ("error" in response2) {
1056
- if (isAxiosError$1(response2.error)) {
808
+ if (isFetchError(response2.error)) {
1057
809
  toggleNotification({
1058
810
  type: "warning",
1059
811
  message: formatAPIError(response2.error)
@@ -1066,8 +818,7 @@ const ReleaseAction = ({ documentIds, model }) => {
1066
818
  }
1067
819
  }
1068
820
  };
1069
- if (!canCreate || !canPublish)
1070
- return null;
821
+ if (!canCreate || !canPublish) return null;
1071
822
  return {
1072
823
  actionType: "release",
1073
824
  variant: "tertiary",
@@ -1094,25 +845,26 @@ const ReleaseAction = ({ documentIds, model }) => {
1094
845
  validationSchema: RELEASE_ACTION_FORM_SCHEMA,
1095
846
  initialValues: INITIAL_VALUES,
1096
847
  children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
1097
- releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
1098
- /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
1099
- SingleSelect,
1100
- {
1101
- required: true,
1102
- label: formatMessage({
1103
- id: "content-releases.content-manager-list-view.add-to-release.select-label",
1104
- defaultMessage: "Select a release"
1105
- }),
1106
- placeholder: formatMessage({
1107
- id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
1108
- defaultMessage: "Select"
1109
- }),
1110
- onChange: (value) => setFieldValue("releaseId", value),
1111
- value: values.releaseId,
1112
- children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
1113
- }
1114
- ) }),
1115
- /* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
848
+ releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
849
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
850
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
851
+ id: "content-releases.content-manager-list-view.add-to-release.select-label",
852
+ defaultMessage: "Select a release"
853
+ }) }),
854
+ /* @__PURE__ */ jsx(
855
+ SingleSelect,
856
+ {
857
+ placeholder: formatMessage({
858
+ id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
859
+ defaultMessage: "Select"
860
+ }),
861
+ onChange: (value) => setFieldValue("releaseId", value),
862
+ value: values.releaseId,
863
+ children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
864
+ }
865
+ )
866
+ ] }) }),
867
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
1116
868
  id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
1117
869
  defaultMessage: "What do you want to do with these entries?"
1118
870
  }) }),
@@ -1125,25 +877,16 @@ const ReleaseAction = ({ documentIds, model }) => {
1125
877
  }
1126
878
  )
1127
879
  ] }) }),
1128
- /* @__PURE__ */ jsx(
1129
- ModalFooter,
1130
- {
1131
- startActions: /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
1132
- id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
1133
- defaultMessage: "Cancel"
1134
- }) }),
1135
- endActions: (
1136
- /**
1137
- * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true
1138
- * for yup.string().required(), even when the value is falsy (including empty string)
1139
- */
1140
- /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
1141
- id: "content-releases.content-manager-list-view.add-to-release.continue-button",
1142
- defaultMessage: "Continue"
1143
- }) })
1144
- )
1145
- }
1146
- )
880
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
881
+ /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
882
+ id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
883
+ defaultMessage: "Cancel"
884
+ }) }),
885
+ /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
886
+ id: "content-releases.content-manager-list-view.add-to-release.continue-button",
887
+ defaultMessage: "Continue"
888
+ }) })
889
+ ] })
1147
890
  ] })
1148
891
  }
1149
892
  );
@@ -1151,10 +894,386 @@ const ReleaseAction = ({ documentIds, model }) => {
1151
894
  }
1152
895
  };
1153
896
  };
1154
- const prefixPluginTranslations = (trad, pluginId2) => {
1155
- if (!pluginId2) {
1156
- throw new TypeError("pluginId can't be empty");
897
+ const useReleasesList = (contentTypeUid, documentId) => {
898
+ const listViewData = useTable("ListView", (state) => state.rows);
899
+ const documentIds = listViewData.map((entry) => entry.documentId);
900
+ const [{ query }] = useQueryParams();
901
+ const locale = query?.plugins?.i18n?.locale || void 0;
902
+ const response = useGetMappedEntriesInReleasesQuery(
903
+ { contentTypeUid, documentIds, locale },
904
+ { skip: !documentIds || !contentTypeUid || documentIds.length === 0 }
905
+ );
906
+ const mappedEntriesInReleases = response.data || {};
907
+ return mappedEntriesInReleases?.[documentId] || [];
908
+ };
909
+ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
910
+ const { options } = layout;
911
+ if (!options?.draftAndPublish) {
912
+ return { displayedHeaders, layout };
1157
913
  }
914
+ return {
915
+ displayedHeaders: [
916
+ ...displayedHeaders,
917
+ {
918
+ searchable: false,
919
+ sortable: false,
920
+ name: "releases",
921
+ label: {
922
+ id: "content-releases.content-manager.list-view.releases.header",
923
+ defaultMessage: "To be released in"
924
+ },
925
+ cellFormatter: (props, _, { model }) => /* @__PURE__ */ jsx(ReleaseListCell, { ...props, model })
926
+ }
927
+ ],
928
+ layout
929
+ };
930
+ };
931
+ const ReleaseListCell = ({ documentId, model }) => {
932
+ const releases = useReleasesList(model, documentId);
933
+ const { formatMessage } = useIntl();
934
+ return /* @__PURE__ */ jsxs(Popover.Root, { children: [
935
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
936
+ Button,
937
+ {
938
+ variant: "ghost",
939
+ onClick: (e) => e.stopPropagation(),
940
+ endIcon: releases.length > 0 ? /* @__PURE__ */ jsx(CaretDown, { width: "1.2rem", height: "1.2rem" }) : null,
941
+ children: /* @__PURE__ */ jsx(
942
+ Typography,
943
+ {
944
+ style: { maxWidth: "252px", cursor: "pointer" },
945
+ textColor: "neutral800",
946
+ fontWeight: "regular",
947
+ children: releases.length > 0 ? formatMessage(
948
+ {
949
+ id: "content-releases.content-manager.list-view.releases-number",
950
+ defaultMessage: "{number} {number, plural, one {release} other {releases}}"
951
+ },
952
+ {
953
+ number: releases.length
954
+ }
955
+ ) : "-"
956
+ }
957
+ )
958
+ }
959
+ ) }),
960
+ /* @__PURE__ */ jsx(Popover.Content, { children: /* @__PURE__ */ jsx("ul", { children: releases.map(({ id, name }) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Link$1, { href: `/admin/plugins/content-releases/${id}`, isExternal: false, children: name }) }, id)) }) })
961
+ ] });
962
+ };
963
+ const getTimezoneOffset = (timezone, date) => {
964
+ try {
965
+ const offsetPart = new Intl.DateTimeFormat("en", {
966
+ timeZone: timezone,
967
+ timeZoneName: "longOffset"
968
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
969
+ const offset = offsetPart ? offsetPart.value : "";
970
+ let utcOffset = offset.replace("GMT", "UTC");
971
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
972
+ utcOffset = `${utcOffset}+00:00`;
973
+ }
974
+ return utcOffset;
975
+ } catch (error) {
976
+ return "";
977
+ }
978
+ };
979
+ const getTimezones = (selectedDate) => {
980
+ const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
981
+ const utcOffset = getTimezoneOffset(timezone, selectedDate);
982
+ return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
983
+ });
984
+ const systemTimezone = timezoneList.find(
985
+ (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
986
+ );
987
+ return { timezoneList, systemTimezone };
988
+ };
989
+ const StyledMenuItem = styled(Menu.Item)`
990
+ &:hover {
991
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
992
+
993
+ svg {
994
+ fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
995
+ }
996
+
997
+ a {
998
+ color: ${({ theme }) => theme.colors.neutral800};
999
+ }
1000
+ }
1001
+
1002
+ svg {
1003
+ color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}500`]};
1004
+ }
1005
+
1006
+ span {
1007
+ color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}800`]};
1008
+ }
1009
+
1010
+ span,
1011
+ a {
1012
+ width: 100%;
1013
+ }
1014
+ `;
1015
+ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
1016
+ const { formatMessage } = useIntl();
1017
+ const { toggleNotification } = useNotification();
1018
+ const { formatAPIError } = useAPIErrorHandler();
1019
+ const [deleteReleaseAction] = useDeleteReleaseActionMutation();
1020
+ const {
1021
+ allowedActions: { canDeleteAction }
1022
+ } = useRBAC(PERMISSIONS);
1023
+ const handleDeleteAction = async () => {
1024
+ const response = await deleteReleaseAction({
1025
+ params: { releaseId, actionId }
1026
+ });
1027
+ if ("data" in response) {
1028
+ toggleNotification({
1029
+ type: "success",
1030
+ message: formatMessage({
1031
+ id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
1032
+ defaultMessage: "Entry removed from release"
1033
+ })
1034
+ });
1035
+ return;
1036
+ }
1037
+ if ("error" in response) {
1038
+ if (isFetchError(response.error)) {
1039
+ toggleNotification({
1040
+ type: "danger",
1041
+ message: formatAPIError(response.error)
1042
+ });
1043
+ } else {
1044
+ toggleNotification({
1045
+ type: "danger",
1046
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1047
+ });
1048
+ }
1049
+ }
1050
+ };
1051
+ if (!canDeleteAction) {
1052
+ return null;
1053
+ }
1054
+ return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
1055
+ /* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
1056
+ /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
1057
+ id: "content-releases.content-manager-edit-view.remove-from-release",
1058
+ defaultMessage: "Remove from release"
1059
+ }) })
1060
+ ] }) });
1061
+ };
1062
+ const ReleaseActionEntryLinkItem = ({
1063
+ contentTypeUid,
1064
+ documentId,
1065
+ locale
1066
+ }) => {
1067
+ const { formatMessage } = useIntl();
1068
+ const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
1069
+ const canUpdateEntryForLocale = React.useMemo(() => {
1070
+ const updatePermissions = userPermissions.find(
1071
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
1072
+ );
1073
+ if (!updatePermissions) {
1074
+ return false;
1075
+ }
1076
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
1077
+ }, [contentTypeUid, locale, userPermissions]);
1078
+ const {
1079
+ allowedActions: { canUpdate: canUpdateContentType }
1080
+ } = useRBAC({
1081
+ updateContentType: [
1082
+ {
1083
+ action: "plugin::content-manager.explorer.update",
1084
+ subject: contentTypeUid
1085
+ }
1086
+ ]
1087
+ });
1088
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
1089
+ return null;
1090
+ }
1091
+ return /* @__PURE__ */ jsx(
1092
+ StyledMenuItem,
1093
+ {
1094
+ tag: NavLink,
1095
+ isLink: true,
1096
+ to: {
1097
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${documentId}`,
1098
+ search: locale && `?plugins[i18n][locale]=${locale}`
1099
+ },
1100
+ children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
1101
+ /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
1102
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
1103
+ id: "content-releases.content-manager-edit-view.edit-entry",
1104
+ defaultMessage: "Edit entry"
1105
+ }) })
1106
+ ] })
1107
+ }
1108
+ );
1109
+ };
1110
+ const EditReleaseItem = ({ releaseId }) => {
1111
+ const { formatMessage } = useIntl();
1112
+ return (
1113
+ /* @ts-expect-error inference isn't working in DS */
1114
+ /* @__PURE__ */ jsx(StyledMenuItem, { tag: NavLink, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
1115
+ /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
1116
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", variant: "omega", children: formatMessage({
1117
+ id: "content-releases.content-manager-edit-view.edit-release",
1118
+ defaultMessage: "Edit release"
1119
+ }) })
1120
+ ] }) })
1121
+ );
1122
+ };
1123
+ const Root = ({ children }) => {
1124
+ const { formatMessage } = useIntl();
1125
+ const { allowedActions } = useRBAC(PERMISSIONS);
1126
+ return (
1127
+ // A user can access the dropdown if they have permissions to delete a release-action OR update a release
1128
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
1129
+ /* @__PURE__ */ jsx(StyledMoreButton, { variant: "tertiary", endIcon: null, paddingLeft: "7px", paddingRight: "7px", children: /* @__PURE__ */ jsx(
1130
+ AccessibleIcon,
1131
+ {
1132
+ label: formatMessage({
1133
+ id: "content-releases.content-manager-edit-view.release-action-menu",
1134
+ defaultMessage: "Release action options"
1135
+ }),
1136
+ children: /* @__PURE__ */ jsx(More, {})
1137
+ }
1138
+ ) }),
1139
+ /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
1140
+ ] }) : null
1141
+ );
1142
+ };
1143
+ const StyledMoreButton = styled(Menu.Trigger)`
1144
+ & > span {
1145
+ display: flex;
1146
+ }
1147
+ `;
1148
+ const ReleaseActionMenu = {
1149
+ Root,
1150
+ EditReleaseItem,
1151
+ DeleteReleaseActionItem,
1152
+ ReleaseActionEntryLinkItem
1153
+ };
1154
+ const Panel = ({
1155
+ model,
1156
+ document,
1157
+ documentId,
1158
+ collectionType
1159
+ }) => {
1160
+ const [{ query }] = useQueryParams();
1161
+ const locale = query.plugins?.i18n?.locale;
1162
+ const {
1163
+ edit: { options }
1164
+ } = unstable_useDocumentLayout(model);
1165
+ const { formatMessage, formatDate, formatTime } = useIntl();
1166
+ const { allowedActions } = useRBAC(PERMISSIONS);
1167
+ const { canRead, canDeleteAction } = allowedActions;
1168
+ const response = useGetReleasesForEntryQuery(
1169
+ {
1170
+ contentType: model,
1171
+ entryDocumentId: documentId,
1172
+ locale,
1173
+ hasEntryAttached: true
1174
+ },
1175
+ {
1176
+ skip: !document
1177
+ }
1178
+ );
1179
+ const releases = response.data?.data;
1180
+ const getReleaseColorVariant = (actionType, shade) => {
1181
+ if (actionType === "unpublish") {
1182
+ return `secondary${shade}`;
1183
+ }
1184
+ return `success${shade}`;
1185
+ };
1186
+ if (!window.strapi.isEE || !options?.draftAndPublish || !canRead) {
1187
+ return null;
1188
+ }
1189
+ if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
1190
+ return null;
1191
+ }
1192
+ if (!releases || releases.length === 0) {
1193
+ return null;
1194
+ }
1195
+ return {
1196
+ title: formatMessage({
1197
+ id: "content-releases.plugin.name",
1198
+ defaultMessage: "Releases"
1199
+ }),
1200
+ content: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 3, width: "100%", children: releases?.map((release) => /* @__PURE__ */ jsxs(
1201
+ Flex,
1202
+ {
1203
+ direction: "column",
1204
+ alignItems: "start",
1205
+ borderWidth: "1px",
1206
+ borderStyle: "solid",
1207
+ borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
1208
+ overflow: "hidden",
1209
+ hasRadius: true,
1210
+ children: [
1211
+ /* @__PURE__ */ jsx(
1212
+ Box,
1213
+ {
1214
+ paddingTop: 3,
1215
+ paddingBottom: 3,
1216
+ paddingLeft: 4,
1217
+ paddingRight: 4,
1218
+ background: getReleaseColorVariant(release.actions[0].type, "100"),
1219
+ width: "100%",
1220
+ children: /* @__PURE__ */ jsx(
1221
+ Typography,
1222
+ {
1223
+ fontSize: 1,
1224
+ variant: "pi",
1225
+ textColor: getReleaseColorVariant(release.actions[0].type, "600"),
1226
+ children: formatMessage(
1227
+ {
1228
+ id: "content-releases.content-manager-edit-view.list-releases.title",
1229
+ defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
1230
+ },
1231
+ { isPublish: release.actions[0].type === "publish" }
1232
+ )
1233
+ }
1234
+ )
1235
+ }
1236
+ ),
1237
+ /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
1238
+ /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
1239
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
1240
+ {
1241
+ id: "content-releases.content-manager-edit-view.scheduled.date",
1242
+ defaultMessage: "{date} at {time} ({offset})"
1243
+ },
1244
+ {
1245
+ date: formatDate(new Date(release.scheduledAt), {
1246
+ day: "2-digit",
1247
+ month: "2-digit",
1248
+ year: "numeric",
1249
+ timeZone: release.timezone
1250
+ }),
1251
+ time: formatTime(new Date(release.scheduledAt), {
1252
+ hourCycle: "h23",
1253
+ timeZone: release.timezone
1254
+ }),
1255
+ offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
1256
+ }
1257
+ ) }),
1258
+ canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
1259
+ /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
1260
+ /* @__PURE__ */ jsx(
1261
+ ReleaseActionMenu.DeleteReleaseActionItem,
1262
+ {
1263
+ releaseId: release.id,
1264
+ actionId: release.actions[0].id
1265
+ }
1266
+ )
1267
+ ] }) : null
1268
+ ] })
1269
+ ]
1270
+ },
1271
+ release.id
1272
+ )) })
1273
+ };
1274
+ };
1275
+ const pluginId = "content-releases";
1276
+ const prefixPluginTranslations = (trad, pluginId2) => {
1158
1277
  return Object.keys(trad).reduce((acc, current) => {
1159
1278
  acc[`${pluginId2}.${current}`] = trad[current];
1160
1279
  return acc;
@@ -1172,43 +1291,63 @@ const admin = {
1172
1291
  id: `${pluginId}.plugin.name`,
1173
1292
  defaultMessage: "Releases"
1174
1293
  },
1175
- Component: () => import("./App-Cmn2Mkn7.mjs").then((mod) => ({ default: mod.App })),
1176
- permissions: PERMISSIONS.main
1177
- });
1178
- app.addMiddlewares([() => releaseApi.middleware]);
1179
- app.addReducers({
1180
- [releaseApi.reducerPath]: releaseApi.reducer
1181
- });
1182
- app.getPlugin("content-manager").injectComponent("editView", "right-links", {
1183
- name: `${pluginId}-link`,
1184
- Component: CMReleasesContainer
1294
+ Component: () => import("./App-CiZCkScI.mjs").then((mod) => ({ default: mod.App })),
1295
+ permissions: PERMISSIONS.main,
1296
+ position: 2
1185
1297
  });
1186
- app.plugins["content-manager"].apis.addBulkAction((actions) => {
1187
- const deleteActionIndex = actions.findIndex((action) => action.name === "DeleteAction");
1188
- actions.splice(deleteActionIndex, 0, ReleaseAction);
1189
- return actions;
1298
+ const contentManagerPluginApis = app.getPlugin("content-manager").apis;
1299
+ if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
1300
+ contentManagerPluginApis.addEditViewSidePanel([Panel]);
1301
+ }
1302
+ if ("addDocumentAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addDocumentAction === "function") {
1303
+ contentManagerPluginApis.addDocumentAction((actions) => {
1304
+ const indexOfDeleteAction = actions.findIndex((action) => action.type === "unpublish");
1305
+ actions.splice(indexOfDeleteAction, 0, ReleaseActionModalForm);
1306
+ return actions;
1307
+ });
1308
+ }
1309
+ app.addSettingsLink("global", {
1310
+ id: pluginId,
1311
+ to: "releases",
1312
+ intlLabel: {
1313
+ id: `${pluginId}.plugin.name`,
1314
+ defaultMessage: "Releases"
1315
+ },
1316
+ permissions: [],
1317
+ async Component() {
1318
+ const { ProtectedReleasesSettingsPage } = await import("./ReleasesSettingsPage-DQT8N3A-.mjs");
1319
+ return { default: ProtectedReleasesSettingsPage };
1320
+ }
1190
1321
  });
1322
+ if ("addBulkAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addBulkAction === "function") {
1323
+ contentManagerPluginApis.addBulkAction((actions) => {
1324
+ const deleteActionIndex = actions.findIndex((action) => action.type === "delete");
1325
+ actions.splice(deleteActionIndex, 0, ReleaseAction);
1326
+ return actions;
1327
+ });
1328
+ }
1329
+ app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
1191
1330
  } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1192
- app.addMenuLink({
1193
- to: `/plugins/purchase-content-releases`,
1194
- icon: PaperPlane,
1331
+ app.addSettingsLink("global", {
1332
+ id: pluginId,
1333
+ to: "/plugins/purchase-content-releases",
1195
1334
  intlLabel: {
1196
1335
  id: `${pluginId}.plugin.name`,
1197
1336
  defaultMessage: "Releases"
1198
1337
  },
1199
1338
  permissions: [],
1200
1339
  async Component() {
1201
- const { PurchaseContentReleases } = await import("./PurchaseContentReleases-C8djn9fP.mjs");
1340
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-D-n-w-st.mjs");
1202
1341
  return { default: PurchaseContentReleases };
1203
1342
  },
1204
- lockIcon: true
1343
+ licenseOnly: true
1205
1344
  });
1206
1345
  }
1207
1346
  },
1208
1347
  async registerTrads({ locales }) {
1209
1348
  const importedTrads = await Promise.all(
1210
1349
  locales.map((locale) => {
1211
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B9Ur3VsE.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1350
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-D9Q4YW03.mjs") }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
1212
1351
  return {
1213
1352
  data: prefixPluginTranslations(data, "content-releases"),
1214
1353
  locale
@@ -1227,19 +1366,21 @@ const admin = {
1227
1366
  export {
1228
1367
  PERMISSIONS as P,
1229
1368
  ReleaseActionOptions as R,
1230
- useCreateReleaseMutation as a,
1231
- useGetReleaseQuery as b,
1232
- useUpdateReleaseMutation as c,
1233
- useDeleteReleaseMutation as d,
1234
- usePublishReleaseMutation as e,
1235
- useGetReleaseActionsQuery as f,
1236
- getTimezoneOffset as g,
1237
- useUpdateReleaseActionMutation as h,
1238
- isAxiosError as i,
1239
- ReleaseActionMenu as j,
1240
- admin as k,
1369
+ useGetReleaseSettingsQuery as a,
1370
+ useCreateReleaseMutation as b,
1371
+ useGetReleaseQuery as c,
1372
+ useUpdateReleaseMutation as d,
1373
+ useDeleteReleaseMutation as e,
1374
+ usePublishReleaseMutation as f,
1375
+ getTimezones as g,
1376
+ getTimezoneOffset as h,
1377
+ useGetReleaseActionsQuery as i,
1378
+ useUpdateReleaseActionMutation as j,
1379
+ ReleaseActionMenu as k,
1380
+ useUpdateReleaseSettingsMutation as l,
1381
+ admin as m,
1241
1382
  pluginId as p,
1242
1383
  releaseApi as r,
1243
1384
  useGetReleasesQuery as u
1244
1385
  };
1245
- //# sourceMappingURL=index-DDohgTaQ.mjs.map
1386
+ //# sourceMappingURL=index-BjvFfTtA.mjs.map