@strapi/content-releases 0.0.0-experimental.e3e48deb89bd0a1b6cc69b698696566fa7854a95 → 0.0.0-experimental.e5740babedd53cf5b6af99d74920b6b9ef1e4c11

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 (99) hide show
  1. package/dist/_chunks/{App-PQlYzNfb.mjs → App-HVXzE3i3.mjs} +256 -280
  2. package/dist/_chunks/App-HVXzE3i3.mjs.map +1 -0
  3. package/dist/_chunks/{App-lzeJz92X.js → App-l62gIUTX.js} +254 -278
  4. package/dist/_chunks/App-l62gIUTX.js.map +1 -0
  5. package/dist/_chunks/{en-WuuhP6Bn.mjs → en-RdapH-9X.mjs} +1 -2
  6. package/dist/_chunks/en-RdapH-9X.mjs.map +1 -0
  7. package/dist/_chunks/{en-gcJJ5htG.js → en-faJDuv3q.js} +1 -2
  8. package/dist/_chunks/en-faJDuv3q.js.map +1 -0
  9. package/dist/_chunks/{index-Nf1JfI-m.js → index-ML_b3php.js} +28 -22
  10. package/dist/_chunks/index-ML_b3php.js.map +1 -0
  11. package/dist/_chunks/{index--4AgLDzb.mjs → index-Ys87ROOe.mjs} +32 -26
  12. package/dist/_chunks/index-Ys87ROOe.mjs.map +1 -0
  13. package/dist/admin/index.js +1 -1
  14. package/dist/admin/index.mjs +1 -1
  15. package/dist/server/index.js +344 -203
  16. package/dist/server/index.js.map +1 -1
  17. package/dist/server/index.mjs +344 -204
  18. package/dist/server/index.mjs.map +1 -1
  19. package/package.json +21 -14
  20. package/dist/_chunks/App-PQlYzNfb.mjs.map +0 -1
  21. package/dist/_chunks/App-lzeJz92X.js.map +0 -1
  22. package/dist/_chunks/en-WuuhP6Bn.mjs.map +0 -1
  23. package/dist/_chunks/en-gcJJ5htG.js.map +0 -1
  24. package/dist/_chunks/index--4AgLDzb.mjs.map +0 -1
  25. package/dist/_chunks/index-Nf1JfI-m.js.map +0 -1
  26. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  27. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  28. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  29. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  30. package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
  31. package/dist/admin/src/constants.d.ts +0 -58
  32. package/dist/admin/src/index.d.ts +0 -3
  33. package/dist/admin/src/pages/App.d.ts +0 -1
  34. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  35. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  36. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  37. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  38. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  39. package/dist/admin/src/pluginId.d.ts +0 -1
  40. package/dist/admin/src/services/axios.d.ts +0 -29
  41. package/dist/admin/src/services/release.d.ts +0 -369
  42. package/dist/admin/src/store/hooks.d.ts +0 -7
  43. package/dist/admin/src/utils/time.d.ts +0 -1
  44. package/dist/server/src/bootstrap.d.ts +0 -5
  45. package/dist/server/src/bootstrap.d.ts.map +0 -1
  46. package/dist/server/src/constants.d.ts +0 -12
  47. package/dist/server/src/constants.d.ts.map +0 -1
  48. package/dist/server/src/content-types/index.d.ts +0 -99
  49. package/dist/server/src/content-types/index.d.ts.map +0 -1
  50. package/dist/server/src/content-types/release/index.d.ts +0 -48
  51. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  52. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  53. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  54. package/dist/server/src/content-types/release-action/index.d.ts +0 -50
  55. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  56. package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
  57. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  58. package/dist/server/src/controllers/index.d.ts +0 -18
  59. package/dist/server/src/controllers/index.d.ts.map +0 -1
  60. package/dist/server/src/controllers/release-action.d.ts +0 -9
  61. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  62. package/dist/server/src/controllers/release.d.ts +0 -11
  63. package/dist/server/src/controllers/release.d.ts.map +0 -1
  64. package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
  65. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  66. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  67. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  68. package/dist/server/src/destroy.d.ts +0 -5
  69. package/dist/server/src/destroy.d.ts.map +0 -1
  70. package/dist/server/src/index.d.ts +0 -2092
  71. package/dist/server/src/index.d.ts.map +0 -1
  72. package/dist/server/src/migrations/index.d.ts +0 -10
  73. package/dist/server/src/migrations/index.d.ts.map +0 -1
  74. package/dist/server/src/register.d.ts +0 -5
  75. package/dist/server/src/register.d.ts.map +0 -1
  76. package/dist/server/src/routes/index.d.ts +0 -35
  77. package/dist/server/src/routes/index.d.ts.map +0 -1
  78. package/dist/server/src/routes/release-action.d.ts +0 -18
  79. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  80. package/dist/server/src/routes/release.d.ts +0 -18
  81. package/dist/server/src/routes/release.d.ts.map +0 -1
  82. package/dist/server/src/services/index.d.ts +0 -1826
  83. package/dist/server/src/services/index.d.ts.map +0 -1
  84. package/dist/server/src/services/release.d.ts +0 -66
  85. package/dist/server/src/services/release.d.ts.map +0 -1
  86. package/dist/server/src/services/scheduling.d.ts +0 -18
  87. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  88. package/dist/server/src/services/validation.d.ts +0 -14
  89. package/dist/server/src/services/validation.d.ts.map +0 -1
  90. package/dist/server/src/utils/index.d.ts +0 -14
  91. package/dist/server/src/utils/index.d.ts.map +0 -1
  92. package/dist/shared/contracts/release-actions.d.ts +0 -105
  93. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  94. package/dist/shared/contracts/releases.d.ts +0 -166
  95. package/dist/shared/contracts/releases.d.ts.map +0 -1
  96. package/dist/shared/types.d.ts +0 -24
  97. package/dist/shared/types.d.ts.map +0 -1
  98. package/dist/shared/validation-schemas.d.ts +0 -2
  99. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -1,14 +1,14 @@
1
- import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useQueryParams, prefixPluginTranslations } from "@strapi/helper-plugin";
2
- import { Cross, Pencil, More, Plus, EmptyDocuments, PaperPlane } from "@strapi/icons";
1
+ import { getFetchClient, useNotification, useAPIErrorHandler, CheckPermissions, useCMEditViewDataManager, NoContent, prefixPluginTranslations } from "@strapi/helper-plugin";
2
+ import { Cross, Pencil, More, Plus, PaperPlane } from "@strapi/icons";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
5
  import { skipToken } from "@reduxjs/toolkit/query";
6
- import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter, EmptyStateLayout } from "@strapi/design-system";
6
+ import { IconButton, Flex, Icon, Typography, Field, FieldLabel, VisuallyHidden, FieldInput, Box, Button, ModalLayout, ModalHeader, ModalBody, SingleSelect, SingleSelectOption, ModalFooter } from "@strapi/design-system";
7
7
  import { Menu, Link, LinkButton } from "@strapi/design-system/v2";
8
8
  import { isAxiosError as isAxiosError$1 } from "axios";
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 { NavLink, Link as Link$1 } from "react-router-dom";
12
12
  import * as yup from "yup";
13
13
  import { createApi } from "@reduxjs/toolkit/query/react";
14
14
  import styled from "styled-components";
@@ -288,8 +288,9 @@ const releaseApi = createApi({
288
288
  method: "DELETE"
289
289
  };
290
290
  },
291
- invalidatesTags: [
291
+ invalidatesTags: (result, error, arg) => [
292
292
  { type: "Release", id: "LIST" },
293
+ { type: "Release", id: arg.params.releaseId },
293
294
  { type: "ReleaseAction", id: "LIST" }
294
295
  ]
295
296
  }),
@@ -309,7 +310,7 @@ const releaseApi = createApi({
309
310
  method: "DELETE"
310
311
  };
311
312
  },
312
- invalidatesTags: (result, error, arg) => [{ type: "Release", id: arg.id }]
313
+ invalidatesTags: () => [{ type: "Release", id: "LIST" }]
313
314
  })
314
315
  };
315
316
  }
