@strapi/content-releases 5.0.0-beta.10 → 5.0.0-beta.12

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 (91) hide show
  1. package/dist/_chunks/{App-CEwOQkKT.js → App-B5UOQWbt.js} +150 -136
  2. package/dist/_chunks/App-B5UOQWbt.js.map +1 -0
  3. package/dist/_chunks/{App-B2R2exNT.mjs → App-DcXlnXrr.mjs} +152 -138
  4. package/dist/_chunks/App-DcXlnXrr.mjs.map +1 -0
  5. package/dist/_chunks/SettingsPage-ped5WZ6Q.js +40 -0
  6. package/dist/_chunks/SettingsPage-ped5WZ6Q.js.map +1 -0
  7. package/dist/_chunks/SettingsPage-w5dOMAtL.mjs +40 -0
  8. package/dist/_chunks/SettingsPage-w5dOMAtL.mjs.map +1 -0
  9. package/dist/_chunks/{en-DtFJ5ViE.js → en-aH5E5UNw.js} +2 -1
  10. package/dist/_chunks/en-aH5E5UNw.js.map +1 -0
  11. package/dist/_chunks/{en-B9Ur3VsE.mjs → en-ahPQUZv2.mjs} +2 -1
  12. package/dist/_chunks/en-ahPQUZv2.mjs.map +1 -0
  13. package/dist/_chunks/{index-BrWv-zV4.js → index-BgID5UQ7.js} +477 -428
  14. package/dist/_chunks/index-BgID5UQ7.js.map +1 -0
  15. package/dist/_chunks/{index-DbmynICx.mjs → index-LUuvped4.mjs} +479 -430
  16. package/dist/_chunks/index-LUuvped4.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +1 -1
  19. package/dist/admin/src/components/ReleaseActionMenu.d.ts +2 -2
  20. package/dist/admin/src/components/{CMReleasesContainer.d.ts → ReleaseActionModal.d.ts} +3 -1
  21. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  22. package/dist/admin/src/pages/SettingsPage.d.ts +1 -0
  23. package/dist/admin/src/services/release.d.ts +9 -7
  24. package/dist/server/index.js +784 -600
  25. package/dist/server/index.js.map +1 -1
  26. package/dist/server/index.mjs +785 -601
  27. package/dist/server/index.mjs.map +1 -1
  28. package/dist/server/src/bootstrap.d.ts.map +1 -1
  29. package/dist/server/src/constants.d.ts +11 -2
  30. package/dist/server/src/constants.d.ts.map +1 -1
  31. package/dist/server/src/content-types/index.d.ts +3 -5
  32. package/dist/server/src/content-types/index.d.ts.map +1 -1
  33. package/dist/server/src/content-types/release-action/index.d.ts +3 -5
  34. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
  35. package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
  36. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
  37. package/dist/server/src/controllers/index.d.ts +6 -3
  38. package/dist/server/src/controllers/index.d.ts.map +1 -1
  39. package/dist/server/src/controllers/release-action.d.ts +0 -1
  40. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  41. package/dist/server/src/controllers/release.d.ts +7 -2
  42. package/dist/server/src/controllers/release.d.ts.map +1 -1
  43. package/dist/server/src/controllers/settings.d.ts +11 -0
  44. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  45. package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
  46. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  47. package/dist/server/src/controllers/validation/release.d.ts +1 -0
  48. package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
  49. package/dist/server/src/controllers/validation/settings.d.ts +2 -0
  50. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  51. package/dist/server/src/index.d.ts +66 -51
  52. package/dist/server/src/index.d.ts.map +1 -1
  53. package/dist/server/src/middlewares/documents.d.ts +6 -0
  54. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  55. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  56. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  57. package/dist/server/src/migrations/index.d.ts.map +1 -1
  58. package/dist/server/src/register.d.ts.map +1 -1
  59. package/dist/server/src/routes/index.d.ts +16 -0
  60. package/dist/server/src/routes/index.d.ts.map +1 -1
  61. package/dist/server/src/routes/release-action.d.ts.map +1 -1
  62. package/dist/server/src/routes/release.d.ts.map +1 -1
  63. package/dist/server/src/routes/settings.d.ts +18 -0
  64. package/dist/server/src/routes/settings.d.ts.map +1 -0
  65. package/dist/server/src/services/index.d.ts +38 -38
  66. package/dist/server/src/services/index.d.ts.map +1 -1
  67. package/dist/server/src/services/release-action.d.ts +36 -0
  68. package/dist/server/src/services/release-action.d.ts.map +1 -0
  69. package/dist/server/src/services/release.d.ts +6 -41
  70. package/dist/server/src/services/release.d.ts.map +1 -1
  71. package/dist/server/src/services/settings.d.ts +13 -0
  72. package/dist/server/src/services/settings.d.ts.map +1 -0
  73. package/dist/server/src/services/validation.d.ts +1 -1
  74. package/dist/server/src/services/validation.d.ts.map +1 -1
  75. package/dist/server/src/utils/index.d.ts +29 -8
  76. package/dist/server/src/utils/index.d.ts.map +1 -1
  77. package/dist/shared/contracts/release-actions.d.ts +6 -5
  78. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  79. package/dist/shared/contracts/releases.d.ts +6 -5
  80. package/dist/shared/contracts/releases.d.ts.map +1 -1
  81. package/dist/shared/contracts/settings.d.ts +39 -0
  82. package/dist/shared/contracts/settings.d.ts.map +1 -0
  83. package/dist/shared/validation-schemas.d.ts +1 -0
  84. package/dist/shared/validation-schemas.d.ts.map +1 -1
  85. package/package.json +8 -7
  86. package/dist/_chunks/App-B2R2exNT.mjs.map +0 -1
  87. package/dist/_chunks/App-CEwOQkKT.js.map +0 -1
  88. package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
  89. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  90. package/dist/_chunks/index-BrWv-zV4.js.map +0 -1
  91. package/dist/_chunks/index-DbmynICx.mjs.map +0 -1
