@strapi/content-releases 0.0.0-experimental.defd8568ae03ef8d52f86e1f3541979f953c3941 → 0.0.0-experimental.e14656d3b8681880212c13260b9a2b340c182f2d

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