@@ -467,9 +468,9 @@ const EditReleaseItem = ({ releaseId }) => {
467
468
  return /* @__PURE__ */ jsx(StyledMenuItem, { children: /* @__PURE__ */ jsx(
468
469
  Link,
469
470
  {
470
- as: NavLink,
471
- to: `/plugins/content-releases/${releaseId}`,
471
+ href: `/admin/plugins/content-releases/${releaseId}`,
472
472
  startIcon: /* @__PURE__ */ jsx(Icon, { as: Pencil, width: 3, height: 3 }),
473
+ isExternal: false,
473
474
  children: /* @__PURE__ */ jsx(Typography, { variant: "omega", children: formatMessage({
474
475
  id: "content-releases.content-manager-edit-view.edit-release",
475
476
  defaultMessage: "Edit release"
@@ -628,13 +629,12 @@ const INITIAL_VALUES = {
628
629
  const NoReleases = () => {
629
630
  const { formatMessage } = useIntl();
630
631
  return /* @__PURE__ */ jsx(
631
- EmptyStateLayout,
632
+ NoContent,
632
633
  {
633
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
634
- content: formatMessage({
634
+ content: {
635
635
  id: "content-releases.content-manager-edit-view.add-to-release.no-releases-message",
636
636
  defaultMessage: "No available releases. Open the list of releases and create a new one from there."
637
- }),
637
+ },
638
638
  action: /* @__PURE__ */ jsx(
639
639
  LinkButton,
640
640
  {
@@ -661,8 +661,7 @@ const AddActionToReleaseModal = ({
661
661
  const { formatMessage } = useIntl();
662
662
  const toggleNotification = useNotification();
663
663
  const { formatAPIError } = useAPIErrorHandler();
664
- const [{ query }] = useQueryParams();
665
- const locale = query.plugins?.i18n?.locale;
664
+ const { modifiedData } = useCMEditViewDataManager();
666
665
  const response = useGetReleasesForEntryQuery({
667
666
  contentTypeUid,
668
667
  entryId,
@@ -671,6 +670,7 @@ const AddActionToReleaseModal = ({
671
670
  const releases = response.data?.data;
672
671
  const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();
673
672
  const handleSubmit = async (values) => {
673
+ const locale = modifiedData.locale;
674
674
  const releaseActionEntry = {
675
675
  contentType: contentTypeUid,
676
676
  id: entryId,
@@ -777,14 +777,17 @@ const AddActionToReleaseModal = ({
777
777
  const CMReleasesContainer = () => {
778
778
  const [isModalOpen, setIsModalOpen] = React.useState(false);
779
779
  const { formatMessage, formatDate, formatTime } = useIntl();
780
- const { id, slug } = useParams();
781
- const isCreatingEntry = id === "create";
780
+ const {
781
+ isCreatingEntry,
782
+ hasDraftAndPublish,
783
+ initialData: { id: entryId },
784
+ slug
785
+ } = useCMEditViewDataManager();
782
786
  const contentTypeUid = slug;
783
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
784
- const canFetch = id != null && contentTypeUid != null;
787
+ const canFetch = entryId != null && contentTypeUid != null;
785
788
  const fetchParams = canFetch ? {
786
789
  contentTypeUid,
787
- entryId: id,
790
+ entryId,
788
791
  hasEntryAttached: true
789
792
  } : skipToken;
790
793
  const response = useGetReleasesForEntryQuery(fetchParams);
@@ -792,7 +795,7 @@ const CMReleasesContainer = () => {
792
795
  if (!canFetch) {
793
796
  return null;
794
797
  }
795
- if (isCreatingEntry) {
798
+ if (isCreatingEntry || !hasDraftAndPublish) {
796
799
  return null;
797
800
  }
798
801
  const toggleModal = () => setIsModalOpen((prev) => !prev);
@@ -861,7 +864,7 @@ const CMReleasesContainer = () => {
861
864
  ),
862
865
  /* @__PURE__ */ jsxs(Flex, { padding: 4, direction: "column", gap: 2, width: "100%", alignItems: "flex-start", children: [
863
866
  /* @__PURE__ */ jsx(Typography, { fontSize: 2, fontWeight: "bold", variant: "omega", textColor: "neutral700", children: release.name }),
864
- IsSchedulingEnabled && release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
867
+ release.scheduledAt && release.timezone && /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(
865
868
  {
866
869
  id: "content-releases.content-manager-edit-view.scheduled.date",
867
870
  defaultMessage: "{date} at {time} ({offset})"
@@ -921,7 +924,7 @@ const CMReleasesContainer = () => {
921
924
  {
922
925
  handleClose: toggleModal,
923
926
  contentTypeUid,
924
- entryId: id
927
+ entryId
925
928
  }
926
929
  )
927
930
  ]
@@ -933,13 +936,16 @@ const admin = {
933
936
  register(app) {
934
937
  if (window.strapi.features.isEnabled("cms-content-releases")) {
935
938
  app.addMenuLink({
936
- to: `plugins/${pluginId}`,
939
+ to: `/plugins/${pluginId}`,
937
940
  icon: PaperPlane,
938
941
  intlLabel: {
939
942
  id: `${pluginId}.plugin.name`,
940
943
  defaultMessage: "Releases"
941
944
  },
942
- Component: () => import("./App-PQlYzNfb.mjs").then((mod) => ({ default: mod.App })),
945
+ async Component() {
946
+ const { App } = await import("./App-HVXzE3i3.mjs");
947
+ return App;
948
+ },
943
949
  permissions: PERMISSIONS.main
944
950
  });
945
951
  app.addMiddlewares([() => releaseApi.middleware]);
@@ -969,7 +975,7 @@ const admin = {
969
975
  async registerTrads({ locales }) {
970
976
  const importedTrads = await Promise.all(
971
977
  locales.map((locale) => {
972
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-WuuhP6Bn.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
978
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-RdapH-9X.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
973
979
  return {
974
980
  data: prefixPluginTranslations(data, "content-releases"),
975
981
  locale
@@ -1004,4 +1010,4 @@ export {
1004
1010
  releaseApi as r,
1005
1011
  useGetReleasesQuery as u
1006
1012
  };
1007
- //# sourceMappingURL=index--4AgLDzb.mjs.map
1013
+ //# sourceMappingURL=index-Ys87ROOe.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Ys87ROOe.mjs","sources":["../../admin/src/constants.ts","../../admin/src/pluginId.ts","../../admin/src/services/axios.ts","../../admin/src/services/release.ts","../../admin/src/utils/time.ts","../../admin/src/store/hooks.ts","../../admin/src/components/ReleaseActionMenu.tsx","../../admin/src/components/ReleaseActionOptions.tsx","../../admin/src/components/CMReleasesContainer.tsx","../../admin/src/index.ts"],"sourcesContent":["import { Permission as StrapiPermission } from '@strapi/helper-plugin';\n\nexport const PERMISSIONS = {\n main: [\n {\n action: 'plugin::content-releases.read',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n create: [\n {\n action: 'plugin::content-releases.create',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n update: [\n {\n action: 'plugin::content-releases.update',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n delete: [\n {\n action: 'plugin::content-releases.delete',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n createAction: [\n {\n action: 'plugin::content-releases.create-action',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n deleteAction: [\n {\n action: 'plugin::content-releases.delete-action',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n publish: [\n {\n action: 'plugin::content-releases.publish',\n subject: null,\n id: '',\n actionParameters: {},\n properties: {},\n conditions: [],\n },\n ],\n} satisfies Record<string, StrapiPermission[]>;\n","export const pluginId = 'content-releases';\n","import { getFetchClient } from '@strapi/helper-plugin';\n\nimport type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\n\n/* -------------------------------------------------------------------------------------------------\n * Axios data\n * -----------------------------------------------------------------------------------------------*/\nexport interface QueryArguments<TSend> {\n url: string;\n method: 'PUT' | 'GET' | 'POST' | 'DELETE';\n data?: TSend;\n config?: AxiosRequestConfig<TSend>;\n}\n\nconst axiosBaseQuery = async <TData = any, TSend = any>({\n url,\n method,\n data,\n config,\n}: QueryArguments<TSend>) => {\n try {\n const { get, post, del, put } = getFetchClient();\n\n if (method === 'POST') {\n const result = await post<TData, AxiosResponse<TData>, TSend>(url, data, config);\n return { data: result.data };\n }\n\n if (method === 'DELETE') {\n const result = await del<TData, AxiosResponse<TData>, TSend>(url, config);\n return { data: result.data };\n }\n\n if (method === 'PUT') {\n const result = await put<TData, AxiosResponse<TData>, TSend>(url, data, config);\n return { data: result.data };\n }\n\n /**\n * Default is GET.\n */\n const result = await get<TData, AxiosResponse<TData>, TSend>(url, config);\n return { data: result.data };\n } catch (error) {\n const err = error as AxiosError;\n /**\n * Handle error of type AxiosError\n *\n * This format mimics what we want from an AxiosError which is what the\n * rest of the app works with, except this format is \"serializable\" since\n * it goes into the redux store.\n *\n * NOTE – passing the whole response will highlight this \"serializability\" issue.\n */\n return {\n error: {\n status: err.response?.status,\n code: err.code,\n response: {\n data: err.response?.data,\n },\n },\n };\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Axios error\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * This asserts the errors from redux-toolkit-query are\n * axios errors so we can pass them to our utility functions\n * to correctly render error messages.\n */\nconst isAxiosError = (err: unknown): err is AxiosError<{ error: any }> => {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'response' in err &&\n typeof err.response === 'object' &&\n err.response !== null &&\n 'data' in err.response\n );\n};\n\nexport { isAxiosError, axiosBaseQuery };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport {\n CreateReleaseAction,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport { pluginId } from '../pluginId';\n\nimport { axiosBaseQuery } from './axios';\n\nimport type {\n GetReleaseActions,\n UpdateReleaseAction,\n ReleaseActionGroupBy,\n} from '../../../shared/contracts/release-actions';\nimport type {\n CreateRelease,\n DeleteRelease,\n GetContentTypeEntryReleases,\n GetReleases,\n UpdateRelease,\n GetRelease,\n PublishRelease,\n} from '../../../shared/contracts/releases';\n\nexport interface GetReleasesQueryParams {\n page?: number;\n pageSize?: number;\n filters?: {\n releasedAt?: {\n // TODO: this should be a boolean, find a way to avoid strings\n $notNull?: boolean | 'true' | 'false';\n };\n };\n}\n\nexport interface GetReleaseActionsQueryParams {\n page?: number;\n pageSize?: number;\n groupBy?: ReleaseActionGroupBy;\n}\n\ntype GetReleasesTabResponse = GetReleases.Response & {\n meta: {\n activeTab: 'pending' | 'done';\n };\n};\n\nconst releaseApi = createApi({\n reducerPath: pluginId,\n baseQuery: axiosBaseQuery,\n tagTypes: ['Release', 'ReleaseAction'],\n endpoints: (build) => {\n return {\n getReleasesForEntry: build.query<\n GetContentTypeEntryReleases.Response,\n Partial<GetContentTypeEntryReleases.Request['query']>\n >({\n query(params) {\n return {\n url: '/content-releases',\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: (result) =>\n result\n ? [\n ...result.data.map(({ id }) => ({ type: 'Release' as const, id })),\n { type: 'Release', id: 'LIST' },\n ]\n : [],\n }),\n getReleases: build.query<GetReleasesTabResponse, GetReleasesQueryParams | void>({\n query(\n { page, pageSize, filters } = {\n page: 1,\n pageSize: 16,\n filters: {\n releasedAt: {\n $notNull: false,\n },\n },\n }\n ) {\n return {\n url: '/content-releases',\n method: 'GET',\n config: {\n params: {\n page: page || 1,\n pageSize: pageSize || 16,\n filters: filters || {\n releasedAt: {\n $notNull: false,\n },\n },\n },\n },\n };\n },\n transformResponse(response: GetReleasesTabResponse, meta, arg) {\n const releasedAtValue = arg?.filters?.releasedAt?.$notNull;\n const isActiveDoneTab = releasedAtValue === 'true';\n const newResponse: GetReleasesTabResponse = {\n ...response,\n meta: {\n ...response.meta,\n activeTab: isActiveDoneTab ? 'done' : 'pending',\n },\n };\n\n return newResponse;\n },\n providesTags: (result) =>\n result\n ? [\n ...result.data.map(({ id }) => ({ type: 'Release' as const, id })),\n { type: 'Release', id: 'LIST' },\n ]\n : [{ type: 'Release', id: 'LIST' }],\n }),\n getRelease: build.query<GetRelease.Response, GetRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}`,\n method: 'GET',\n };\n },\n providesTags: (result, error, arg) => [{ type: 'Release' as const, id: arg.id }],\n }),\n getReleaseActions: build.query<\n GetReleaseActions.Response,\n GetReleaseActions.Request['params'] & GetReleaseActions.Request['query']\n >({\n query({ releaseId, ...params }) {\n return {\n url: `/content-releases/${releaseId}/actions`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n providesTags: [{ type: 'ReleaseAction', id: 'LIST' }],\n }),\n createRelease: build.mutation<CreateRelease.Response, CreateRelease.Request['body']>({\n query(data) {\n return {\n url: '/content-releases',\n method: 'POST',\n data,\n };\n },\n invalidatesTags: [{ type: 'Release', id: 'LIST' }],\n }),\n updateRelease: build.mutation<\n void,\n UpdateRelease.Request['params'] & UpdateRelease.Request['body']\n >({\n query({ id, ...data }) {\n return {\n url: `/content-releases/${id}`,\n method: 'PUT',\n data,\n };\n },\n invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],\n }),\n createReleaseAction: build.mutation<\n CreateReleaseAction.Response,\n CreateReleaseAction.Request\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions`,\n method: 'POST',\n data: body,\n };\n },\n invalidatesTags: [\n { type: 'Release', id: 'LIST' },\n { type: 'ReleaseAction', id: 'LIST' },\n ],\n }),\n updateReleaseAction: build.mutation<\n UpdateReleaseAction.Response,\n UpdateReleaseAction.Request & { query: GetReleaseActions.Request['query'] } & {\n actionPath: [string, number];\n }\n >({\n query({ body, params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,\n method: 'PUT',\n data: body,\n };\n },\n invalidatesTags: () => [{ type: 'ReleaseAction', id: 'LIST' }],\n async onQueryStarted({ body, params, query, actionPath }, { dispatch, queryFulfilled }) {\n // We need to mimic the same params received by the getReleaseActions query\n const paramsWithoutActionId = {\n releaseId: params.releaseId,\n ...query,\n };\n\n const patchResult = dispatch(\n releaseApi.util.updateQueryData('getReleaseActions', paramsWithoutActionId, (draft) => {\n const [key, index] = actionPath;\n const action = draft.data[key][index];\n\n if (action) {\n action.type = body.type;\n }\n })\n );\n\n try {\n await queryFulfilled;\n } catch {\n patchResult.undo();\n }\n },\n }),\n deleteReleaseAction: build.mutation<\n DeleteReleaseAction.Response,\n DeleteReleaseAction.Request\n >({\n query({ params }) {\n return {\n url: `/content-releases/${params.releaseId}/actions/${params.actionId}`,\n method: 'DELETE',\n };\n },\n invalidatesTags: (result, error, arg) => [\n { type: 'Release', id: 'LIST' },\n { type: 'Release', id: arg.params.releaseId },\n { type: 'ReleaseAction', id: 'LIST' },\n ],\n }),\n publishRelease: build.mutation<PublishRelease.Response, PublishRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}/publish`,\n method: 'POST',\n };\n },\n invalidatesTags: (result, error, arg) => [{ type: 'Release', id: arg.id }],\n }),\n deleteRelease: build.mutation<DeleteRelease.Response, DeleteRelease.Request['params']>({\n query({ id }) {\n return {\n url: `/content-releases/${id}`,\n method: 'DELETE',\n };\n },\n invalidatesTags: () => [{ type: 'Release', id: 'LIST' }],\n }),\n };\n },\n});\n\nconst {\n useGetReleasesQuery,\n useGetReleasesForEntryQuery,\n useGetReleaseQuery,\n useGetReleaseActionsQuery,\n useCreateReleaseMutation,\n useCreateReleaseActionMutation,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseActionMutation,\n useDeleteReleaseMutation,\n} = releaseApi;\n\nexport {\n useGetReleasesQuery,\n useGetReleasesForEntryQuery,\n useGetReleaseQuery,\n useGetReleaseActionsQuery,\n useCreateReleaseMutation,\n useCreateReleaseActionMutation,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseActionMutation,\n useDeleteReleaseMutation,\n releaseApi,\n};\n","export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch (error) {\n // When timezone is invalid we catch the error and return empty to don't break the app\n return '';\n }\n};\n","import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { Store } from '@strapi/admin/strapi-admin';\n\ntype RootState = ReturnType<Store['getState']>;\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n","import * as React from 'react';\n\nimport { Flex, IconButton, Typography, Icon } from '@strapi/design-system';\nimport { Menu, Link } from '@strapi/design-system/v2';\nimport { CheckPermissions, useAPIErrorHandler, useNotification } from '@strapi/helper-plugin';\nimport { Cross, More, Pencil } from '@strapi/icons';\nimport { isAxiosError } from 'axios';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { DeleteReleaseAction, ReleaseAction } from '../../../shared/contracts/release-actions';\nimport { Release } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useDeleteReleaseActionMutation } from '../services/release';\nimport { useTypedSelector } from '../store/hooks';\n\nimport type { Permission } from '@strapi/helper-plugin';\n\nconst StyledMenuItem = styled(Menu.Item)<{ variant?: 'neutral' | 'danger' }>`\n &:hover {\n background: ${({ theme, variant = 'neutral' }) => theme.colors[`${variant}100`]};\n\n svg {\n path {\n fill: ${({ theme, variant = 'neutral' }) => theme.colors[`${variant}600`]};\n }\n }\n\n a {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n }\n\n svg {\n path {\n fill: ${({ theme, variant = 'neutral' }) => theme.colors[`${variant}600`]};\n }\n }\n\n a {\n color: ${({ theme }) => theme.colors.neutral800};\n }\n\n span,\n a {\n width: 100%;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteReleaseActionItemProps\n * -----------------------------------------------------------------------------------------------*/\nconst StyledIconButton = styled(IconButton)`\n /* Setting this style inline with borderColor will not apply the style */\n border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`};\n`;\ninterface DeleteReleaseActionItemProps {\n releaseId: DeleteReleaseAction.Request['params']['releaseId'];\n actionId: DeleteReleaseAction.Request['params']['actionId'];\n}\n\nconst DeleteReleaseActionItem = ({ releaseId, actionId }: DeleteReleaseActionItemProps) => {\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const [deleteReleaseAction] = useDeleteReleaseActionMutation();\n\n const handleDeleteAction = async () => {\n const response = await deleteReleaseAction({\n params: { releaseId, actionId },\n });\n\n if ('data' in response) {\n // Handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.content-manager-edit-view.remove-from-release.notification.success',\n defaultMessage: 'Entry removed from release',\n }),\n });\n\n return;\n }\n\n if ('error' in response) {\n if (isAxiosError(response.error)) {\n // Handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n return (\n <CheckPermissions permissions={PERMISSIONS.deleteAction}>\n <StyledMenuItem variant=\"danger\" onSelect={handleDeleteAction}>\n <Flex gap={2}>\n <Icon as={Cross} width={3} height={3} />\n <Typography textColor=\"danger600\" variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.remove-from-release',\n defaultMessage: 'Remove from release',\n })}\n </Typography>\n </Flex>\n </StyledMenuItem>\n </CheckPermissions>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseActionEntryLinkItem\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleaseActionEntryLinkItemProps {\n contentTypeUid: ReleaseAction['contentType'];\n entryId: ReleaseAction['entry']['id'];\n locale: ReleaseAction['locale'];\n}\n\nconst ReleaseActionEntryLinkItem = ({\n contentTypeUid,\n entryId,\n locale,\n}: ReleaseActionEntryLinkItemProps) => {\n const { formatMessage } = useIntl();\n // Confirm user has permissions to access the entry for the given locale\n const collectionTypePermissions = useTypedSelector(\n (state) => state.rbacProvider.collectionTypesRelatedPermissions\n );\n const updatePermissions = contentTypeUid\n ? collectionTypePermissions[contentTypeUid]?.['plugin::content-manager.explorer.update']\n : [];\n const canUpdateEntryForLocale = Boolean(\n !locale ||\n updatePermissions?.find((permission: Permission) =>\n permission.properties?.locales?.includes(locale)\n )\n );\n\n return (\n <CheckPermissions\n permissions={[\n {\n action: 'plugin::content-manager.explorer.update',\n subject: contentTypeUid,\n },\n ]}\n >\n {canUpdateEntryForLocale && (\n <StyledMenuItem>\n <Link\n as={NavLink}\n // @ts-expect-error TODO: This component from DS is not using types from NavLink\n to={{\n pathname: `/content-manager/collection-types/${contentTypeUid}/${entryId}`,\n search: locale && `?plugins[i18n][locale]=${locale}`,\n }}\n startIcon={<Icon as={Pencil} width={3} height={3} />}\n >\n <Typography variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.edit-entry',\n defaultMessage: 'Edit entry',\n })}\n </Typography>\n </Link>\n </StyledMenuItem>\n )}\n </CheckPermissions>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EditReleaseItem\n * -----------------------------------------------------------------------------------------------*/\ninterface EditReleaseItemProps {\n releaseId: Release['id'];\n}\n\nconst EditReleaseItem = ({ releaseId }: EditReleaseItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <StyledMenuItem>\n <Link\n href={`/admin/plugins/content-releases/${releaseId}`}\n startIcon={<Icon as={Pencil} width={3} height={3} />}\n isExternal={false}\n >\n <Typography variant=\"omega\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.edit-release',\n defaultMessage: 'Edit release',\n })}\n </Typography>\n </Link>\n </StyledMenuItem>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RootProps {\n children: React.ReactNode;\n hasTriggerBorder?: boolean;\n}\n\nconst Root = ({ children, hasTriggerBorder = false }: RootProps) => {\n const { formatMessage } = useIntl();\n\n return (\n // A user can access the dropdown if they have permissions to delete a release-action OR update a release\n <CheckPermissions permissions={[...PERMISSIONS.deleteAction, ...PERMISSIONS.update]}>\n <Menu.Root>\n {/* \n TODO Fix in the DS\n - as={IconButton} has TS error: Property 'icon' does not exist on type 'IntrinsicAttributes & TriggerProps & RefAttributes<HTMLButtonElement>'\n - The Icon doesn't actually show unless you hack it with some padding...and it's still a little strange\n */}\n <Menu.Trigger\n as={hasTriggerBorder ? StyledIconButton : IconButton}\n paddingLeft={2}\n paddingRight={2}\n aria-label={formatMessage({\n id: 'content-releases.content-manager-edit-view.release-action-menu',\n defaultMessage: 'Release action options',\n })}\n // @ts-expect-error See above\n icon={<More />}\n />\n {/*\n TODO: Using Menu instead of SimpleMenu mainly because there is no positioning provided from the DS,\n Refactor this once fixed in the DS\n */}\n <Menu.Content top={1} popoverPlacement=\"bottom-end\">\n {children}\n </Menu.Content>\n </Menu.Root>\n </CheckPermissions>\n );\n};\n\nexport const ReleaseActionMenu = {\n Root,\n EditReleaseItem,\n DeleteReleaseActionItem,\n ReleaseActionEntryLinkItem,\n};\n","import * as React from 'react';\n\nimport {\n FieldInput,\n FieldLabel,\n VisuallyHidden,\n Field,\n Flex,\n type FieldProps,\n} from '@strapi/design-system';\nimport styled from 'styled-components';\n\ninterface FieldWrapperProps extends FieldProps {\n actionType: 'publish' | 'unpublish';\n}\n\nconst getBorderLeftRadiusValue = (actionType: FieldWrapperProps['actionType']) => {\n return actionType === 'publish' ? 1 : 0;\n};\n\nconst getBorderRightRadiusValue = (actionType: FieldWrapperProps['actionType']) => {\n return actionType === 'publish' ? 0 : 1;\n};\n\nconst FieldWrapper = styled(Field)<FieldWrapperProps>`\n border-top-left-radius: ${({ actionType, theme }) =>\n theme.spaces[getBorderLeftRadiusValue(actionType)]};\n border-bottom-left-radius: ${({ actionType, theme }) =>\n theme.spaces[getBorderLeftRadiusValue(actionType)]};\n border-top-right-radius: ${({ actionType, theme }) =>\n theme.spaces[getBorderRightRadiusValue(actionType)]};\n border-bottom-right-radius: ${({ actionType, theme }) =>\n theme.spaces[getBorderRightRadiusValue(actionType)]};\n\n > label {\n color: inherit;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`};\n text-align: center;\n vertical-align: middle;\n text-transform: capitalize;\n }\n\n &[data-checked='true'] {\n color: ${({ theme, actionType }) =>\n actionType === 'publish' ? theme.colors.primary700 : theme.colors.danger600};\n background-color: ${({ theme, actionType }) =>\n actionType === 'publish' ? theme.colors.primary100 : theme.colors.danger100};\n border-color: ${({ theme, actionType }) =>\n actionType === 'publish' ? theme.colors.primary700 : theme.colors.danger600};\n }\n\n &[data-checked='false'] {\n border-left: ${({ actionType }) => actionType === 'unpublish' && 'none'};\n border-right: ${({ actionType }) => actionType === 'publish' && 'none'};\n }\n\n &[data-checked='false'][data-disabled='false']:hover {\n color: ${({ theme }) => theme.colors.neutral700};\n background-color: ${({ theme }) => theme.colors.neutral100};\n border-color: ${({ theme }) => theme.colors.neutral200};\n\n & > label {\n cursor: pointer;\n }\n }\n\n &[data-disabled='true'] {\n color: ${({ theme }) => theme.colors.neutral600};\n background-color: ${({ theme }) => theme.colors.neutral150};\n border-color: ${({ theme }) => theme.colors.neutral300};\n }\n`;\n\ninterface ActionOptionProps {\n selected: 'publish' | 'unpublish';\n handleChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n name: string;\n disabled?: boolean;\n}\n\ninterface OptionProps extends ActionOptionProps {\n actionType: 'publish' | 'unpublish';\n}\n\nconst ActionOption = ({\n selected,\n actionType,\n handleChange,\n name,\n disabled = false,\n}: OptionProps) => {\n return (\n <FieldWrapper\n actionType={actionType}\n background=\"primary0\"\n borderColor=\"neutral200\"\n color={selected === actionType ? 'primary600' : 'neutral600'}\n position=\"relative\"\n cursor=\"pointer\"\n data-checked={selected === actionType}\n data-disabled={disabled && selected !== actionType}\n >\n <FieldLabel htmlFor={`${name}-${actionType}`}>\n <VisuallyHidden>\n <FieldInput\n type=\"radio\"\n id={`${name}-${actionType}`}\n name={name}\n checked={selected === actionType}\n onChange={handleChange}\n value={actionType}\n disabled={disabled}\n />\n </VisuallyHidden>\n {actionType}\n </FieldLabel>\n </FieldWrapper>\n );\n};\n\nexport const ReleaseActionOptions = ({\n selected,\n handleChange,\n name,\n disabled = false,\n}: ActionOptionProps) => {\n return (\n <Flex>\n <ActionOption\n actionType=\"publish\"\n selected={selected}\n handleChange={handleChange}\n name={name}\n disabled={disabled}\n />\n <ActionOption\n actionType=\"unpublish\"\n selected={selected}\n handleChange={handleChange}\n name={name}\n disabled={disabled}\n />\n </Flex>\n );\n};\n","import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n Box,\n Button,\n FieldLabel,\n Flex,\n ModalBody,\n ModalHeader,\n ModalLayout,\n SingleSelect,\n SingleSelectOption,\n Typography,\n ModalFooter,\n} from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n CheckPermissions,\n NoContent,\n useAPIErrorHandler,\n useCMEditViewDataManager,\n useNotification,\n} from '@strapi/helper-plugin';\nimport { Plus } from '@strapi/icons';\nimport { Common } from '@strapi/types';\nimport { isAxiosError } from 'axios';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { Link as ReactRouterLink } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { CreateReleaseAction } from '../../../shared/contracts/release-actions';\nimport { GetContentTypeEntryReleases } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useCreateReleaseActionMutation, useGetReleasesForEntryQuery } from '../services/release';\nimport { getTimezoneOffset } from '../utils/time';\n\nimport { ReleaseActionMenu } from './ReleaseActionMenu';\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\n\n/* -------------------------------------------------------------------------------------------------\n * AddActionToReleaseModal\n * -----------------------------------------------------------------------------------------------*/\n\nconst RELEASE_ACTION_FORM_SCHEMA = yup.object().shape({\n type: yup.string().oneOf(['publish', 'unpublish']).required(),\n releaseId: yup.string().required(),\n});\n\ninterface FormValues {\n type: CreateReleaseAction.Request['body']['type'];\n releaseId: CreateReleaseAction.Request['params']['releaseId'];\n}\n\nconst INITIAL_VALUES = {\n type: 'publish',\n releaseId: '',\n} satisfies FormValues;\n\ninterface AddActionToReleaseModalProps {\n handleClose: () => void;\n contentTypeUid: GetContentTypeEntryReleases.Request['query']['contentTypeUid'];\n entryId: GetContentTypeEntryReleases.Request['query']['entryId'];\n}\n\nconst NoReleases = () => {\n const { formatMessage } = useIntl();\n return (\n <NoContent\n content={{\n id: 'content-releases.content-manager-edit-view.add-to-release.no-releases-message',\n defaultMessage:\n 'No available releases. Open the list of releases and create a new one from there.',\n }}\n action={\n <LinkButton\n // @ts-expect-error - types are not inferred correctly through the as prop.\n to={{\n pathname: '/plugins/content-releases',\n }}\n as={ReactRouterLink}\n variant=\"secondary\"\n >\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.redirect-button',\n defaultMessage: 'Open the list of releases',\n })}\n </LinkButton>\n }\n />\n );\n};\n\nconst AddActionToReleaseModal = ({\n handleClose,\n contentTypeUid,\n entryId,\n}: AddActionToReleaseModalProps) => {\n const releaseHeaderId = React.useId();\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { modifiedData } = useCMEditViewDataManager();\n\n // Get all 'pending' releases that do not have the entry attached\n const response = useGetReleasesForEntryQuery({\n contentTypeUid,\n entryId,\n hasEntryAttached: false,\n });\n\n const releases = response.data?.data;\n const [createReleaseAction, { isLoading }] = useCreateReleaseActionMutation();\n\n const handleSubmit = async (values: FormValues) => {\n const locale = modifiedData.locale as string | undefined;\n const releaseActionEntry = {\n contentType: contentTypeUid,\n id: entryId,\n locale,\n };\n const response = await createReleaseAction({\n body: { type: values.type, entry: releaseActionEntry },\n params: { releaseId: values.releaseId },\n });\n\n if ('data' in response) {\n // Handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.notification.success',\n defaultMessage: 'Entry added to release',\n }),\n });\n\n handleClose();\n return;\n }\n\n if ('error' in response) {\n if (isAxiosError(response.error)) {\n // Handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Handle generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n return (\n <ModalLayout onClose={handleClose} labelledBy={releaseHeaderId}>\n <ModalHeader>\n <Typography id={releaseHeaderId} fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release',\n defaultMessage: 'Add to release',\n })}\n </Typography>\n </ModalHeader>\n <Formik\n onSubmit={handleSubmit}\n validationSchema={RELEASE_ACTION_FORM_SCHEMA}\n initialValues={INITIAL_VALUES}\n >\n {({ values, setFieldValue }) => {\n return (\n <Form>\n {releases?.length === 0 ? (\n <NoReleases />\n ) : (\n <ModalBody>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingBottom={6}>\n <SingleSelect\n required\n label={formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.select-label',\n defaultMessage: 'Select a release',\n })}\n placeholder={formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.select-placeholder',\n defaultMessage: 'Select',\n })}\n onChange={(value) => setFieldValue('releaseId', value)}\n value={values.releaseId}\n >\n {releases?.map((release) => (\n <SingleSelectOption key={release.id} value={release.id}>\n {release.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n <FieldLabel>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.action-type-label',\n defaultMessage: 'What do you want to do with this entry?',\n })}\n </FieldLabel>\n <ReleaseActionOptions\n selected={values.type}\n handleChange={(e) => setFieldValue('type', e.target.value)}\n name=\"type\"\n />\n </Flex>\n </ModalBody>\n )}\n <ModalFooter\n startActions={\n <Button onClick={handleClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.cancel-button',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n /**\n * TODO: Ideally we would use isValid from Formik to disable the button, however currently it always returns true\n * for yup.string().required(), even when the value is falsy (including empty string)\n */\n <Button type=\"submit\" disabled={!values.releaseId} loading={isLoading}>\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release.continue-button',\n defaultMessage: 'Continue',\n })}\n </Button>\n }\n />\n </Form>\n );\n }}\n </Formik>\n </ModalLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CMReleasesContainer\n * -----------------------------------------------------------------------------------------------*/\n\nexport const CMReleasesContainer = () => {\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const { formatMessage, formatDate, formatTime } = useIntl();\n const {\n isCreatingEntry,\n hasDraftAndPublish,\n initialData: { id: entryId },\n slug,\n } = useCMEditViewDataManager();\n\n const contentTypeUid = slug as Common.UID.ContentType;\n const canFetch = entryId != null && contentTypeUid != null;\n const fetchParams = canFetch\n ? {\n contentTypeUid: contentTypeUid,\n entryId: entryId,\n hasEntryAttached: true,\n }\n : skipToken;\n // Get all 'pending' releases that have the entry attached\n const response = useGetReleasesForEntryQuery(fetchParams);\n const releases = response.data?.data;\n\n /**\n * If we don't have a contentTypeUid or entryId then the data was never fetched\n */\n if (!canFetch) {\n return null;\n }\n\n /**\n * - Impossible to add entry to release before it exists\n * - Content types without draft and publish cannot add entries to release\n * TODO v5: All contentTypes will have draft and publish enabled\n */\n if (isCreatingEntry || !hasDraftAndPublish) {\n return null;\n }\n\n const toggleModal = () => setIsModalOpen((prev) => !prev);\n\n const getReleaseColorVariant = (\n actionType: 'publish' | 'unpublish',\n shade: '100' | '200' | '600'\n ) => {\n if (actionType === 'unpublish') {\n return `secondary${shade}`;\n }\n\n return `success${shade}`;\n };\n\n return (\n <CheckPermissions permissions={PERMISSIONS.main}>\n <Box\n as=\"aside\"\n aria-label={formatMessage({\n id: 'content-releases.plugin.name',\n defaultMessage: 'Releases',\n })}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n hasRadius\n padding={4}\n shadow=\"tableShadow\"\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={3}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" textTransform=\"uppercase\">\n {formatMessage({\n id: 'content-releases.plugin.name',\n defaultMessage: 'Releases',\n })}\n </Typography>\n {releases?.map((release) => {\n return (\n <Flex\n key={release.id}\n direction=\"column\"\n alignItems=\"start\"\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={getReleaseColorVariant(release.action.type, '200')}\n overflow=\"hidden\"\n hasRadius\n >\n <Box\n paddingTop={3}\n paddingBottom={3}\n paddingLeft={4}\n paddingRight={4}\n background={getReleaseColorVariant(release.action.type, '100')}\n width=\"100%\"\n >\n <Typography\n fontSize={1}\n variant=\"pi\"\n textColor={getReleaseColorVariant(release.action.type, '600')}\n >\n {formatMessage(\n {\n id: 'content-releases.content-manager-edit-view.list-releases.title',\n defaultMessage:\n '{isPublish, select, true {Will be published in} other {Will be unpublished in}}',\n },\n { isPublish: release.action.type === 'publish' }\n )}\n </Typography>\n </Box>\n <Flex padding={4} direction=\"column\" gap={2} width=\"100%\" alignItems=\"flex-start\">\n <Typography fontSize={2} fontWeight=\"bold\" variant=\"omega\" textColor=\"neutral700\">\n {release.name}\n </Typography>\n {release.scheduledAt && release.timezone && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-releases.content-manager-edit-view.scheduled.date',\n defaultMessage: '{date} at {time} ({offset})',\n },\n {\n date: formatDate(new Date(release.scheduledAt), {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n timeZone: release.timezone,\n }),\n time: formatTime(new Date(release.scheduledAt), {\n hourCycle: 'h23',\n timeZone: release.timezone,\n }),\n offset: getTimezoneOffset(\n release.timezone,\n new Date(release.scheduledAt)\n ),\n }\n )}\n </Typography>\n )}\n <CheckPermissions permissions={PERMISSIONS.deleteAction}>\n <ReleaseActionMenu.Root hasTriggerBorder>\n <ReleaseActionMenu.EditReleaseItem releaseId={release.id} />\n <ReleaseActionMenu.DeleteReleaseActionItem\n releaseId={release.id}\n actionId={release.action.id}\n />\n </ReleaseActionMenu.Root>\n </CheckPermissions>\n </Flex>\n </Flex>\n );\n })}\n <CheckPermissions permissions={PERMISSIONS.createAction}>\n <Button\n justifyContent=\"center\"\n paddingLeft={4}\n paddingRight={4}\n color=\"neutral700\"\n variant=\"tertiary\"\n startIcon={<Plus />}\n onClick={toggleModal}\n >\n {formatMessage({\n id: 'content-releases.content-manager-edit-view.add-to-release',\n defaultMessage: 'Add to release',\n })}\n </Button>\n </CheckPermissions>\n </Flex>\n {isModalOpen && (\n <AddActionToReleaseModal\n handleClose={toggleModal}\n contentTypeUid={contentTypeUid}\n entryId={entryId}\n />\n )}\n </Box>\n </CheckPermissions>\n );\n};\n","import { prefixPluginTranslations } from '@strapi/helper-plugin';\nimport { PaperPlane } from '@strapi/icons';\n\nimport { CMReleasesContainer } from './components/CMReleasesContainer';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { releaseApi } from './services/release';\n\nimport type { Plugin } from '@strapi/types';\n\n// eslint-disable-next-line import/no-default-export\nconst admin: Plugin.Config.AdminInput = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(app: any) {\n if (window.strapi.features.isEnabled('cms-content-releases')) {\n app.addMenuLink({\n to: `/plugins/${pluginId}`,\n icon: PaperPlane,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Releases',\n },\n async Component() {\n const { App } = await import('./pages/App');\n return App;\n },\n permissions: PERMISSIONS.main,\n });\n\n /**\n * For some reason every middleware you pass has to a function\n * that returns the actual middleware. It's annoying but no one knows why....\n */\n app.addMiddlewares([() => releaseApi.middleware]);\n\n app.addReducers({\n [releaseApi.reducerPath]: releaseApi.reducer,\n });\n\n // Insert the Releases container in the 'right-links' zone of the Content Manager's edit view\n app.injectContentManagerComponent('editView', 'right-links', {\n name: `${pluginId}-link`,\n Component: CMReleasesContainer,\n });\n } else if (\n !window.strapi.features.isEnabled('cms-content-releases') &&\n window.strapi?.flags?.promoteEE\n ) {\n app.addMenuLink({\n to: `/plugins/purchase-content-releases`,\n icon: PaperPlane,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Releases',\n },\n async Component() {\n const { PurchaseContentReleases } = await import('./pages/PurchaseContentReleases');\n return PurchaseContentReleases;\n },\n lockIcon: true,\n });\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, 'content-releases'),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["result","isAxiosError","ReactRouterLink","response"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,kBAAkB,CAAC;AAAA,MACnB,YAAY,CAAC;AAAA,MACb,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AACF;ACzEO,MAAM,WAAW;ACcxB,MAAM,iBAAiB,OAAiC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA6B;AACvB,MAAA;AACF,UAAM,EAAE,KAAK,MAAM,KAAK,IAAA,IAAQ;AAEhC,QAAI,WAAW,QAAQ;AACrB,YAAMA,UAAS,MAAM,KAAyC,KAAK,MAAM,MAAM;AACxE,aAAA,EAAE,MAAMA,QAAO;IACxB;AAEA,QAAI,WAAW,UAAU;AACvB,YAAMA,UAAS,MAAM,IAAwC,KAAK,MAAM;AACjE,aAAA,EAAE,MAAMA,QAAO;IACxB;AAEA,QAAI,WAAW,OAAO;AACpB,YAAMA,UAAS,MAAM,IAAwC,KAAK,MAAM,MAAM;AACvE,aAAA,EAAE,MAAMA,QAAO;IACxB;AAKA,UAAM,SAAS,MAAM,IAAwC,KAAK,MAAM;AACjE,WAAA,EAAE,MAAM,OAAO;WACf,OAAO;AACd,UAAM,MAAM;AAUL,WAAA;AAAA,MACL,OAAO;AAAA,QACL,QAAQ,IAAI,UAAU;AAAA,QACtB,MAAM,IAAI;AAAA,QACV,UAAU;AAAA,UACR,MAAM,IAAI,UAAU;AAAA,QACtB;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AACF;AAWM,MAAA,eAAe,CAAC,QAAoD;AACxE,SACE,OAAO,QAAQ,YACf,QAAQ,QACR,cAAc,OACd,OAAO,IAAI,aAAa,YACxB,IAAI,aAAa,QACjB,UAAU,IAAI;AAElB;ACpCA,MAAM,aAAa,UAAU;AAAA,EAC3B,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU,CAAC,WAAW,eAAe;AAAA,EACrC,WAAW,CAAC,UAAU;AACb,WAAA;AAAA,MACL,qBAAqB,MAAM,MAGzB;AAAA,QACA,MAAM,QAAQ;AACL,iBAAA;AAAA,YACL,KAAK;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ;AAAA,cACN;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,cAAc,CAAC,WACb,SACI;AAAA,UACE,GAAG,OAAO,KAAK,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,WAAoB,GAAA,EAAK;AAAA,UACjE,EAAE,MAAM,WAAW,IAAI,OAAO;AAAA,QAAA,IAEhC,CAAC;AAAA,MAAA,CACR;AAAA,MACD,aAAa,MAAM,MAA6D;AAAA,QAC9E,MACE,EAAE,MAAM,UAAU,YAAY;AAAA,UAC5B,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS;AAAA,YACP,YAAY;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QAAA,GAEF;AACO,iBAAA;AAAA,YACL,KAAK;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ;AAAA,cACN,QAAQ;AAAA,gBACN,MAAM,QAAQ;AAAA,gBACd,UAAU,YAAY;AAAA,gBACtB,SAAS,WAAW;AAAA,kBAClB,YAAY;AAAA,oBACV,UAAU;AAAA,kBACZ;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,kBAAkB,UAAkC,MAAM,KAAK;AACvD,gBAAA,kBAAkB,KAAK,SAAS,YAAY;AAClD,gBAAM,kBAAkB,oBAAoB;AAC5C,gBAAM,cAAsC;AAAA,YAC1C,GAAG;AAAA,YACH,MAAM;AAAA,cACJ,GAAG,SAAS;AAAA,cACZ,WAAW,kBAAkB,SAAS;AAAA,YACxC;AAAA,UAAA;AAGK,iBAAA;AAAA,QACT;AAAA,QACA,cAAc,CAAC,WACb,SACI;AAAA,UACE,GAAG,OAAO,KAAK,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,WAAoB,GAAA,EAAK;AAAA,UACjE,EAAE,MAAM,WAAW,IAAI,OAAO;AAAA,YAEhC,CAAC,EAAE,MAAM,WAAW,IAAI,QAAQ;AAAA,MAAA,CACvC;AAAA,MACD,YAAY,MAAM,MAAyD;AAAA,QACzE,MAAM,EAAE,MAAM;AACL,iBAAA;AAAA,YACL,KAAK,qBAAqB,EAAE;AAAA,YAC5B,QAAQ;AAAA,UAAA;AAAA,QAEZ;AAAA,QACA,cAAc,CAAC,QAAQ,OAAO,QAAQ,CAAC,EAAE,MAAM,WAAoB,IAAI,IAAI,GAAA,CAAI;AAAA,MAAA,CAChF;AAAA,MACD,mBAAmB,MAAM,MAGvB;AAAA,QACA,MAAM,EAAE,WAAW,GAAG,UAAU;AACvB,iBAAA;AAAA,YACL,KAAK,qBAAqB,SAAS;AAAA,YACnC,QAAQ;AAAA,YACR,QAAQ;AAAA,cACN;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,cAAc,CAAC,EAAE,MAAM,iBAAiB,IAAI,QAAQ;AAAA,MAAA,CACrD;AAAA,MACD,eAAe,MAAM,SAAgE;AAAA,QACnF,MAAM,MAAM;AACH,iBAAA;AAAA,YACL,KAAK;AAAA,YACL,QAAQ;AAAA,YACR;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,iBAAiB,CAAC,EAAE,MAAM,WAAW,IAAI,QAAQ;AAAA,MAAA,CAClD;AAAA,MACD,eAAe,MAAM,SAGnB;AAAA,QACA,MAAM,EAAE,IAAI,GAAG,QAAQ;AACd,iBAAA;AAAA,YACL,KAAK,qBAAqB,EAAE;AAAA,YAC5B,QAAQ;AAAA,YACR;AAAA,UAAA;AAAA,QAEJ;AAAA,QACA,iBAAiB,CAAC,QAAQ,OAAO,QAAQ,CAAC,EAAE,MAAM,WAAW,IAAI,IAAI,GAAA,CAAI;AAAA,MAAA,CAC1E;AAAA,MACD,qBAAqB,MAAM,SAGzB;AAAA,QACA,MAAM,EAAE,MAAM,UAAU;AACf,iBAAA;AAAA,YACL,KAAK,qBAAqB,OAAO,SAAS;AAAA,YAC1C,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA;AAAA,QAEV;AAAA,QACA,iBAAiB;AAAA,UACf,EAAE,MAAM,WAAW,IAAI,OAAO;AAAA,UAC9B,EAAE,MAAM,iBAAiB,IAAI,OAAO;AAAA,QACtC;AAAA,MAAA,CACD;AAAA,MACD,qBAAqB,MAAM,SAKzB;AAAA,QACA,MAAM,EAAE,MAAM,UAAU;AACf,iBAAA;AAAA,YACL,KAAK,qBAAqB,OAAO,SAAS,YAAY,OAAO,QAAQ;AAAA,YACrE,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA;AAAA,QAEV;AAAA,QACA,iBAAiB,MAAM,CAAC,EAAE,MAAM,iBAAiB,IAAI,QAAQ;AAAA,QAC7D,MAAM,eAAe,EAAE,MAAM,QAAQ,OAAO,cAAc,EAAE,UAAU,kBAAkB;AAEtF,gBAAM,wBAAwB;AAAA,YAC5B,WAAW,OAAO;AAAA,YAClB,GAAG;AAAA,UAAA;AAGL,gBAAM,cAAc;AAAA,YAClB,WAAW,KAAK,gBAAgB,qBAAqB,uBAAuB,CAAC,UAAU;AAC/E,oBAAA,CAAC,KAAK,KAAK,IAAI;AACrB,oBAAM,SAAS,MAAM,KAAK,GAAG,EAAE,KAAK;AAEpC,kBAAI,QAAQ;AACV,uBAAO,OAAO,KAAK;AAAA,cACrB;AAAA,YAAA,CACD;AAAA,UAAA;AAGC,cAAA;AACI,kBAAA;AAAA,UAAA,QACA;AACN,wBAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MAAA,CACD;AAAA,MACD,qBAAqB,MAAM,SAGzB;AAAA,QACA,MAAM,EAAE,UAAU;AACT,iBAAA;AAAA,YACL,KAAK,qBAAqB,OAAO,SAAS,YAAY,OAAO,QAAQ;AAAA,YACrE,QAAQ;AAAA,UAAA;AAAA,QAEZ;AAAA,QACA,iBAAiB,CAAC,QAAQ,OAAO,QAAQ;AAAA,UACvC,EAAE,MAAM,WAAW,IAAI,OAAO;AAAA,UAC9B,EAAE,MAAM,WAAW,IAAI,IAAI,OAAO,UAAU;AAAA,UAC5C,EAAE,MAAM,iBAAiB,IAAI,OAAO;AAAA,QACtC;AAAA,MAAA,CACD;AAAA,MACD,gBAAgB,MAAM,SAAoE;AAAA,QACxF,MAAM,EAAE,MAAM;AACL,iBAAA;AAAA,YACL,KAAK,qBAAqB,EAAE;AAAA,YAC5B,QAAQ;AAAA,UAAA;AAAA,QAEZ;AAAA,QACA,iBAAiB,CAAC,QAAQ,OAAO,QAAQ,CAAC,EAAE,MAAM,WAAW,IAAI,IAAI,GAAA,CAAI;AAAA,MAAA,CAC1E;AAAA,MACD,eAAe,MAAM,SAAkE;AAAA,QACrF,MAAM,EAAE,MAAM;AACL,iBAAA;AAAA,YACL,KAAK,qBAAqB,EAAE;AAAA,YAC5B,QAAQ;AAAA,UAAA;AAAA,QAEZ;AAAA,QACA,iBAAiB,MAAM,CAAC,EAAE,MAAM,WAAW,IAAI,QAAQ;AAAA,MAAA,CACxD;AAAA,IAAA;AAAA,EAEL;AACF,CAAC;AAEK,MAAA;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAI;ACpRS,MAAA,oBAAoB,CAAC,UAAkB,SAAe;AAC7D,MAAA;AACF,UAAM,aAAa,IAAI,KAAK,eAAe,MAAM;AAAA,MAC/C,UAAU;AAAA,MACV,cAAc;AAAA,IAAA,CACf,EACE,cAAc,IAAI,EAClB,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc;AAExC,UAAA,SAAS,aAAa,WAAW,QAAQ;AAG/C,QAAI,YAAY,OAAO,QAAQ,OAAO,KAAK;AAGvC,QAAA,CAAC,UAAU,SAAS,GAAG,KAAK,CAAC,UAAU,SAAS,GAAG,GAAG;AACxD,kBAAY,GAAG,SAAS;AAAA,IAC1B;AAEO,WAAA;AAAA,WACA,OAAO;AAEP,WAAA;AAAA,EACT;AACF;ACjBA,MAAM,mBAAmC;AACzC,MAAM,mBAAoD;ACW1D,MAAM,iBAAiB,OAAO,KAAK,IAAI;AAAA;AAAA,kBAErB,CAAC,EAAE,OAAO,UAAU,UAAgB,MAAA,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,gBAInE,CAAC,EAAE,OAAO,UAAU,UAAgB,MAAA,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,eAKlE,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMvC,CAAC,EAAE,OAAO,UAAU,UAAgB,MAAA,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,aAKlE,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYnD,MAAM,mBAAmB,OAAO,UAAU;AAAA;AAAA,YAE9B,CAAC,EAAE,MAAM,MAAM,aAAa,MAAM,OAAO,UAAU,EAAE;AAAA;AAOjE,MAAM,0BAA0B,CAAC,EAAE,WAAW,eAA6C;AACnF,QAAA,EAAE,kBAAkB;AAC1B,QAAM,qBAAqB;AACrB,QAAA,EAAE,mBAAmB;AACrB,QAAA,CAAC,mBAAmB,IAAI;AAE9B,QAAM,qBAAqB,YAAY;AAC/B,UAAA,WAAW,MAAM,oBAAoB;AAAA,MACzC,QAAQ,EAAE,WAAW,SAAS;AAAA,IAAA,CAC/B;AAED,QAAI,UAAU,UAAU;AAEH,yBAAA;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,cAAc;AAAA,UACrB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAED;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACnB,UAAAC,eAAa,SAAS,KAAK,GAAG;AAEb,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,eAAe,SAAS,KAAK;AAAA,QAAA,CACvC;AAAA,MAAA,OACI;AAEc,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,EAAE,IAAI,sBAAsB,gBAAgB,qBAAqB;AAAA,QAAA,CACzF;AAAA,MACH;AAAA,IACF;AAAA,EAAA;AAGF,SACG,oBAAA,kBAAA,EAAiB,aAAa,YAAY,cACzC,UAAC,oBAAA,gBAAA,EAAe,SAAQ,UAAS,UAAU,oBACzC,UAAC,qBAAA,MAAA,EAAK,KAAK,GACT,UAAA;AAAA,IAAA,oBAAC,QAAK,IAAI,OAAO,OAAO,GAAG,QAAQ,GAAG;AAAA,wBACrC,YAAW,EAAA,WAAU,aAAY,SAAQ,SACvC,UAAc,cAAA;AAAA,MACb,IAAI;AAAA,MACJ,gBAAgB;AAAA,IACjB,CAAA,GACH;AAAA,EAAA,GACF,GACF,EACF,CAAA;AAEJ;AAWA,MAAM,6BAA6B,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,MAAuC;AAC/B,QAAA,EAAE,kBAAkB;AAE1B,QAAM,4BAA4B;AAAA,IAChC,CAAC,UAAU,MAAM,aAAa;AAAA,EAAA;AAEhC,QAAM,oBAAoB,iBACtB,0BAA0B,cAAc,IAAI,yCAAyC,IACrF;AACJ,QAAM,0BAA0B;AAAA,IAC9B,CAAC,UACC,mBAAmB;AAAA,MAAK,CAAC,eACvB,WAAW,YAAY,SAAS,SAAS,MAAM;AAAA,IACjD;AAAA,EAAA;AAIF,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAa;AAAA,QACX;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEC,UAAA,+CACE,gBACC,EAAA,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,UAEJ,IAAI;AAAA,YACF,UAAU,qCAAqC,cAAc,IAAI,OAAO;AAAA,YACxE,QAAQ,UAAU,0BAA0B,MAAM;AAAA,UACpD;AAAA,UACA,+BAAY,MAAK,EAAA,IAAI,QAAQ,OAAO,GAAG,QAAQ,GAAG;AAAA,UAElD,UAAC,oBAAA,YAAA,EAAW,SAAQ,SACjB,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UACjB,CAAA,GACH;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,IAAA;AAAA,EAAA;AAIR;AASA,MAAM,kBAAkB,CAAC,EAAE,gBAAsC;AACzD,QAAA,EAAE,kBAAkB;AAE1B,6BACG,gBACC,EAAA,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,mCAAmC,SAAS;AAAA,MAClD,+BAAY,MAAK,EAAA,IAAI,QAAQ,OAAO,GAAG,QAAQ,GAAG;AAAA,MAClD,YAAY;AAAA,MAEZ,UAAC,oBAAA,YAAA,EAAW,SAAQ,SACjB,UAAc,cAAA;AAAA,QACb,IAAI;AAAA,QACJ,gBAAgB;AAAA,MACjB,CAAA,GACH;AAAA,IAAA;AAAA,EAEJ,EAAA,CAAA;AAEJ;AAWA,MAAM,OAAO,CAAC,EAAE,UAAU,mBAAmB,YAAuB;AAC5D,QAAA,EAAE,kBAAkB;AAE1B;AAAA;AAAA,IAEG,oBAAA,kBAAA,EAAiB,aAAa,CAAC,GAAG,YAAY,cAAc,GAAG,YAAY,MAAM,GAChF,UAAC,qBAAA,KAAK,MAAL,EAMC,UAAA;AAAA,MAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACC,IAAI,mBAAmB,mBAAmB;AAAA,UAC1C,aAAa;AAAA,UACb,cAAc;AAAA,UACd,cAAY,cAAc;AAAA,YACxB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,UAED,0BAAO,MAAK,EAAA;AAAA,QAAA;AAAA,MACd;AAAA,MAKA,oBAAC,KAAK,SAAL,EAAa,KAAK,GAAG,kBAAiB,cACpC,UACH;AAAA,IAAA,EAAA,CACF,EACF,CAAA;AAAA;AAEJ;AAEO,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;ACnPA,MAAM,2BAA2B,CAAC,eAAgD;AACzE,SAAA,eAAe,YAAY,IAAI;AACxC;AAEA,MAAM,4BAA4B,CAAC,eAAgD;AAC1E,SAAA,eAAe,YAAY,IAAI;AACxC;AAEA,MAAM,eAAe,OAAO,KAAK;AAAA,4BACL,CAAC,EAAE,YAAY,MAAM,MAC7C,MAAM,OAAO,yBAAyB,UAAU,CAAC,CAAC;AAAA,+BACvB,CAAC,EAAE,YAAY,MAAM,MAChD,MAAM,OAAO,yBAAyB,UAAU,CAAC,CAAC;AAAA,6BACzB,CAAC,EAAE,YAAY,MAAM,MAC9C,MAAM,OAAO,0BAA0B,UAAU,CAAC,CAAC;AAAA,gCACvB,CAAC,EAAE,YAAY,MAAM,MACjD,MAAM,OAAO,0BAA0B,UAAU,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,eAIxC,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOxD,CAAC,EAAE,OAAO,WAAA,MACjB,eAAe,YAAY,MAAM,OAAO,aAAa,MAAM,OAAO,SAAS;AAAA,wBACzD,CAAC,EAAE,OAAO,WAAA,MAC5B,eAAe,YAAY,MAAM,OAAO,aAAa,MAAM,OAAO,SAAS;AAAA,oBAC7D,CAAC,EAAE,OAAO,WAAA,MACxB,eAAe,YAAY,MAAM,OAAO,aAAa,MAAM,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA,mBAI9D,CAAC,EAAE,WAAA,MAAiB,eAAe,eAAe,MAAM;AAAA,oBACvD,CAAC,EAAE,WAAA,MAAiB,eAAe,aAAa,MAAM;AAAA;AAAA;AAAA;AAAA,aAI7D,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA,wBAC3B,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA,oBAC1C,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAQ7C,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA,wBAC3B,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA,oBAC1C,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAe1D,MAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAAmB;AAEf,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,YAAW;AAAA,MACX,aAAY;AAAA,MACZ,OAAO,aAAa,aAAa,eAAe;AAAA,MAChD,UAAS;AAAA,MACT,QAAO;AAAA,MACP,gBAAc,aAAa;AAAA,MAC3B,iBAAe,YAAY,aAAa;AAAA,MAExC,+BAAC,YAAW,EAAA,SAAS,GAAG,IAAI,IAAI,UAAU,IACxC,UAAA;AAAA,QAAA,oBAAC,gBACC,EAAA,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,IAAI,GAAG,IAAI,IAAI,UAAU;AAAA,YACzB;AAAA,YACA,SAAS,aAAa;AAAA,YACtB,UAAU;AAAA,YACV,OAAO;AAAA,YACP;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QACC;AAAA,MAAA,GACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAAyB;AACvB,8BACG,MACC,EAAA,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,YAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,YAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;ACnGA,MAAM,6BAA6B,IAAI,OAAO,EAAE,MAAM;AAAA,EACpD,MAAM,IAAI,SAAS,MAAM,CAAC,WAAW,WAAW,CAAC,EAAE,SAAS;AAAA,EAC5D,WAAW,IAAI,OAAO,EAAE,SAAS;AACnC,CAAC;AAOD,MAAM,iBAAiB;AAAA,EACrB,MAAM;AAAA,EACN,WAAW;AACb;AAQA,MAAM,aAAa,MAAM;AACjB,QAAA,EAAE,kBAAkB;AAExB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS;AAAA,QACP,IAAI;AAAA,QACJ,gBACE;AAAA,MACJ;AAAA,MACA,QACE;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,IAAI;AAAA,YACF,UAAU;AAAA,UACZ;AAAA,UACA,IAAIC;AAAAA,UACJ,SAAQ;AAAA,UAEP,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,MAAM,0BAA0B,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,MAAoC;AAC5B,QAAA,kBAAkB,MAAM;AACxB,QAAA,EAAE,kBAAkB;AAC1B,QAAM,qBAAqB;AACrB,QAAA,EAAE,mBAAmB;AACrB,QAAA,EAAE,iBAAiB;AAGzB,QAAM,WAAW,4BAA4B;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EAAA,CACnB;AAEK,QAAA,WAAW,SAAS,MAAM;AAChC,QAAM,CAAC,qBAAqB,EAAE,UAAU,CAAC,IAAI,+BAA+B;AAEtE,QAAA,eAAe,OAAO,WAAuB;AACjD,UAAM,SAAS,aAAa;AAC5B,UAAM,qBAAqB;AAAA,MACzB,aAAa;AAAA,MACb,IAAI;AAAA,MACJ;AAAA,IAAA;AAEIC,UAAAA,YAAW,MAAM,oBAAoB;AAAA,MACzC,MAAM,EAAE,MAAM,OAAO,MAAM,OAAO,mBAAmB;AAAA,MACrD,QAAQ,EAAE,WAAW,OAAO,UAAU;AAAA,IAAA,CACvC;AAED,QAAI,UAAUA,WAAU;AAEH,yBAAA;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,cAAc;AAAA,UACrB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAEW;AACZ;AAAA,IACF;AAEA,QAAI,WAAWA,WAAU;AACnB,UAAAF,eAAaE,UAAS,KAAK,GAAG;AAEb,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,eAAeA,UAAS,KAAK;AAAA,QAAA,CACvC;AAAA,MAAA,OACI;AAEc,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,EAAE,IAAI,sBAAsB,gBAAgB,qBAAqB;AAAA,QAAA,CACzF;AAAA,MACH;AAAA,IACF;AAAA,EAAA;AAGF,SACG,qBAAA,aAAA,EAAY,SAAS,aAAa,YAAY,iBAC7C,UAAA;AAAA,IAAC,oBAAA,aAAA,EACC,8BAAC,YAAW,EAAA,IAAI,iBAAiB,YAAW,QAAO,WAAU,cAC1D,UAAc,cAAA;AAAA,MACb,IAAI;AAAA,MACJ,gBAAgB;AAAA,IAAA,CACjB,GACH,EACF,CAAA;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,kBAAkB;AAAA,QAClB,eAAe;AAAA,QAEd,UAAC,CAAA,EAAE,QAAQ,oBAAoB;AAC9B,sCACG,MACE,EAAA,UAAA;AAAA,YAAA,UAAU,WAAW,IACnB,oBAAA,YAAA,EAAW,IAEX,oBAAA,WAAA,EACC,UAAC,qBAAA,MAAA,EAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,cAAC,oBAAA,KAAA,EAAI,eAAe,GAClB,UAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,UAAQ;AAAA,kBACR,OAAO,cAAc;AAAA,oBACnB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,aAAa,cAAc;AAAA,oBACzB,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,kBACD,UAAU,CAAC,UAAU,cAAc,aAAa,KAAK;AAAA,kBACrD,OAAO,OAAO;AAAA,kBAEb,UAAU,UAAA,IAAI,CAAC,YACb,oBAAA,oBAAA,EAAoC,OAAO,QAAQ,IACjD,UAAA,QAAQ,KADc,GAAA,QAAQ,EAEjC,CACD;AAAA,gBAAA;AAAA,cAAA,GAEL;AAAA,cACA,oBAAC,cACE,UAAc,cAAA;AAAA,gBACb,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cACjB,CAAA,GACH;AAAA,cACA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,UAAU,OAAO;AAAA,kBACjB,cAAc,CAAC,MAAM,cAAc,QAAQ,EAAE,OAAO,KAAK;AAAA,kBACzD,MAAK;AAAA,gBAAA;AAAA,cACP;AAAA,YAAA,EAAA,CACF,EACF,CAAA;AAAA,YAEF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,kCACG,QAAO,EAAA,SAAS,aAAa,SAAQ,YAAW,MAAK,UACnD,UAAc,cAAA;AAAA,kBACb,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBACjB,CAAA,GACH;AAAA,gBAEF;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKE,oBAAC,QAAO,EAAA,MAAK,UAAS,UAAU,CAAC,OAAO,WAAW,SAAS,WACzD,UAAc,cAAA;AAAA,oBACb,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBACjB,CAAA,GACH;AAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UACF,EAAA,CAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;AAMO,MAAM,sBAAsB,MAAM;AACvC,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,KAAK;AAC1D,QAAM,EAAE,eAAe,YAAY,eAAe,QAAQ;AACpD,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa,EAAE,IAAI,QAAQ;AAAA,IAC3B;AAAA,MACE,yBAAyB;AAE7B,QAAM,iBAAiB;AACjB,QAAA,WAAW,WAAW,QAAQ,kBAAkB;AACtD,QAAM,cAAc,WAChB;AAAA,IACE;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EAEpB,IAAA;AAEE,QAAA,WAAW,4BAA4B,WAAW;AAClD,QAAA,WAAW,SAAS,MAAM;AAKhC,MAAI,CAAC,UAAU;AACN,WAAA;AAAA,EACT;AAOI,MAAA,mBAAmB,CAAC,oBAAoB;AACnC,WAAA;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,eAAe,CAAC,SAAS,CAAC,IAAI;AAElD,QAAA,yBAAyB,CAC7B,YACA,UACG;AACH,QAAI,eAAe,aAAa;AAC9B,aAAO,YAAY,KAAK;AAAA,IAC1B;AAEA,WAAO,UAAU,KAAK;AAAA,EAAA;AAGxB,SACG,oBAAA,kBAAA,EAAiB,aAAa,YAAY,MACzC,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,cAAY,cAAc;AAAA,QACxB,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB;AAAA,MACD,YAAW;AAAA,MACX,aAAY;AAAA,MACZ,WAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAO;AAAA,MAEP,UAAA;AAAA,QAAA,qBAAC,QAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,UAAA,oBAAC,cAAW,SAAQ,SAAQ,WAAU,cAAa,eAAc,aAC9D,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UACjB,CAAA,GACH;AAAA,UACC,UAAU,IAAI,CAAC,YAAY;AAExB,mBAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,YAAW;AAAA,gBACX,aAAY;AAAA,gBACZ,aAAY;AAAA,gBACZ,aAAa,uBAAuB,QAAQ,OAAO,MAAM,KAAK;AAAA,gBAC9D,UAAS;AAAA,gBACT,WAAS;AAAA,gBAET,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,YAAY;AAAA,sBACZ,eAAe;AAAA,sBACf,aAAa;AAAA,sBACb,cAAc;AAAA,sBACd,YAAY,uBAAuB,QAAQ,OAAO,MAAM,KAAK;AAAA,sBAC7D,OAAM;AAAA,sBAEN,UAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,UAAU;AAAA,0BACV,SAAQ;AAAA,0BACR,WAAW,uBAAuB,QAAQ,OAAO,MAAM,KAAK;AAAA,0BAE3D,UAAA;AAAA,4BACC;AAAA,8BACE,IAAI;AAAA,8BACJ,gBACE;AAAA,4BACJ;AAAA,4BACA,EAAE,WAAW,QAAQ,OAAO,SAAS,UAAU;AAAA,0BACjD;AAAA,wBAAA;AAAA,sBACF;AAAA,oBAAA;AAAA,kBACF;AAAA,kBACA,qBAAC,MAAK,EAAA,SAAS,GAAG,WAAU,UAAS,KAAK,GAAG,OAAM,QAAO,YAAW,cACnE,UAAA;AAAA,oBAAC,oBAAA,YAAA,EAAW,UAAU,GAAG,YAAW,QAAO,SAAQ,SAAQ,WAAU,cAClE,UAAA,QAAQ,KACX,CAAA;AAAA,oBACC,QAAQ,eAAe,QAAQ,gCAC7B,YAAW,EAAA,SAAQ,MAAK,WAAU,cAChC,UAAA;AAAA,sBACC;AAAA,wBACE,IAAI;AAAA,wBACJ,gBAAgB;AAAA,sBAClB;AAAA,sBACA;AAAA,wBACE,MAAM,WAAW,IAAI,KAAK,QAAQ,WAAW,GAAG;AAAA,0BAC9C,KAAK;AAAA,0BACL,OAAO;AAAA,0BACP,MAAM;AAAA,0BACN,UAAU,QAAQ;AAAA,wBAAA,CACnB;AAAA,wBACD,MAAM,WAAW,IAAI,KAAK,QAAQ,WAAW,GAAG;AAAA,0BAC9C,WAAW;AAAA,0BACX,UAAU,QAAQ;AAAA,wBAAA,CACnB;AAAA,wBACD,QAAQ;AAAA,0BACN,QAAQ;AAAA,0BACR,IAAI,KAAK,QAAQ,WAAW;AAAA,wBAC9B;AAAA,sBACF;AAAA,oBAAA,GAEJ;AAAA,oBAEF,oBAAC,kBAAiB,EAAA,aAAa,YAAY,cACzC,+BAAC,kBAAkB,MAAlB,EAAuB,kBAAgB,MACtC,UAAA;AAAA,sBAAA,oBAAC,kBAAkB,iBAAlB,EAAkC,WAAW,QAAQ,IAAI;AAAA,sBAC1D;AAAA,wBAAC,kBAAkB;AAAA,wBAAlB;AAAA,0BACC,WAAW,QAAQ;AAAA,0BACnB,UAAU,QAAQ,OAAO;AAAA,wBAAA;AAAA,sBAC3B;AAAA,oBAAA,EAAA,CACF,EACF,CAAA;AAAA,kBAAA,GACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cAvEK,QAAQ;AAAA,YAAA;AAAA,UAwEf,CAEH;AAAA,UACA,oBAAA,kBAAA,EAAiB,aAAa,YAAY,cACzC,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,gBAAe;AAAA,cACf,aAAa;AAAA,cACb,cAAc;AAAA,cACd,OAAM;AAAA,cACN,SAAQ;AAAA,cACR,+BAAY,MAAK,EAAA;AAAA,cACjB,SAAS;AAAA,cAER,UAAc,cAAA;AAAA,gBACb,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,YAAA;AAAA,UAAA,GAEL;AAAA,QAAA,GACF;AAAA,QACC,eACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAa;AAAA,YACb;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN,EAAA,CAAA;AAEJ;ACjaA,MAAM,QAAkC;AAAA;AAAA,EAEtC,SAAS,KAAU;AACjB,QAAI,OAAO,OAAO,SAAS,UAAU,sBAAsB,GAAG;AAC5D,UAAI,YAAY;AAAA,QACd,IAAI,YAAY,QAAQ;AAAA,QACxB,MAAM;AAAA,QACN,WAAW;AAAA,UACT,IAAI,GAAG,QAAQ;AAAA,UACf,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,YAAY;AAChB,gBAAM,EAAE,IAAA,IAAQ,MAAM,OAAO,oBAAa;AACnC,iBAAA;AAAA,QACT;AAAA,QACA,aAAa,YAAY;AAAA,MAAA,CAC1B;AAMD,UAAI,eAAe,CAAC,MAAM,WAAW,UAAU,CAAC;AAEhD,UAAI,YAAY;AAAA,QACd,CAAC,WAAW,WAAW,GAAG,WAAW;AAAA,MAAA,CACtC;AAGG,UAAA,8BAA8B,YAAY,eAAe;AAAA,QAC3D,MAAM,GAAG,QAAQ;AAAA,QACjB,WAAW;AAAA,MAAA,CACZ;AAAA,IACH,WACE,CAAC,OAAO,OAAO,SAAS,UAAU,sBAAsB,KACxD,OAAO,QAAQ,OAAO,WACtB;AACA,UAAI,YAAY;AAAA,QACd,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,UACT,IAAI,GAAG,QAAQ;AAAA,UACf,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,YAAY;AAChB,gBAAM,EAAE,wBAAA,IAA4B,MAAM,OAAO,wCAAiC;AAC3E,iBAAA;AAAA,QACT;AAAA,QACA,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF;AAAA,EACA,MAAM,cAAc,EAAE,WAAkC;AAChD,UAAA,gBAAgB,MAAM,QAAQ;AAAA,MAClC,QAAQ,IAAI,CAAC,WAAW;AACf,eAAA,qCAA+B,uBAAA,OAAA,EAAA,0BAAA,MAAA,OAAA,mBAAA,EAAA,CAAA,GAAA,kBAAA,MAAA,OAAA,EACnC,KAAK,CAAC,EAAE,SAAS,WAAW;AACpB,iBAAA;AAAA,YACL,MAAM,yBAAyB,MAAM,kBAAkB;AAAA,YACvD;AAAA,UAAA;AAAA,QACF,CACD,EACA,MAAM,MAAM;AACJ,iBAAA;AAAA,YACL,MAAM,CAAC;AAAA,YACP;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA,CACJ;AAAA,IAAA;AAGI,WAAA,QAAQ,QAAQ,aAAa;AAAA,EACtC;AACF;"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const index = require("../_chunks/index-Nf1JfI-m.js");
2
+ const index = require("../_chunks/index-ML_b3php.js");
3
3
  require("@strapi/helper-plugin");
4
4
  require("@strapi/icons");
5
5
  require("react/jsx-runtime");
@@ -1,4 +1,4 @@
1
- import { l } from "../_chunks/index--4AgLDzb.mjs";
1
+ import { l } from "../_chunks/index-Ys87ROOe.mjs";
2
2
  import "@strapi/helper-plugin";
3
3
  import "@strapi/icons";
4
4
  import "react/jsx-runtime";