@strapi/content-releases 0.0.0-experimental.ee4d311a5e6a131fad03cf07e4696f49fdd9c2e6 → 0.0.0-experimental.f75e3c6d67cc47c64ab37479efdbb7b43be50b78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/_chunks/App-DUmziQ17.js +1366 -0
  2. package/dist/_chunks/App-DUmziQ17.js.map +1 -0
  3. package/dist/_chunks/App-D_6Y9N2F.mjs +1344 -0
  4. package/dist/_chunks/App-D_6Y9N2F.mjs.map +1 -0
  5. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js +52 -0
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs +52 -0
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-MyLPoISH.mjs → en-B9Ur3VsE.mjs} +30 -7
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-gYDqKYFd.js → en-DtFJ5ViE.js} +30 -7
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-EIe8S-cw.mjs → index-BomF0-yY.mjs} +352 -221
  14. package/dist/_chunks/index-BomF0-yY.mjs.map +1 -0
  15. package/dist/_chunks/{index-l5iuP0Hb.js → index-C5Hc767q.js} +346 -217
  16. package/dist/_chunks/index-C5Hc767q.js.map +1 -0
  17. package/dist/admin/index.js +1 -15
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +2 -16
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
  22. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  23. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  24. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  25. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  26. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  27. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  28. package/dist/admin/src/constants.d.ts +58 -0
  29. package/dist/admin/src/index.d.ts +3 -0
  30. package/dist/admin/src/pages/App.d.ts +1 -0
  31. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  32. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  33. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  34. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  35. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  36. package/dist/admin/src/pluginId.d.ts +1 -0
  37. package/dist/admin/src/services/release.d.ts +105 -0
  38. package/dist/admin/src/store/hooks.d.ts +7 -0
  39. package/dist/admin/src/utils/api.d.ts +6 -0
  40. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  41. package/dist/admin/src/utils/time.d.ts +1 -0
  42. package/dist/server/index.js +1113 -418
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +1113 -418
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/server/src/bootstrap.d.ts +5 -0
  47. package/dist/server/src/bootstrap.d.ts.map +1 -0
  48. package/dist/server/src/constants.d.ts +12 -0
  49. package/dist/server/src/constants.d.ts.map +1 -0
  50. package/dist/server/src/content-types/index.d.ts +99 -0
  51. package/dist/server/src/content-types/index.d.ts.map +1 -0
  52. package/dist/server/src/content-types/release/index.d.ts +48 -0
  53. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  54. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  55. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  56. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  57. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  58. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  59. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  60. package/dist/server/src/controllers/index.d.ts +20 -0
  61. package/dist/server/src/controllers/index.d.ts.map +1 -0
  62. package/dist/server/src/controllers/release-action.d.ts +10 -0
  63. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  64. package/dist/server/src/controllers/release.d.ts +12 -0
  65. package/dist/server/src/controllers/release.d.ts.map +1 -0
  66. package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
  67. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  68. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  69. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  70. package/dist/server/src/destroy.d.ts +5 -0
  71. package/dist/server/src/destroy.d.ts.map +1 -0
  72. package/dist/server/src/index.d.ts +2096 -0
  73. package/dist/server/src/index.d.ts.map +1 -0
  74. package/dist/server/src/migrations/index.d.ts +13 -0
  75. package/dist/server/src/migrations/index.d.ts.map +1 -0
  76. package/dist/server/src/register.d.ts +5 -0
  77. package/dist/server/src/register.d.ts.map +1 -0
  78. package/dist/server/src/routes/index.d.ts +35 -0
  79. package/dist/server/src/routes/index.d.ts.map +1 -0
  80. package/dist/server/src/routes/release-action.d.ts +18 -0
  81. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  82. package/dist/server/src/routes/release.d.ts +18 -0
  83. package/dist/server/src/routes/release.d.ts.map +1 -0
  84. package/dist/server/src/services/index.d.ts +1826 -0
  85. package/dist/server/src/services/index.d.ts.map +1 -0
  86. package/dist/server/src/services/release.d.ts +66 -0
  87. package/dist/server/src/services/release.d.ts.map +1 -0
  88. package/dist/server/src/services/scheduling.d.ts +18 -0
  89. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  90. package/dist/server/src/services/validation.d.ts +18 -0
  91. package/dist/server/src/services/validation.d.ts.map +1 -0
  92. package/dist/server/src/utils/index.d.ts +14 -0
  93. package/dist/server/src/utils/index.d.ts.map +1 -0
  94. package/dist/shared/contracts/release-actions.d.ts +131 -0
  95. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  96. package/dist/shared/contracts/releases.d.ts +182 -0
  97. package/dist/shared/contracts/releases.d.ts.map +1 -0
  98. package/dist/shared/types.d.ts +24 -0
  99. package/dist/shared/types.d.ts.map +1 -0
  100. package/dist/shared/validation-schemas.d.ts +2 -0
  101. package/dist/shared/validation-schemas.d.ts.map +1 -0
  102. package/package.json +31 -35
  103. package/dist/_chunks/App-0yPbcoGt.js +0 -1037
  104. package/dist/_chunks/App-0yPbcoGt.js.map +0 -1
  105. package/dist/_chunks/App-BWaM2ihP.mjs +0 -1015
  106. package/dist/_chunks/App-BWaM2ihP.mjs.map +0 -1
  107. package/dist/_chunks/en-MyLPoISH.mjs.map +0 -1
  108. package/dist/_chunks/en-gYDqKYFd.js.map +0 -1
  109. package/dist/_chunks/index-EIe8S-cw.mjs.map +0 -1
  110. package/dist/_chunks/index-l5iuP0Hb.js.map +0 -1