@@ -1,16 +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 { 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, Modal, SingleSelect, SingleSelectOption, EmptyStateLayout, LinkButton } from "@strapi/design-system";
1
+ import { Cursor, Cross, Pencil, More, PaperPlane } from "@strapi/icons";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { adminApi, useRBAC, useNotification, useAPIErrorHandler, useQueryParams, isFetchError, useAuth } from "@strapi/admin/strapi-admin";
4
+ import { unstable_useDocumentLayout } from "@strapi/content-manager/strapi-admin";
5
+ import { Field, Flex, VisuallyHidden, Modal, Button, Box, SingleSelect, SingleSelectOption, EmptyStateLayout, LinkButton, Menu, Typography, AccessibleIcon } from "@strapi/design-system";
8
6
  import { EmptyDocuments } from "@strapi/icons/symbols";
9
- import { Formik, Form } from "formik";
7
+ import { useFormik } from "formik";
10
8
  import { useIntl } from "react-intl";
11
- import { Link, useParams } from "react-router-dom";
9
+ import { Link, NavLink } from "react-router-dom";
12
10
  import * as yup from "yup";
13
11
  import { styled } from "styled-components";
12
+ import * as React from "react";
14
13
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
15
14
  const v = glob[path];
16
15
  if (v) {
@@ -93,14 +92,40 @@ const PERMISSIONS = {
93
92
  ]
94
93
  };
95
94
  const releaseApi = adminApi.enhanceEndpoints({
96
- addTagTypes: ["Release", "ReleaseAction", "EntriesInRelease"]
95
+ addTagTypes: ["Release", "ReleaseAction", "EntriesInRelease"],
96
+ endpoints: {
97
+ updateDocument: {
98
+ invalidatesTags: [
99
+ { type: "Release", id: "LIST" },
100
+ { type: "ReleaseAction", id: "LIST" }
101
+ ]
102
+ },
103
+ deleteDocument: {
104
+ invalidatesTags: [
105
+ { type: "Release", id: "LIST" },
106
+ { type: "ReleaseAction", id: "LIST" }
107
+ ]
108
+ },
109
+ deleteManyDocuments: {
110
+ invalidatesTags: [
111
+ { type: "Release", id: "LIST" },
112
+ { type: "ReleaseAction", id: "LIST" }
113
+ ]
114
+ },
115
+ discardDocument: {
116
+ invalidatesTags: [
117
+ { type: "Release", id: "LIST" },
118
+ { type: "ReleaseAction", id: "LIST" }
119
+ ]
120
+ }
121
+ }
97
122
  }).injectEndpoints({
98
123
  endpoints: (build) => {
99
124
  return {
100
125
  getReleasesForEntry: build.query({
101
126
  query(params) {
102
127
  return {
103
- url: "/content-releases",
128
+ url: "/content-releases/getByDocumentAttached",
104
129
  method: "GET",
105
130
  config: {
106
131
  params
@@ -322,182 +347,6 @@ const {
322
347
  useDeleteReleaseMutation,
323
348
  useGetMappedEntriesInReleasesQuery
324
349
  } = releaseApi;
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
- };
341
- const StyledMenuItem = styled(Menu.Item)`
342
- &:hover {
343
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
344
-
345
- svg {
346
- fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
347
- }
348
-
349
- a {
350
- color: ${({ theme }) => theme.colors.neutral800};
351
- }
352
- }
353
-
354
- svg {
355
- fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
356
- }
357
-
358
- a {
359
- color: ${({ theme }) => theme.colors.neutral800};
360
- }
361
-
362
- span,
363
- a {
364
- width: 100%;
365
- }
366
- `;
367
- const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
368
- const { formatMessage } = useIntl();
369
- const { toggleNotification } = useNotification();
370
- const { formatAPIError } = useAPIErrorHandler();
371
- const [deleteReleaseAction] = useDeleteReleaseActionMutation();
372
- const {
373
- allowedActions: { canDeleteAction }
374
- } = useRBAC(PERMISSIONS);
375
- const handleDeleteAction = async () => {
376
- const response = await deleteReleaseAction({
377
- params: { releaseId, actionId }
378
- });
379
- if ("data" in response) {
380
- toggleNotification({
381
- type: "success",
382
- message: formatMessage({
383
- id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
384
- defaultMessage: "Entry removed from release"
385
- })
386
- });
387
- return;
388
- }
389
- if ("error" in response) {
390
- if (isFetchError(response.error)) {
391
- toggleNotification({
392
- type: "danger",
393
- message: formatAPIError(response.error)
394
- });
395
- } else {
396
- toggleNotification({
397
- type: "danger",
398
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
399
- });
400
- }
401
- }
402
- };
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" }),
408
- /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
409
- id: "content-releases.content-manager-edit-view.remove-from-release",
410
- defaultMessage: "Remove from release"
411
- }) })
412
- ] }) });
413
- };
414
- const ReleaseActionEntryLinkItem = ({
415
- contentTypeUid,
416
- entryId,
417
- locale
418
- }) => {
419
- const { formatMessage } = useIntl();
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
- }
443
- return /* @__PURE__ */ jsx(
444
- StyledMenuItem,
445
- {
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
- ] })
459
- }
460
- );
461
- };
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 }) => {
476
- const { formatMessage } = useIntl();
477
- const { allowedActions } = useRBAC(PERMISSIONS);
478
- return (
479
- // A user can access the dropdown if they have permissions to delete a release-action OR update a release
480
- allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
481
- /* @__PURE__ */ jsx(Menu.Trigger, { paddingLeft: 2, paddingRight: 2, children: /* @__PURE__ */ jsx(
482
- AccessibleIcon,
483
- {
484
- label: formatMessage({
485
- id: "content-releases.content-manager-edit-view.release-action-menu",
486
- defaultMessage: "Release action options"
487
- }),
488
- children: /* @__PURE__ */ jsx(More, {})
489
- }
490
- ) }),
491
- /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
492
- ] }) : null
493
- );
494
- };
495
- const ReleaseActionMenu = {
496
- Root,
497
- EditReleaseItem,
498
- DeleteReleaseActionItem,
499
- ReleaseActionEntryLinkItem
500
- };
501
350
  const getBorderLeftRadiusValue = (actionType) => {
502
351
  return actionType === "publish" ? 1 : 0;
503
352
  };
