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

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