@@ -1,18 +1,16 @@
1
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, prefixPluginTranslations } from "@strapi/helper-plugin";
2
1
  import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
3
2
  import { jsx, jsxs } from "react/jsx-runtime";
4
3
  import * as React from "react";
5
4
  import { skipToken } from "@reduxjs/toolkit/query";
6
- import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
- import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
- import { isAxiosError as isAxiosError$1 } from "axios";
5
+ import { adminApi, useNotification, useAPIErrorHandler, useRBAC, useAuth, isFetchError, useQueryParams } from "@strapi/admin/strapi-admin";
6
+ import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
+ import { Menu, Flex, Typography, AccessibleIcon, Field, VisuallyHidden, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter, EmptyStateLayout, LinkButton } from "@strapi/design-system";
8
+ import { EmptyDocuments } from "@strapi/icons/symbols";
9
9
  import { Formik, Form } from "formik";
10
10
  import { useIntl } from "react-intl";
11
- import { NavLink, useParams, Link as Link$1 } from "react-router-dom";
11
+ import { Link, useParams } from "react-router-dom";
12
12
  import * as yup from "yup";
13
- import { createApi } from "@reduxjs/toolkit/query/react";
14
- import styled from "styled-components";
15
- import { useDispatch, useSelector } from "react-redux";
13
+ import { styled } from "styled-components";
16
14
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
15
  const v = glob[path];
18
16
  if (v) {
@@ -94,49 +92,9 @@ const PERMISSIONS = {
94
92
  }
95
93
  ]
