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