@strapi/content-releases 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.eba25ec571b091c6bde1104eb6c753debdf15462

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