@@ -640,54 +489,252 @@ const NoReleases = () => {
640
489
  defaultMessage: "Open the list of releases"
641
490
  })
642
491
  }
643
- )
492
+ ),
493
+ shadow: "none"
644
494
  }
645
495
  );
646
496
  };
647
497
  const AddActionToReleaseModal = ({
648
- open,
649
- onOpenChange,
650
- contentTypeUid,
651
- entryId
498
+ contentType,
499
+ documentId,
500
+ onInputChange,
501
+ values
652
502
  }) => {
653
503
  const { formatMessage } = useIntl();
654
- const { toggleNotification } = useNotification();
655
- const { formatAPIError } = useAPIErrorHandler();
656
504
  const [{ query }] = useQueryParams();
657
505
  const locale = query.plugins?.i18n?.locale;
658
506
  const response = useGetReleasesForEntryQuery({
659
- contentTypeUid,
660
- entryId,
661
- hasEntryAttached: false
507
+ contentType,
508
+ entryDocumentId: documentId,
509
+ hasEntryAttached: false,
510
+ locale
662
511
  });
663
512
  const releases = response.data?.data;
513
+ if (releases?.length === 0) {
514
+ return /* @__PURE__ */ jsx(NoReleases, {});
515
+ }
516
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
517
+ /* @__PURE__ */ jsx(Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxs(Field.Root, { required: true, children: [
518
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
519
+ id: "content-releases.content-manager-edit-view.add-to-release.select-label",
520
+ defaultMessage: "Select a release"
521
+ }) }),
522
+ /* @__PURE__ */ jsx(
523
+ SingleSelect,
524
+ {
525
+ required: true,
526
+ placeholder: formatMessage({
527
+ id: "content-releases.content-manager-edit-view.add-to-release.select-placeholder",
528
+ defaultMessage: "Select"
529
+ }),
530
+ name: "releaseId",
531
+ onChange: (value) => onInputChange("releaseId", value),
532
+ value: values.releaseId,
533
+ children: releases?.map((release) => /* @__PURE__ */ jsx(SingleSelectOption, { value: release.id, children: release.name }, release.id))
534
+ }
535
+ )
536
+ ] }) }),
537
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
538
+ id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
539
+ defaultMessage: "What do you want to do with this entry?"
540
+ }) }),
541
+ /* @__PURE__ */ jsx(
542
+ ReleaseActionOptions,
543
+ {
544
+ selected: values.type,
545
+ handleChange: (e) => onInputChange("type", e.target.value),
546
+ name: "type"
547
+ }
548
+ )
549
+ ] });
550
+ };
551
+ const ReleaseActionModalForm = ({
552
+ documentId,
553
+ model,
554
+ collectionType
555
+ }) => {
556
+ const { formatMessage } = useIntl();
557
+ const { allowedActions } = useRBAC(PERMISSIONS);
558
+ const { canCreateAction } = allowedActions;
664
559
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
665
- const handleSubmit = async (values) => {
666
- const releaseActionEntry = {
667
- contentType: contentTypeUid,
668
- id: entryId,
669
- locale
670
- };
671
- const response2 = await createReleaseAction({
672
- body: { type: values.type, entry: releaseActionEntry },
673
- params: { releaseId: values.releaseId }
560
+ const { toggleNotification } = useNotification();
561
+ const { formatAPIError } = useAPIErrorHandler();
562
+ const [{ query }] = useQueryParams();
563
+ const locale = query.plugins?.i18n?.locale;
564
+ const handleSubmit = async (e, onClose) => {
565
+ try {
566
+ await formik.handleSubmit(e);
567
+ onClose();
568
+ } catch (error) {
569
+ if (isFetchError(error)) {
570
+ toggleNotification({
571
+ type: "danger",
572
+ message: formatAPIError(error)
573
+ });
574
+ } else {
575
+ toggleNotification({
576
+ type: "danger",
577
+ message: formatMessage({
578
+ id: "notification.error",
579
+ defaultMessage: "An error occurred"
580
+ })
581
+ });
582
+ }
583
+ }
584
+ };
585
+ const formik = useFormik({
586
+ initialValues: INITIAL_VALUES,
587
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
588
+ onSubmit: async (values) => {
589
+ if (collectionType === "collection-types" && !documentId) {
590
+ throw new Error("Document id is required");
591
+ }
592
+ const response = await createReleaseAction({
593
+ body: {
594
+ type: values.type,
595
+ contentType: model,
596
+ entryDocumentId: documentId,
597
+ locale
598
+ },
599
+ params: { releaseId: values.releaseId }
600
+ });
601
+ if ("data" in response) {
602
+ toggleNotification({
603
+ type: "success",
604
+ message: formatMessage({
605
+ id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
606
+ defaultMessage: "Entry added to release"
607
+ })
608
+ });
609
+ return;
610
+ }
611
+ if ("error" in response) {
612
+ throw response.error;
613
+ }
614
+ }
615
+ });
616
+ const {
617
+ edit: { options }
618
+ } = unstable_useDocumentLayout(model);
619
+ if (!window.strapi.isEE || !options?.draftAndPublish || !canCreateAction) {
620
+ return null;
621
+ }
622
+ if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
623
+ return null;
624
+ }
625
+ return {
626
+ label: formatMessage({
627
+ id: "content-releases.content-manager-edit-view.add-to-release",
628
+ defaultMessage: "Add to release"
629
+ }),
630
+ icon: /* @__PURE__ */ jsx(Cursor, {}),
631
+ position: ["panel", "table-row"],
632
+ dialog: {
633
+ type: "modal",
634
+ title: formatMessage({
635
+ id: "content-releases.content-manager-edit-view.add-to-release",
636
+ defaultMessage: "Add to release"
637
+ }),
638
+ content: /* @__PURE__ */ jsx(
639
+ AddActionToReleaseModal,
640
+ {
641
+ contentType: model,
642
+ documentId,
643
+ onInputChange: formik.setFieldValue,
644
+ values: formik.values
645
+ }
646
+ ),
647
+ footer: ({ onClose }) => /* @__PURE__ */ jsxs(Modal.Footer, { children: [
648
+ /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
649
+ id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
650
+ defaultMessage: "Cancel"
651
+ }) }),
652
+ /* @__PURE__ */ jsx(
653
+ Button,
654
+ {
655
+ type: "submit",
656
+ onClick: (e) => handleSubmit(e, onClose),
657
+ disabled: !formik.values.releaseId,
658
+ loading: isLoading,
659
+ children: formatMessage({
660
+ id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
661
+ defaultMessage: "Continue"
662
+ })
663
+ }
664
+ )
665
+ ] })
666
+ }
667
+ };
668
+ };
669
+ const getTimezoneOffset = (timezone, date) => {
670
+ try {
671
+ const offsetPart = new Intl.DateTimeFormat("en", {
672
+ timeZone: timezone,
673
+ timeZoneName: "longOffset"
674
+ }).formatToParts(date).find((part) => part.type === "timeZoneName");
675
+ const offset = offsetPart ? offsetPart.value : "";
676
+ let utcOffset = offset.replace("GMT", "UTC");
677
+ if (!utcOffset.includes("+") && !utcOffset.includes("-")) {
678
+ utcOffset = `${utcOffset}+00:00`;
679
+ }
680
+ return utcOffset;
681
+ } catch (error) {
682
+ return "";
683
+ }
684
+ };
685
+ const StyledMenuItem = styled(Menu.Item)`
686
+ &:hover {
687
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
688
+
689
+ svg {
690
+ fill: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}600`]};
691
+ }
692
+
693
+ a {
694
+ color: ${({ theme }) => theme.colors.neutral800};
695
+ }
696
+ }
697
+
698
+ svg {
699
+ color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}500`]};
700
+ }
701
+
702
+ span {
703
+ color: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}800`]};
704
+ }
705
+
706
+ span,
707
+ a {
708
+ width: 100%;
709
+ }
710
+ `;
711
+ const DeleteReleaseActionItem = ({ releaseId, actionId }) => {
712
+ const { formatMessage } = useIntl();
713
+ const { toggleNotification } = useNotification();
714
+ const { formatAPIError } = useAPIErrorHandler();
715
+ const [deleteReleaseAction] = useDeleteReleaseActionMutation();
716
+ const {
717
+ allowedActions: { canDeleteAction }
718
+ } = useRBAC(PERMISSIONS);
719
+ const handleDeleteAction = async () => {
720
+ const response = await deleteReleaseAction({
721
+ params: { releaseId, actionId }
674
722
  });
675
- if ("data" in response2) {
723
+ if ("data" in response) {
676
724
  toggleNotification({
677
725
  type: "success",
678
726
  message: formatMessage({
679
- id: "content-releases.content-manager-edit-view.add-to-release.notification.success",
680
- defaultMessage: "Entry added to release"
727
+ id: "content-releases.content-manager-edit-view.remove-from-release.notification.success",
728
+ defaultMessage: "Entry removed from release"
681
729
  })
682
730
  });
683
- onOpenChange();
684
731
  return;
685
732
  }
686
- if ("error" in response2) {
687
- if (isFetchError(response2.error)) {
733
+ if ("error" in response) {
734
+ if (isFetchError(response.error)) {
688
735
  toggleNotification({
689
736
  type: "danger",
690
- message: formatAPIError(response2.error)
737
+ message: formatAPIError(response.error)
691
738
  });
692
739
  } else {
693
740
  toggleNotification({
@@ -697,231 +744,214 @@ const AddActionToReleaseModal = ({
697
744
  }
698
745
  }
699
746
  };
700
- return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
701
- /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { fontWeight: "bold", children: formatMessage({
702
- id: "content-releases.content-manager-edit-view.add-to-release",
703
- defaultMessage: "Add to release"
704
- }) }) }),
705
- /* @__PURE__ */ jsx(
706
- Formik,
747
+ if (!canDeleteAction) {
748
+ return null;
749
+ }
750
+ return /* @__PURE__ */ jsx(StyledMenuItem, { $variant: "danger", onSelect: handleDeleteAction, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
751
+ /* @__PURE__ */ jsx(Cross, { width: "1.6rem", height: "1.6rem" }),
752
+ /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", children: formatMessage({
753
+ id: "content-releases.content-manager-edit-view.remove-from-release",
754
+ defaultMessage: "Remove from release"
755
+ }) })
756
+ ] }) });
757
+ };
758
+ const ReleaseActionEntryLinkItem = ({
759
+ contentTypeUid,
760
+ documentId,
761
+ locale
762
+ }) => {
763
+ const { formatMessage } = useIntl();
764
+ const userPermissions = useAuth("ReleaseActionEntryLinkItem", (state) => state.permissions);
765
+ const canUpdateEntryForLocale = React.useMemo(() => {
766
+ const updatePermissions = userPermissions.find(
767
+ (permission) => permission.subject === contentTypeUid && permission.action === "plugin::content-manager.explorer.update"
768
+ );
769
+ if (!updatePermissions) {
770
+ return false;
771
+ }
772
+ return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));
773
+ }, [contentTypeUid, locale, userPermissions]);
774
+ const {
775
+ allowedActions: { canUpdate: canUpdateContentType }
776
+ } = useRBAC({
777
+ updateContentType: [
707
778
  {
708
- onSubmit: handleSubmit,
709
- validationSchema: RELEASE_ACTION_FORM_SCHEMA,
710
- initialValues: INITIAL_VALUES,
711
- children: ({ values, setFieldValue }) => {
712
- return /* @__PURE__ */ jsxs(Form, { children: [
713
- releases?.length === 0 ? /* @__PURE__ */ jsx(NoReleases, {}) : /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
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({
733
- id: "content-releases.content-manager-edit-view.add-to-release.action-type-label",
734
- defaultMessage: "What do you want to do with this entry?"
735
- }) }),
736
- /* @__PURE__ */ jsx(
737
- ReleaseActionOptions,
738
- {
739
- selected: values.type,
740
- handleChange: (e) => setFieldValue("type", e.target.value),
741
- name: "type"
742
- }
743
- )
744
- ] }) }),
745
- /* @__PURE__ */ jsxs(Modal.Footer, { children: [
746
- /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({
747
- id: "content-releases.content-manager-edit-view.add-to-release.cancel-button",
748
- defaultMessage: "Cancel"
749
- }) }) }),
750
- /* @__PURE__ */ jsx(Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
751
- id: "content-releases.content-manager-edit-view.add-to-release.continue-button",
752
- defaultMessage: "Continue"
753
- }) })
754
- ] })
755
- ] });
756
- }
779
+ action: "plugin::content-manager.explorer.update",
780
+ subject: contentTypeUid
757
781
  }
758
- )
759
- ] }) });
782
+ ]
783
+ });
784
+ if (!canUpdateContentType || !canUpdateEntryForLocale) {
785
+ return null;
786
+ }
787
+ return /* @__PURE__ */ jsx(
788
+ StyledMenuItem,
789
+ {
790
+ tag: NavLink,
791
+ isLink: true,
792
+ to: {
793
+ pathname: `/content-manager/collection-types/${contentTypeUid}/${documentId}`,
794
+ search: locale && `?plugins[i18n][locale]=${locale}`
795
+ },
796
+ children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
797
+ /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
798
+ /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
799
+ id: "content-releases.content-manager-edit-view.edit-entry",
800
+ defaultMessage: "Edit entry"
801
+ }) })
802
+ ] })
803
+ }
804
+ );
805
+ };
806
+ const EditReleaseItem = ({ releaseId }) => {
807
+ const { formatMessage } = useIntl();
808
+ return (
809
+ /* @ts-expect-error inference isn't working in DS */
810
+ /* @__PURE__ */ jsx(StyledMenuItem, { tag: NavLink, isLink: true, to: `/plugins/content-releases/${releaseId}`, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
811
+ /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" }),
812
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", variant: "omega", children: formatMessage({
813
+ id: "content-releases.content-manager-edit-view.edit-release",
814
+ defaultMessage: "Edit release"
815
+ }) })
816
+ ] }) })
817
+ );
818
+ };
819
+ const Root = ({ children }) => {
820
+ const { formatMessage } = useIntl();
821
+ const { allowedActions } = useRBAC(PERMISSIONS);
822
+ return (
823
+ // A user can access the dropdown if they have permissions to delete a release-action OR update a release
824
+ allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxs(Menu.Root, { children: [
825
+ /* @__PURE__ */ jsx(Menu.Trigger, { variant: "tertiary", endIcon: null, paddingLeft: 2, paddingRight: 2, children: /* @__PURE__ */ jsx(
826
+ AccessibleIcon,
827
+ {
828
+ label: formatMessage({
829
+ id: "content-releases.content-manager-edit-view.release-action-menu",
830
+ defaultMessage: "Release action options"
831
+ }),
832
+ children: /* @__PURE__ */ jsx(More, {})
833
+ }
834
+ ) }),
835
+ /* @__PURE__ */ jsx(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children })
836
+ ] }) : null
837
+ );
838
+ };
839
+ const ReleaseActionMenu = {
840
+ Root,
841
+ EditReleaseItem,
842
+ DeleteReleaseActionItem,
843
+ ReleaseActionEntryLinkItem
760
844
  };
761
- const CMReleasesContainer = () => {
762
- const [isModalOpen, setIsModalOpen] = React.useState(false);
845
+ const Panel = ({ model, documentId, collectionType }) => {
846
+ const [{ query }] = useQueryParams();
847
+ const locale = query.plugins?.i18n?.locale;
848
+ const {
849
+ edit: { options }
850
+ } = unstable_useDocumentLayout(model);
763
851
  const { formatMessage, formatDate, formatTime } = useIntl();
764
- const { id, slug, collectionType } = useParams();
765
- const isCreatingEntry = id === "create";
766
- const entryId = parseInt(id, 10);
767
852
  const { allowedActions } = useRBAC(PERMISSIONS);
768
- const { canCreateAction, canRead: canMain, canDeleteAction } = allowedActions;
769
- const { schema } = unstable_useDocument({
770
- collectionType,
771
- model: slug
772
- });
773
- const hasDraftAndPublish = schema?.options?.draftAndPublish;
774
- const contentTypeUid = slug;
775
- const canFetch = id != null && contentTypeUid != null;
776
- const fetchParams = canFetch ? {
777
- contentTypeUid,
778
- entryId,
853
+ const { canRead, canDeleteAction } = allowedActions;
854
+ const response = useGetReleasesForEntryQuery({
855
+ contentType: model,
856
+ entryDocumentId: documentId,
857
+ locale,
779
858
  hasEntryAttached: true
780
- } : skipToken;
781
- const response = useGetReleasesForEntryQuery(fetchParams);
859
+ });
782
860
  const releases = response.data?.data;
783
- if (!canFetch) {
784
- return null;
785
- }
786
- if (isCreatingEntry || !hasDraftAndPublish) {
787
- return null;
788
- }
789
- const toggleModal = () => setIsModalOpen((prev) => !prev);
790
861
  const getReleaseColorVariant = (actionType, shade) => {
791
862
  if (actionType === "unpublish") {
792
863
  return `secondary${shade}`;
793
864
  }
794
865
  return `success${shade}`;
795
866
  };
796
- if (!canMain) {
867
+ if (!window.strapi.isEE || !options?.draftAndPublish || !canRead) {
797
868
  return null;
798
869
  }
799
- return /* @__PURE__ */ jsxs(
800
- Box,
801
- {
802
- tag: "aside",
803
- "aria-label": formatMessage({
804
- id: "content-releases.plugin.name",
805
- defaultMessage: "Releases"
806
- }),
807
- background: "neutral0",
808
- borderColor: "neutral150",
809
- hasRadius: true,
810
- padding: 4,
811
- shadow: "tableShadow",
812
- children: [
813
- /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 3, children: [
814
- /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", children: formatMessage({
815
- id: "content-releases.plugin.name",
816
- defaultMessage: "Releases"
817
- }) }),
818
- releases?.map((release) => {
819
- return /* @__PURE__ */ jsxs(
820
- Flex,
821
- {
822
- direction: "column",
823
- alignItems: "start",
824
- borderWidth: "1px",
825
- borderStyle: "solid",
826
- borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
827
- overflow: "hidden",
828
- hasRadius: true,
829
- children: [
830
- /* @__PURE__ */ jsx(
831
- Box,
832
- {
833
- paddingTop: 3,
834
- paddingBottom: 3,
835
- paddingLeft: 4,
836
- paddingRight: 4,
837
- background: getReleaseColorVariant(release.actions[0].type, "100"),
838
- width: "100%",
839
- children: /* @__PURE__ */ jsx(
840
- Typography,
841
- {
842
- fontSize: 1,
843
- variant: "pi",
844
- textColor: getReleaseColorVariant(release.actions[0].type, "600"),
845
- children: formatMessage(
846
- {
847
- id: "content-releases.content-manager-edit-view.list-releases.title",
848
- defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
849
- },
850
- { isPublish: release.actions[0].type === "publish" }
851
- )
852
- }
853
- )
854
- }
855
- ),
856
- /* @__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: [
857
- /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
858
- release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
859
- {
860
- id: "content-releases.content-manager-edit-view.scheduled.date",
861
- defaultMessage: "{date} at {time} ({offset})"
862
- },
863
- {
864
- date: formatDate(new Date(release.scheduledAt), {
865
- day: "2-digit",
866
- month: "2-digit",
867
- year: "numeric",
868
- timeZone: release.timezone
869
- }),
870
- time: formatTime(new Date(release.scheduledAt), {
871
- hourCycle: "h23",
872
- timeZone: release.timezone
873
- }),
874
- offset: getTimezoneOffset(
875
- release.timezone,
876
- new Date(release.scheduledAt)
877
- )
878
- }
879
- ) }),
880
- canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
881
- /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
882
- /* @__PURE__ */ jsx(
883
- ReleaseActionMenu.DeleteReleaseActionItem,
884
- {
885
- releaseId: release.id,
886
- actionId: release.actions[0].id
887
- }
888
- )
889
- ] }) : null
890
- ] }) })
891
- ]
892
- },
893
- release.id
894
- );
895
- }),
896
- canCreateAction ? /* @__PURE__ */ jsx(
897
- Button,
870
+ if (collectionType === "collection-types" && (!documentId || documentId === "create")) {
871
+ return null;
872
+ }
873
+ if (releases && releases.length === 0) {
874
+ return null;
875
+ }
876
+ return {
877
+ title: formatMessage({
878
+ id: "content-releases.plugin.name",
879
+ defaultMessage: "Releases"
880
+ }),
881
+ content: /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 3, width: "100%", children: releases?.map((release) => /* @__PURE__ */ jsxs(
882
+ Flex,
883
+ {
884
+ direction: "column",
885
+ alignItems: "start",
886
+ borderWidth: "1px",
887
+ borderStyle: "solid",
888
+ borderColor: getReleaseColorVariant(release.actions[0].type, "200"),
889
+ overflow: "hidden",
890
+ hasRadius: true,
891
+ children: [
892
+ /* @__PURE__ */ jsx(
893
+ Box,
898
894
  {
899
- justifyContent: "center",
895
+ paddingTop: 3,
896
+ paddingBottom: 3,
900
897
  paddingLeft: 4,
901
898
  paddingRight: 4,
902
- color: "neutral700",
903
- variant: "tertiary",
904
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
905
- onClick: toggleModal,
906
- children: formatMessage({
907
- id: "content-releases.content-manager-edit-view.add-to-release",
908
- defaultMessage: "Add to release"
909
- })
899
+ background: getReleaseColorVariant(release.actions[0].type, "100"),
900
+ width: "100%",
901
+ children: /* @__PURE__ */ jsx(
902
+ Typography,
903
+ {
904
+ fontSize: 1,
905
+ variant: "pi",
906
+ textColor: getReleaseColorVariant(release.actions[0].type, "600"),
907
+ children: formatMessage(
908
+ {
909
+ id: "content-releases.content-manager-edit-view.list-releases.title",
910
+ defaultMessage: "{isPublish, select, true {Will be published in} other {Will be unpublished in}}"
911
+ },
912
+ { isPublish: release.actions[0].type === "publish" }
913
+ )
914
+ }
915
+ )
910
916
  }
911
- ) : null
912
- ] }),
913
- /* @__PURE__ */ jsx(
914
- AddActionToReleaseModal,
915
- {
916
- open: isModalOpen,
917
- onOpenChange: toggleModal,
918
- contentTypeUid,
919
- entryId
920
- }
921
- )
922
- ]
923
- }
924
- );
917
+ ),
918
+ /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
919
+ /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
920
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
921
+ {
922
+ id: "content-releases.content-manager-edit-view.scheduled.date",
923
+ defaultMessage: "{date} at {time} ({offset})"
924
+ },
925
+ {
926
+ date: formatDate(new Date(release.scheduledAt), {
927
+ day: "2-digit",
928
+ month: "2-digit",
929
+ year: "numeric",
930
+ timeZone: release.timezone
931
+ }),
932
+ time: formatTime(new Date(release.scheduledAt), {
933
+ hourCycle: "h23",
934
+ timeZone: release.timezone
935
+ }),
936
+ offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
937
+ }
938
+ ) }),
939
+ canDeleteAction ? /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { hasTriggerBorder: true, children: [
940
+ /* @__PURE__ */ jsx(ReleaseActionMenu.EditReleaseItem, { releaseId: release.id }),
941
+ /* @__PURE__ */ jsx(
942
+ ReleaseActionMenu.DeleteReleaseActionItem,
943
+ {
944
+ releaseId: release.id,
945
+ actionId: release.actions[0].id
946
+ }
947
+ )
948
+ ] }) : null
949
+ ] })
950
+ ]
951
+ },
952
+ release.id
953
+ )) })
954
+ };
925
955
  };
926
956
  const pluginId = "content-releases";
927
957
  const prefixPluginTranslations = (trad, pluginId2) => {
@@ -945,18 +975,38 @@ const admin = {
945
975
  id: `${pluginId}.plugin.name`,
946
976
  defaultMessage: "Releases"
947
977
  },
948
- Component: () => import("./App-B2R2exNT.mjs").then((mod) => ({ default: mod.App })),
978
+ Component: () => import("./App-DcXlnXrr.mjs").then((mod) => ({ default: mod.App })),
949
979
  permissions: PERMISSIONS.main,
950
980
  position: 2
951
981
  });
952
- app.getPlugin("content-manager").injectComponent("editView", "right-links", {
953
- name: `${pluginId}-link`,
954
- Component: CMReleasesContainer
982
+ const contentManagerPluginApis = app.getPlugin("content-manager").apis;
983
+ if ("addEditViewSidePanel" in contentManagerPluginApis && typeof contentManagerPluginApis.addEditViewSidePanel === "function") {
984
+ contentManagerPluginApis.addEditViewSidePanel([Panel]);
985
+ }
986
+ if ("addDocumentAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addDocumentAction === "function") {
987
+ contentManagerPluginApis.addDocumentAction((actions) => {
988
+ const indexOfDeleteAction = actions.findIndex((action) => action.type === "unpublish");
989
+ actions.splice(indexOfDeleteAction, 0, ReleaseActionModalForm);
990
+ return actions;
991
+ });
992
+ }
993
+ app.addSettingsLink("global", {
994
+ id: pluginId,
995
+ to: "releases",
996
+ intlLabel: {
997
+ id: `${pluginId}.plugin.name`,
998
+ defaultMessage: "Releases"
999
+ },
1000
+ permissions: [],
1001
+ async Component() {
1002
+ const { SettingsPage } = await import("./SettingsPage-w5dOMAtL.mjs");
1003
+ return { default: SettingsPage };
1004
+ }
955
1005
  });
956
1006
  } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
957
- app.addMenuLink({
958
- to: `/plugins/purchase-content-releases`,
959
- icon: PaperPlane,
1007
+ app.addSettingsLink("global", {
1008
+ id: pluginId,
1009
+ to: "/plugins/purchase-content-releases",
960
1010
  intlLabel: {
961
1011
  id: `${pluginId}.plugin.name`,
962
1012
  defaultMessage: "Releases"
@@ -966,15 +1016,14 @@ const admin = {
966
1016
  const { PurchaseContentReleases } = await import("./PurchaseContentReleases-_MxP6-Dt.mjs");
967
1017
  return { default: PurchaseContentReleases };
968
1018
  },
969
- licenseOnly: true,
970
- position: 2
1019
+ licenseOnly: true
971
1020
  });
972
1021
  }
973
1022
  },
974
1023
  async registerTrads({ locales }) {
975
1024
  const importedTrads = await Promise.all(
976
1025
  locales.map((locale) => {
977
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-B9Ur3VsE.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1026
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-ahPQUZv2.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
978
1027
  return {
979
1028
  data: prefixPluginTranslations(data, "content-releases"),
980
1029
  locale
@@ -1007,4 +1056,4 @@ export {
1007
1056
  releaseApi as r,
1008
1057
  useGetReleasesQuery as u
1009
1058
  };
1010
- //# sourceMappingURL=index-DbmynICx.mjs.map
1059
+ //# sourceMappingURL=index-LUuvped4.mjs.map