96
94
  };
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
- };
131
- }
132
- };
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"],
95
+ const releaseApi = adminApi.enhanceEndpoints({
96
+ addTagTypes: ["Release", "ReleaseAction", "EntriesInRelease"]
97
+ }).injectEndpoints({
140
98
  endpoints: (build) => {
141
99
  return {
142
100
  getReleasesForEntry: build.query({
@@ -251,6 +209,20 @@ const releaseApi = createApi({
251
209
  { type: "ReleaseAction", id: "LIST" }
252
210
  ]
253
211
  }),
212
+ createManyReleaseActions: build.mutation({
213
+ query({ body, params }) {
214
+ return {
215
+ url: `/content-releases/${params.releaseId}/actions/bulk`,
216
+ method: "POST",
217
+ data: body
218
+ };
219
+ },
220
+ invalidatesTags: [
221
+ { type: "Release", id: "LIST" },
222
+ { type: "ReleaseAction", id: "LIST" },
223
+ { type: "EntriesInRelease" }
224
+ ]
225
+ }),
254
226
  updateReleaseAction: build.mutation({
255
227
  query({ body, params }) {
256
228
  return {
@@ -259,7 +231,31 @@ const releaseApi = createApi({
259
231
  data: body
260
232
  };
261
233
  },
262
- invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }]
234
+ invalidatesTags: () => [{ type: "ReleaseAction", id: "LIST" }],
235
+ async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {
236
+ const paramsWithoutActionId = {
237
+ releaseId: params.releaseId,
238
+ ...query
239
+ };
240
+ const patchResult = dispatch(
241
+ releaseApi.util.updateQueryData(
242
+ "getReleaseActions",
243
+ paramsWithoutActionId,
244
+ (draft) => {
245
+ const [key, index] = actionPath;
246
+ const action = draft.data[key][index];
247
+ if (action) {
248
+ action.type = body.type;
249
+ }
250
+ }
251
+ )
252
+ );
253
+ try {
254
+ await queryFulfilled;
255
+ } catch {
256
+ patchResult.undo();
257
+ }
258
+ }
263
259
  }),
264
260
  deleteReleaseAction: build.mutation({
265
261
  query({ params }) {
@@ -268,9 +264,11 @@ const releaseApi = createApi({
268
264
  method: "DELETE"
269
265
  };
270
266
  },
271
- invalidatesTags: [
267
+ invalidatesTags: (result, error, arg) => [
272
268
  { type: "Release", id: "LIST" },
273
- { type: "ReleaseAction", id: "LIST" }
269
+ { type: "Release", id: arg.params.releaseId },
270
+ { type: "ReleaseAction", id: "LIST" },
271
+ { type: "EntriesInRelease" }
274
272
  ]
275
273
  }),
276
274
  publishRelease: build.mutation({
@@ -289,7 +287,22 @@ const releaseApi = createApi({
289
287
  method: "DELETE"
290
288
  };
291
289
  },
292
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
290
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }, { type: "EntriesInRelease" }]
291
+ }),
292
+ getMappedEntriesInReleases: build.query({
293
+ query(params) {
294
+ return {
295
+ url: "/content-releases/mapEntriesToReleases",
296
+ method: "GET",
297
+ config: {
298
+ params
299
+ }
300
+ };
301
+ },
302
+ transformResponse(response) {
303
+ return response.data;
304
+ },
305
+ providesTags: [{ type: "EntriesInRelease" }]
293
306
  })
294
307
  };
295
308
  }
@@ -301,22 +314,36 @@ const {
301
314
  useGetReleaseActionsQuery,
302
315
  useCreateReleaseMutation,
303
316
  useCreateReleaseActionMutation,
317
+ useCreateManyReleaseActionsMutation,
304
318
  useUpdateReleaseMutation,
305
319
  useUpdateReleaseActionMutation,
306
320
  usePublishReleaseMutation,
307
321
  useDeleteReleaseActionMutation,
308
- useDeleteReleaseMutation
322
+ useDeleteReleaseMutation,
323
+ useGetMappedEntriesInReleasesQuery
309
324
  } = releaseApi;
310
- const useTypedDispatch = useDispatch;
311
- const useTypedSelector = useSelector;
325
+ const getTimezoneOffset = (timezone, date) => {
326
+ try {
327
+ const offsetPart = new Intl.DateTimeFormat("en", {
328
+ timeZone: timezone,
329
+ timeZoneName: "longOffset"
330
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
331
+ const offset = offsetPart ? offsetPart.value : "";
332
+ let utcOffset = offset.replace("GMT", "UTC");
333
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
334
+ utcOffset = `${utcOffset}+00:00`;
335
+ }
336
+ return utcOffset;
337
+ } catch (error) {
338
+ return "";
339
+ }
340
+ };
312
341
  const StyledMenuItem = styled(Menu.Item)`
313
342
  &:hover {
314
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
343
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
315
344
 
316
345
  svg {
317
- path {
318
- fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
319
- }
346
+ fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
320
347
  }
321
348
 
322
349
  a {
@@ -325,9 +352,7 @@ const StyledMenuItem = styled(Menu.Item)`
325
352
  }
326
353
 
327
354
  svg {
328
- path {
329
- fill: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}600`]};
330
- }
355
+ fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
331
356
  }
332
357
 
333
358
  a {
@@ -339,15 +364,14 @@ const StyledMenuItem = styled(Menu.Item)`
339
364
  width: 100%;
340
365
  }
341
366
  `;
342
- const StyledIconButton = styled(IconButton)`
343
- /* Setting this style inline with borderColor will not apply the style */
344
- border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};
345
- `;
346
367
  const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
347
368
  const { formatMessage } = useIntl();
348
- const toggleNotification = useNotification();
369
+ const { toggleNotification } = useNotification();
349
370
  const { formatAPIError } = useAPIErrorHandler();
350
371
  const [deleteReleaseAction] = useDeleteReleaseActionMutation();
372
+ const {
373
+ allowedActions: { canDeleteAction }
374
+ } = useRBAC(PERMISSIONS);
351
375
  const handleDeleteAction = async () => {
352
376
  const response = await deleteReleaseAction({
353
377
  params: { releaseId, actionId }
@@ -363,26 +387,29 @@ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
363
387
  return;
364
388
  }
365
389
  if ("error" in response) {
366
- if (isAxiosError$1(response.error)) {
390
+ if (isFetchError(response.error)) {
367
391
  toggleNotification({
368
- type: "warning",
392
+ type: "danger",
369
393
  message: formatAPIError(response.error)
370
394
  });
371
395
  } else {
372
396
  toggleNotification({
373
- type: "warning",
397
+ type: "danger",
374
398
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
375
399
  });
376
400
  }
377
401
  }
378
402
  };
379
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.deleteAction, children: /* @__PURE__ */ jsx(StyledMenuItem, { variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
380
- /* @__PURE__ */ jsx(Icon, { as: Cross, padding: 1 }),
403
+ if (!canDeleteAction) {
404
+ return null;
405
+ }
406
+ return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
407
+ /* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
381
408
  /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
382
409
  id: "content-releases.content-manager-edit-view.remove-from-release",
383
410
  defaultMessage: "Remove from release"
384
411
  }) })
385
- ] }) }) });
412
+ ] }) });
386
413
  };
387
414
  const ReleaseActionEntryLinkItem = ({
388
415
  contentTypeUid,
@@ -390,66 +417,84 @@ const ReleaseActionEntryLinkItem = ({
390
417
  locale
391
418
  }) => {
392
419
  const { formatMessage } = useIntl();
393
- const collectionTypePermissions = useTypedSelector(
394
- (state) => state.rbacProvider.collectionTypesRelatedPermissions
395
- );
396
- const updatePermissions = contentTypeUid ? collectionTypePermissions[contentTypeUid]?.["plugin::content-manager.explorer.update"] : [];
397
- const canUpdateEntryForLocale = Boolean(
398
- !locale || updatePermissions?.find(
399
- (permission) => permission.properties?.locales?.includes(locale)
400
- )
401
- );
420
+ const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
421
+ const canUpdateEntryForLocale = React.useMemo(() => {
422
+ const updatePermissions = userPermissions.find(
423
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
424
+ );
425
+ if (!updatePermissions) {
426
+ return false;
427
+ }
428
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
429
+ }, [contentTypeUid, locale, userPermissions]);
430
+ const {
431
+ allowedActions: { canUpdate: canUpdateContentType }
432
+ } = useRBAC({
433
+ updateContentType: [
434
+ {
435
+ action: "plugin::content-manager.explorer.update",
436
+ subject: contentTypeUid
437
+ }
438
+ ]
439
+ });
440
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
441
+ return null;
442
+ }
402
443
  return /* @__PURE__ */ jsx(
403
- CheckPermissions,
444
+ StyledMenuItem,
404
445
  {
405
- permissions: [
406
- {
407
- action: "plugin::content-manager.explorer.update",
408
- subject: contentTypeUid
409
- }
410
- ],
411
- children: canUpdateEntryForLocale && /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
412
- Link,
413
- {
414
- as: NavLink,
415
- to: {
416
- pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
417
- search: locale && `?plugins[i18n][locale]=${locale}`
418
- },
419
- startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, padding: 1 }),
420
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
421
- id: "content-releases.content-manager-edit-view.edit-entry",
422
- defaultMessage: "Edit entry"
423
- }) })
424
- }
425
- ) })
446
+ tag: Link,
447
+ isLink: true,
448
+ to: {
449
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,
450
+ search: locale && `?plugins[i18n][locale]=${locale}`
451
+ },
452
+ children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
453
+ /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
454
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
455
+ id: "content-releases.content-manager-edit-view.edit-entry",
456
+ defaultMessage: "Edit entry"
457
+ }) })
458
+ ] })
426
459
  }
427
460
  );
428
461
  };
429
- const Root = ({ children, hasTriggerBorder = false }) => {
462
+ const EditReleaseItem = ({ releaseId }) => {
463
+ const { formatMessage } = useIntl();
464
+ return (
465
+ /* @ts-expect-error inference isn't working in DS */
466
+ /* @__PURE__ */ jsx(StyledMenuItem, { tag: Link, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
467
+ /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
468
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
469
+ id: "content-releases.content-manager-edit-view.edit-release",
470
+ defaultMessage: "Edit release"
471
+ }) })
472
+ ] }) })
473
+ );
474
+ };
475
+ const Root = ({ children }) => {
430
476
  const { formatMessage } = useIntl();
477
+ const { allowedActions } = useRBAC(PERMISSIONS);
431
478
  return (
432
479
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
433
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: [...PERMISSIONS.deleteAction, ...PERMISSIONS.update], children: /* @__PURE__ */ jsxs(Menu.Root, { children: [
434
- /* @__PURE__ */ jsx(
435
- Menu.Trigger,
480
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
481
+ /* @__PURE__ */ jsx(Menu.Trigger, { paddingLeft: 2, paddingRight: 2, children: /* @__PURE__ */ jsx(
482
+ AccessibleIcon,
436
483
  {
437
- as: hasTriggerBorder ? StyledIconButton : IconButton,
438
- paddingLeft: 2,
439
- paddingRight: 2,
440
- "aria-label": formatMessage({
484
+ label: formatMessage({
441
485
  id: "content-releases.content-manager-edit-view.release-action-menu",
442
486
  defaultMessage: "Release action options"
443
487
  }),
444
- icon: /* @__PURE__ */ jsx(More, {})
488
+ children: /* @__PURE__ */ jsx(More, {})
445
489
  }
446
- ),
490
+ ) }),
447
491
  /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
448
- ] }) })
492
+ ] }) : null
449
493
  );
450
494
  };
451
495
  const ReleaseActionMenu = {
452
496
  Root,
497
+ EditReleaseItem,
453
498
  DeleteReleaseActionItem,
454
499
  ReleaseActionEntryLinkItem
455
500
  };
@@ -459,11 +504,11 @@ const getBorderLeftRadiusValue = (actionType) => {
459
504
  const getBorderRightRadiusValue = (actionType) => {
460
505
  return actionType === "publish" ? 0 : 1;
461
506
  };
462
- const FieldWrapper = styled(Field)`
463
- border-top-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
464
- border-bottom-left-radius: ${({ actionType, theme }) => theme.spaces[getBorderLeftRadiusValue(actionType)]};
465
- border-top-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
466
- border-bottom-right-radius: ${({ actionType, theme }) => theme.spaces[getBorderRightRadiusValue(actionType)]};
507
+ const FieldWrapper = styled(Field.Root)`
508
+ border-top-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
509
+ border-bottom-left-radius: ${({ $actionType, theme }) => theme.spaces[getBorderLeftRadiusValue($actionType)]};
510
+ border-top-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
511
+ border-bottom-right-radius: ${({ $actionType, theme }) => theme.spaces[getBorderRightRadiusValue($actionType)]};
467
512
 
468
513
  > label {
469
514
  color: inherit;
@@ -473,39 +518,61 @@ const FieldWrapper = styled(Field)`
473
518
  text-transform: capitalize;
474
519
  }
475
520
 
476
- &:active,
477
521
  &[data-checked='true'] {
478
- color: ${({ theme }) => theme.colors.primary700};
479
- background-color: ${({ theme }) => theme.colors.primary100};
480
- border-color: ${({ theme }) => theme.colors.primary700};
522
+ color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
523
+ background-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary100 : theme.colors.danger100};
524
+ border-color: ${({ theme, $actionType }) => $actionType === "publish" ? theme.colors.primary700 : theme.colors.danger600};
481
525
  }
