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

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