482
526
 
483
527
  &[data-checked='false'] {
484
- border-left: ${({ actionType }) => actionType === "unpublish" && "none"};
485
- border-right: ${({ actionType }) => actionType === "publish" && "none"};
528
+ border-left: ${({ $actionType }) => $actionType === "unpublish" && "none"};
529
+ border-right: ${({ $actionType }) => $actionType === "publish" && "none"};
530
+ }
531
+
532
+ &[data-checked='false'][data-disabled='false']:hover {
533
+ color: ${({ theme }) => theme.colors.neutral700};
534
+ background-color: ${({ theme }) => theme.colors.neutral100};
535
+ border-color: ${({ theme }) => theme.colors.neutral200};
536
+
537
+ & > label {
538
+ cursor: pointer;
539
+ }
540
+ }
541
+
542
+ &[data-disabled='true'] {
543
+ color: ${({ theme }) => theme.colors.neutral600};
544
+ background-color: ${({ theme }) => theme.colors.neutral150};
545
+ border-color: ${({ theme }) => theme.colors.neutral300};
486
546
  }
487
547
  `;
488
- const ActionOption = ({ selected, actionType, handleChange, name }) => {
548
+ const ActionOption = ({
549
+ selected,
550
+ actionType,
551
+ handleChange,
552
+ name,
553
+ disabled = false
554
+ }) => {
489
555
  return /* @__PURE__ */ jsx(
490
556
  FieldWrapper,
491
557
  {
492
- actionType,
558
+ $actionType: actionType,
493
559
  background: "primary0",
494
560
  borderColor: "neutral200",
495
561
  color: selected === actionType ? "primary600" : "neutral600",
496
562
  position: "relative",
497
563
  cursor: "pointer",
498
564
  "data-checked": selected === actionType,
499
- children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `${name}-${actionType}`, children: [
565
+ "data-disabled": disabled && selected !== actionType,
566
+ children: /* @__PURE__ */ jsxs(Field.Label, { children: [
500
567
  /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
501
- FieldInput,
568
+ Field.Input,
502
569
  {
503
570
  type: "radio",
504
- id: `${name}-${actionType}`,
505
571
  name,
506
572
  checked: selected === actionType,
507
573
  onChange: handleChange,
508
- value: actionType
574
+ value: actionType,
575
+ disabled
509
576
  }
510
577
  ) }),
511
578
  actionType
@@ -513,7 +580,12 @@ const ActionOption = ({ selected, actionType, handleChange, name }) => {
513
580
  }
514
581
  );
515
582
  };
516
- const ReleaseActionOptions = ({ selected, handleChange, name }) => {
583
+ const ReleaseActionOptions = ({
584
+ selected,
585
+ handleChange,
586
+ name,
587
+ disabled = false
588
+ }) => {
517
589
  return /* @__PURE__ */ jsxs(Flex, { children: [
518
590
  /* @__PURE__ */ jsx(
519
591
  ActionOption,
@@ -521,7 +593,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
521
593
  actionType: "publish",
522
594
  selected,
523
595
  handleChange,
524
- name
596
+ name,
597
+ disabled
525
598
  }
526
599
  ),
527
600
  /* @__PURE__ */ jsx(
@@ -530,7 +603,8 @@ const ReleaseActionOptions = ({ selected, handleChange, name }) => {
530
603
  actionType: "unpublish",
531
604
  selected,
532
605
  handleChange,
533
- name
606
+ name,
607
+ disabled
534
608
  }
535
609
  )
536
610
  ] });
@@ -546,19 +620,20 @@ const INITIAL_VALUES = {
546
620
  const NoReleases = () => {
547
621
  const { formatMessage } = useIntl();
548
622
  return /* @__PURE__ */ jsx(
549
- NoContent,
623
+ EmptyStateLayout,
550
624
  {
551
- content: {
625
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
626
+ content: formatMessage({
552
627
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
553
628
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
554
- },
629
+ }),
555
630
  action: /* @__PURE__ */ jsx(
556
631
  LinkButton,
557
632
  {
558
633
  to: {
559
634
  pathname: "/plugins/content-releases"
560
635
  },
561
- as: Link$1,
636
+ tag: Link,
562
637
  variant: "secondary",
563
638
  children: formatMessage({
564
639
  id: "content-releases.content-manager-edit-view.add-to-release.redirect-button",
@@ -574,10 +649,12 @@ const AddActionToReleaseModal = ({
574
649
  contentTypeUid,
575
650
  entryId
576
651
  }) => {
652
+ const releaseHeaderId = React.useId();
577
653
  const { formatMessage } = useIntl();
578
- const toggleNotification = useNotification();
654
+ const { toggleNotification } = useNotification();
579
655
  const { formatAPIError } = useAPIErrorHandler();
580
- const { modifiedData } = useCMEditViewDataManager();
656
+ const [{ query }] = useQueryParams();
657
+ const locale = query.plugins?.i18n?.locale;
581
658
  const response = useGetReleasesForEntryQuery({
582
659
  contentTypeUid,
583
660
  entryId,
@@ -586,7 +663,6 @@ const AddActionToReleaseModal = ({
586
663
  const releases = response.data?.data;
587
664
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
588
665
  const handleSubmit = async (values) => {
589
- const locale = modifiedData.locale;
590
666
  const releaseActionEntry = {
591
667
  contentType: contentTypeUid,
592
668
  id: entryId,
@@ -608,21 +684,21 @@ const AddActionToReleaseModal = ({
608
684
  return;
609
685
  }
610
686
  if ("error" in response2) {
611
- if (isAxiosError$1(response2.error)) {
687
+ if (isFetchError(response2.error)) {
612
688
  toggleNotification({
613
- type: "warning",
689
+ type: "danger",
614
690
  message: formatAPIError(response2.error)
615
691
  });
616
692
  } else {
617
693
  toggleNotification({
618
- type: "warning",
694
+ type: "danger",
619
695
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
620
696
  });
621
697
  }
622
698
  }
623
699
  };
624
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
625
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
700
+ return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: releaseHeaderId, children: [
701
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: releaseHeaderId, fontWeight: "bold", textColor: "neutral800", children: formatMessage({
626
702
  id: "content-releases.content-manager-edit-view.add-to-release",
627
703
  defaultMessage: "Add to release"
628
704
  }) }) }),
@@ -635,24 +711,25 @@ const AddActionToReleaseModal = ({
635
711
  children: ({ values, setFieldValue }) => {
636
712
  return /* @__PURE__ */ jsxs(Form, { children: [
637
713
  releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
638
- /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsx(
639
- SingleSelect,
640
- {
641
- required: true,
642
- label: formatMessage({
643
- id: "content-releases.content-manager-edit-view.add-to-release.select-label",
644
- defaultMessage: "Select a release"
645
- }),
646
- placeholder: formatMessage({
647
- id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
648
- defaultMessage: "Select"
649
- }),
650
- onChange: (value) => setFieldValue("releaseId", value),
651
- value: values.releaseId,
652
- children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
653
- }
654
- ) }),
655
- /* @__PURE__ */ jsx(FieldLabel, { children: formatMessage({
714
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
715
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
716
+ id: "content-releases.content-manager-edit-view.add-to-release.select-label",
717
+ defaultMessage: "Select a release"
718
+ }) }),
719
+ /* @__PURE__ */ jsx(
720
+ SingleSelect,
721
+ {
722
+ placeholder: formatMessage({
723
+ id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
724
+ defaultMessage: "Select"
725
+ }),
726
+ onChange: (value) => setFieldValue("releaseId", value),
727
+ value: values.releaseId,
728
+ children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
729
+ }
730
+ )
731
+ ] }) }),
732
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
656
733
  id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
657
734
  defaultMessage: "What do you want to do with this entry?"
658
735
  }) }),
@@ -692,16 +769,22 @@ const AddActionToReleaseModal = ({
692
769
  };
693
770
  const CMReleasesContainer = () => {
694
771
  const [isModalOpen, setIsModalOpen] = React.useState(false);
695
- const { formatMessage } = useIntl();
696
- const {
697
- isCreatingEntry,
698
- allLayoutData: { contentType }
699
- } = useCMEditViewDataManager();
700
- const params = useParams();
701
- const canFetch = params?.id != null && contentType?.uid != null;
772
+ const { formatMessage, formatDate, formatTime } = useIntl();
773
+ const { id, slug, collectionType } = useParams();
774
+ const isCreatingEntry = id === "create";
775
+ const entryId = parseInt(id, 10);
776
+ const { allowedActions } = useRBAC(PERMISSIONS);
777
+ const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
778
+ const { schema } = unstable_useDocument({
779
+ collectionType,
780
+ model: slug
781
+ });
782
+ const hasDraftAndPublish = schema?.options?.draftAndPublish;
783
+ const contentTypeUid = slug;
784
+ const canFetch = id != null && contentTypeUid != null;
702
785
  const fetchParams = canFetch ? {
703
- contentTypeUid: contentType.uid,
704
- entryId: params.id,
786
+ contentTypeUid,
787
+ entryId,
705
788
  hasEntryAttached: true
706
789
  } : skipToken;
707
790
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -709,7 +792,7 @@ const CMReleasesContainer = () => {
709
792
  if (!canFetch) {
710
793
  return null;
711
794
  }
712
- if (isCreatingEntry || !contentType?.options?.draftAndPublish) {
795
+ if (isCreatingEntry || !hasDraftAndPublish) {
713
796
  return null;
714
797
  }
715
798
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -719,10 +802,13 @@ const CMReleasesContainer = () => {
719
802
  }
720
803
  return `success${shade}`;
721
804
  };
722
- return /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(
805
+ if (!canMain) {
806
+ return null;
807
+ }
808
+ return /* @__PURE__ */ jsxs(
723
809
  Box,
724
810
  {
725
- as: "aside",
811
+ tag: "aside",
726
812
  "aria-label": formatMessage({
727
813
  id: "content-releases.plugin.name",
728
814
  defaultMessage: "Releases"
@@ -746,7 +832,7 @@ const CMReleasesContainer = () => {
746
832
  alignItems: "start",
747
833
  borderWidth: "1px",
748
834
  borderStyle: "solid",
749
- borderColor: getReleaseColorVariant(release.action.type, "200"),
835
+ borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
750
836
  overflow: "hidden",
751
837
  hasRadius: true,
752
838
  children: [
@@ -757,41 +843,66 @@ const CMReleasesContainer = () => {
757
843
  paddingBottom: 3,
758
844
  paddingLeft: 4,
759
845
  paddingRight: 4,
760
- background: getReleaseColorVariant(release.action.type, "100"),
846
+ background: getReleaseColorVariant(release.actions[0].type, "100"),
761
847
  width: "100%",
762
848
  children: /* @__PURE__ */ jsx(
763
849
  Typography,
764
850
  {
765
851
  fontSize: 1,
766
852
  variant: "pi",
767
- textColor: getReleaseColorVariant(release.action.type, "600"),
853
+ textColor: getReleaseColorVariant(release.actions[0].type, "600"),
768
854
  children: formatMessage(
769
855
  {
770
856
  id: "content-releases.content-manager-edit-view.list-releases.title",
771
857
  defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
772
858
  },
773
- { isPublish: release.action.type === "publish" }
859
+ { isPublish: release.actions[0].type === "publish" }
774
860
  )
775
861
  }
776
862
  )
777
863
  }
778
864
  ),
779
- /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 3, width: "100%", alignItems: "flex-start", children: [
865
+ /* @__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: [
780
866
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
781
- /* @__PURE__ */ jsx(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: /* @__PURE__ */ jsx(
782
- ReleaseActionMenu.DeleteReleaseActionItem,
867
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
783
868
  {
784
- releaseId: release.id,
785
- actionId: release.action.id
869
+ id: "content-releases.content-manager-edit-view.scheduled.date",
870
+ defaultMessage: "{date} at {time} ({offset})"
871
+ },
872
+ {
873
+ date: formatDate(new Date(release.scheduledAt), {
874
+ day: "2-digit",
875
+ month: "2-digit",
876
+ year: "numeric",
877
+ timeZone: release.timezone
878
+ }),
879
+ time: formatTime(new Date(release.scheduledAt), {
880
+ hourCycle: "h23",
881
+ timeZone: release.timezone
882
+ }),
883
+ offset: getTimezoneOffset(
884
+ release.timezone,
885
+ new Date(release.scheduledAt)
886
+ )
786
887
  }
787
- ) })
788
- ] })
888
+ ) }),
889
+ canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
890
+ /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
891
+ /* @__PURE__ */ jsx(
892
+ ReleaseActionMenu.DeleteReleaseActionItem,
893
+ {
894
+ releaseId: release.id,
895
+ actionId: release.actions[0].id
896
+ }
897
+ )
898
+ ] }) : null
899
+ ] }) })
789
900
  ]
790
901
  },
791
902
  release.id
792
903
  );
793
904
  }),
794
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.createAction, children: /* @__PURE__ */ jsx(
905
+ canCreateAction ? /* @__PURE__ */ jsx(
795
906
  Button,
796
907
  {
797
908
  justifyContent: "center",
@@ -806,51 +917,72 @@ const CMReleasesContainer = () => {
806
917
  defaultMessage: "Add to release"
807
918
  })
808
919
  }
809
- ) })
920
+ ) : null
810
921
  ] }),
811
922
  isModalOpen && /* @__PURE__ */ jsx(
812
923
  AddActionToReleaseModal,
813
924
  {
814
925
  handleClose: toggleModal,
815
- contentTypeUid: contentType.uid,
816
- entryId: params.id
926
+ contentTypeUid,
927
+ entryId
817
928
  }
818
929
  )
819
930
  ]
820
931
  }
821
- ) });
932
+ );
933
+ };
934
+ const pluginId = "content-releases";
935
+ const prefixPluginTranslations = (trad, pluginId2) => {
936
+ if (!pluginId2) {
937
+ throw new TypeError("pluginId can't be empty");
938
+ }
939
+ return Object.keys(trad).reduce((acc, current) => {
940
+ acc[`${pluginId2}.${current}`] = trad[current];
941
+ return acc;
942
+ }, {});
822
943
  };
823
944
  const admin = {
824
945
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
825
946
  register(app) {
947
+ app.createHook("ContentReleases/pages/ReleaseDetails/add-locale-in-releases");
826
948
  if (window.strapi.features.isEnabled("cms-content-releases")) {
827
949
  app.addMenuLink({
828
- to: `/plugins/${pluginId}`,
950
+ to: `plugins/${pluginId}`,
829
951
  icon: PaperPlane,
830
952
  intlLabel: {
831
953
  id: `${pluginId}.plugin.name`,
832
954
  defaultMessage: "Releases"
833
955
  },
834
- async Component() {
835
- const { App } = await import("./App-BWaM2ihP.mjs");
836
- return App;
837
- },
838
- permissions: PERMISSIONS.main
839
- });
840
- app.addMiddlewares([() => releaseApi.middleware]);
841
- app.addReducers({
842
- [releaseApi.reducerPath]: releaseApi.reducer
956
+ Component: () => import("./App-D_6Y9N2F.mjs").then((mod) => ({ default: mod.App })),
957
+ permissions: PERMISSIONS.main,
958
+ position: 2
843
959
  });
844
- app.injectContentManagerComponent("editView", "right-links", {
960
+ app.getPlugin("content-manager").injectComponent("editView", "right-links", {
845
961
  name: `${pluginId}-link`,
846
962
  Component: CMReleasesContainer
847
963
  });
964
+ } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
965
+ app.addMenuLink({
966
+ to: `/plugins/purchase-content-releases`,
967
+ icon: PaperPlane,
968
+ intlLabel: {
969
+ id: `${pluginId}.plugin.name`,
970
+ defaultMessage: "Releases"
971
+ },
972
+ permissions: [],
973
+ async Component() {
974
+ const { PurchaseContentReleases } = await import("./PurchaseContentReleases-_MxP6-Dt.mjs");
975
+ return { default: PurchaseContentReleases };
976
+ },
977
+ lockIcon: true,
978
+ position: 2
979
+ });
848
980
  }
849
981
  },
850
982
  async registerTrads({ locales }) {
851
983
  const importedTrads = await Promise.all(
852
984
  locales.map((locale) => {
853
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-MyLPoISH.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
985
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B9Ur3VsE.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
854
986
  return {
855
987
  data: prefixPluginTranslations(data, "content-releases"),
856
988
  locale
@@ -869,19 +1001,18 @@ const admin = {
869
1001
  export {
870
1002
  PERMISSIONS as P,
871
1003
  ReleaseActionOptions as R,
872
- useUpdateReleaseMutation as a,
873
- useDeleteReleaseMutation as b,
874
- usePublishReleaseMutation as c,
875
- useTypedDispatch as d,
876
- useGetReleaseActionsQuery as e,
877
- useUpdateReleaseActionMutation as f,
878
- ReleaseActionMenu as g,
879
- useGetReleasesQuery as h,
880
- isAxiosError as i,
881
- useCreateReleaseMutation as j,
882
- admin as k,
1004
+ useCreateReleaseMutation as a,
1005
+ useGetReleaseQuery as b,
1006
+ useUpdateReleaseMutation as c,
1007
+ useDeleteReleaseMutation as d,
1008
+ usePublishReleaseMutation as e,
1009
+ useGetReleaseActionsQuery as f,
1010
+ getTimezoneOffset as g,
1011
+ useUpdateReleaseActionMutation as h,
1012
+ ReleaseActionMenu as i,
1013
+ admin as j,
883
1014
  pluginId as p,
884
1015
  releaseApi as r,
885
- useGetReleaseQuery as u
1016
+ useGetReleasesQuery as u
886
1017
  };
887
- //# sourceMappingURL=index-EIe8S-cw.mjs.map
1018
+ //# sourceMappingURL=index-BomF0-yY.mjs.map