@strapi/i18n 5.0.0-beta.9 → 5.0.0-rc.1

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.
@@ -1,11 +1,12 @@
1
1
  import get from "lodash/get";
2
2
  import * as yup from "yup";
3
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
+ import { jsxs, jsx } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
- import { Typography, Field, Checkbox, Dialog, DialogBody, Flex, DialogFooter, Button as Button$1, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
5
+ import { Typography, Dialog, Field, Checkbox, Flex, Button as Button$1, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
6
6
  import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, ListPlus, Earth, EarthStriked, CaretDown } from "@strapi/icons";
7
7
  import { useIntl } from "react-intl";
8
8
  import { styled } from "styled-components";
9
+ import { skipToken } from "@reduxjs/toolkit/query";
9
10
  import { useAuth, adminApi, useTable, Table, useQueryParams, useNotification, useAPIErrorHandler } from "@strapi/admin/strapi-admin";
10
11
  import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from "@strapi/content-manager/strapi-admin";
11
12
  import { useParams, Link, useNavigate, matchPath } from "react-router-dom";
@@ -47,9 +48,7 @@ const CheckboxConfirmation = ({
47
48
  };
48
49
  const handleConfirm = () => {
49
50
  onChange({ target: { name, value: false, type: "checkbox" } });
50
- setIsOpen(false);
51
51
  };
52
- const handleToggle = () => setIsOpen((prev) => !prev);
53
52
  const label = intlLabel.id ? formatMessage(
54
53
  { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
55
54
  { ...intlLabel.values }
@@ -58,35 +57,36 @@ const CheckboxConfirmation = ({
58
57
  { id: description.id, defaultMessage: description.defaultMessage },
59
58
  { ...description.values }
60
59
  ) : "";
61
- return /* @__PURE__ */ jsxs(Fragment, { children: [
60
+ return /* @__PURE__ */ jsxs(Dialog.Root, { open: isOpen, onOpenChange: setIsOpen, children: [
62
61
  /* @__PURE__ */ jsxs(Field.Root, { hint, name, children: [
63
- /* @__PURE__ */ jsx(Checkbox, { onValueChange: handleChange, value, type: "checkbox", children: label }),
62
+ /* @__PURE__ */ jsx(Checkbox, { onCheckedChange: handleChange, checked: value, children: label }),
64
63
  /* @__PURE__ */ jsx(Field.Hint, {})
65
64
  ] }),
66
- isOpen && /* @__PURE__ */ jsxs(Dialog, { onClose: handleToggle, title: "Confirmation", isOpen, children: [
67
- /* @__PURE__ */ jsx(DialogBody, { icon: /* @__PURE__ */ jsx(WarningCircle, {}), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
68
- /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(TextAlignTypography, { id: "confirm-description", children: formatMessage({
65
+ /* @__PURE__ */ jsxs(Dialog.Content, { children: [
66
+ /* @__PURE__ */ jsx(Dialog.Header, { children: formatMessage({
67
+ id: getTranslation("CheckboxConfirmation.Modal.title"),
68
+ defaultMessage: "Disable localization"
69
+ }) }),
70
+ /* @__PURE__ */ jsx(Dialog.Body, { icon: /* @__PURE__ */ jsx(WarningCircle, {}), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
71
+ /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(TextAlignTypography, { children: formatMessage({
69
72
  id: getTranslation("CheckboxConfirmation.Modal.content"),
70
73
  defaultMessage: "Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing)."
71
74
  }) }) }),
72
- /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold", id: "confirm-description", children: formatMessage({
75
+ /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold", children: formatMessage({
73
76
  id: getTranslation("CheckboxConfirmation.Modal.body"),
74
77
  defaultMessage: "Do you want to disable it?"
75
78
  }) }) })
76
79
  ] }) }),
77
- /* @__PURE__ */ jsx(
78
- DialogFooter,
79
- {
80
- startAction: /* @__PURE__ */ jsx(Button$1, { onClick: handleToggle, variant: "tertiary", children: formatMessage({
81
- id: "components.popUpWarning.button.cancel",
82
- defaultMessage: "No, cancel"
83
- }) }),
84
- endAction: /* @__PURE__ */ jsx(Button$1, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
85
- id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
86
- defaultMessage: "Yes, disable"
87
- }) })
88
- }
89
- )
80
+ /* @__PURE__ */ jsxs(Dialog.Footer, { children: [
81
+ /* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button$1, { variant: "tertiary", children: formatMessage({
82
+ id: "components.popUpWarning.button.cancel",
83
+ defaultMessage: "No, cancel"
84
+ }) }) }),
85
+ /* @__PURE__ */ jsx(Dialog.Action, { children: /* @__PURE__ */ jsx(Button$1, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
86
+ id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
87
+ defaultMessage: "Yes, disable"
88
+ }) }) })
89
+ ] })
90
90
  ] })
91
91
  ] });
92
92
  };
@@ -137,7 +137,7 @@ const useI18n = () => {
137
137
  model: params.slug
138
138
  },
139
139
  {
140
- skip: !params.slug || !params.collectionType
140
+ skip: true
141
141
  }
142
142
  );
143
143
  if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
@@ -540,22 +540,27 @@ const BulkLocalePublishAction = ({
540
540
  const { toggleNotification } = useNotification();
541
541
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
542
542
  const [selectedRows, setSelectedRows] = React.useState([]);
543
- const [isConfirmationOpen, setIsConfirmationOpen] = React.useState(false);
543
+ const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React.useState(false);
544
544
  const { publishMany: publishManyAction } = unstable_useDocumentActions();
545
545
  const {
546
546
  document,
547
547
  meta: documentMeta,
548
548
  schema,
549
549
  validate
550
- } = unstable_useDocument({
551
- model,
552
- collectionType,
553
- documentId,
554
- params: {
555
- locale: baseLocale
550
+ } = unstable_useDocument(
551
+ {
552
+ model,
553
+ collectionType,
554
+ documentId,
555
+ params: {
556
+ locale: baseLocale
557
+ }
558
+ },
559
+ {
560
+ skip: !hasI18n
556
561
  }
557
- });
558
- const { data: localesMetadata = [] } = useGetLocalesQuery();
562
+ );
563
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : skipToken);
559
564
  const headers = [
560
565
  {
561
566
  label: formatMessage({
@@ -654,7 +659,7 @@ const BulkLocalePublishAction = ({
654
659
  };
655
660
  const handleAction = async () => {
656
661
  if (draftRelationsCount > 0) {
657
- setIsConfirmationOpen(true);
662
+ setIsDraftRelationConfirmationOpen(true);
658
663
  } else {
659
664
  await publish();
660
665
  }
@@ -663,7 +668,7 @@ const BulkLocalePublishAction = ({
663
668
  if (isUnpublish) {
664
669
  console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
665
670
  }
666
- if (isConfirmationOpen) {
671
+ if (isDraftRelationConfirmationOpen) {
667
672
  return {
668
673
  label: formatMessage({
669
674
  id: "app.components.ConfirmDialog.title",
@@ -672,11 +677,11 @@ const BulkLocalePublishAction = ({
672
677
  variant: "danger",
673
678
  dialog: {
674
679
  onCancel: () => {
675
- setIsConfirmationOpen(false);
680
+ setIsDraftRelationConfirmationOpen(false);
676
681
  },
677
682
  onConfirm: async () => {
678
683
  await publish();
679
- setIsConfirmationOpen(false);
684
+ setIsDraftRelationConfirmationOpen(false);
680
685
  },
681
686
  type: "dialog",
682
687
  title: formatMessage({
@@ -686,20 +691,25 @@ const BulkLocalePublishAction = ({
686
691
  content: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "center", gap: 2, children: [
687
692
  /* @__PURE__ */ jsx(WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
688
693
  /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
689
- id: "content-manager.actions.discard.dialog.body",
690
- defaultMessage: "Are you sure you want to discard the changes? This action is irreversible."
694
+ id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
695
+ defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
696
+ }) }),
697
+ /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
698
+ id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
699
+ defaultMessage: "Are you sure you want to continue?"
691
700
  }) })
692
701
  ] })
693
702
  }
694
703
  };
695
704
  }
705
+ const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
696
706
  return {
697
707
  label: formatMessage({
698
708
  id: getTranslation("CMEditViewBulkLocale.publish-title"),
699
709
  defaultMessage: "Publish Multiple Locales"
700
710
  }),
701
711
  icon: /* @__PURE__ */ jsx(ListPlus, {}),
702
- disabled: isPublishedTab || !canPublish,
712
+ disabled: isPublishedTab || canPublish.length === 0,
703
713
  position: ["panel"],
704
714
  variant: "secondary",
705
715
  dialog: {
@@ -731,11 +741,11 @@ const BulkLocalePublishAction = ({
731
741
  }
732
742
  );
733
743
  },
734
- footer: () => /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(
744
+ footer: () => /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", width: "100%", children: /* @__PURE__ */ jsx(
735
745
  Button$1,
736
746
  {
737
747
  loading: isDraftRelationsLoading,
738
- disabled: localesToPublish.length === 0,
748
+ disabled: !hasPermission || localesToPublish.length === 0,
739
749
  variant: "default",
740
750
  onClick: handleAction,
741
751
  children: formatMessage({
@@ -803,13 +813,6 @@ const UnpublishModalAdditionalInfo = () => {
803
813
  }
804
814
  ) });
805
815
  };
806
- const Initializer = ({ setPlugin }) => {
807
- const setPluginRef = React.useRef(setPlugin);
808
- React.useEffect(() => {
809
- setPluginRef.current(pluginId);
810
- }, []);
811
- return null;
812
- };
813
816
  const LocalePicker = () => {
814
817
  const { formatMessage } = useIntl();
815
818
  const [{ query }, setQuery] = useQueryParams();
@@ -950,13 +953,7 @@ const LocaleListCell = ({
950
953
  }
951
954
  });
952
955
  const { locale: language } = useIntl();
953
- const [visible, setVisible] = React.useState(false);
954
- const buttonRef = React.useRef(null);
955
956
  const { data: locales = [] } = useGetLocalesQuery();
956
- const handleTogglePopover = (e) => {
957
- e.stopPropagation();
958
- setVisible((prev) => !prev);
959
- };
960
957
  const formatter = useCollator(language, {
961
958
  sensitivity: "base"
962
959
  });
@@ -978,8 +975,8 @@ const LocaleListCell = ({
978
975
  }
979
976
  return locale.name;
980
977
  }).toSorted((a, b) => formatter.compare(a, b));
981
- return /* @__PURE__ */ jsxs(Button, { type: "button", onClick: handleTogglePopover, ref: buttonRef, children: [
982
- /* @__PURE__ */ jsxs(
978
+ return /* @__PURE__ */ jsxs(Popover.Root, { children: [
979
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs(
983
980
  ActionWrapper,
984
981
  {
985
982
  minWidth: "100%",
@@ -992,17 +989,8 @@ const LocaleListCell = ({
992
989
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(CaretDown, {}) })
993
990
  ]
994
991
  }
995
- ),
996
- visible && /* @__PURE__ */ jsx(
997
- Popover,
998
- {
999
- onDismiss: () => setVisible(false),
1000
- source: buttonRef,
1001
- spacing: 16,
1002
- centered: true,
1003
- children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) })
1004
- }
1005
- )
992
+ ) }) }),
993
+ /* @__PURE__ */ jsx(Popover.Content, { sideOffset: 16, children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) }) })
1006
994
  ] });
1007
995
  };
1008
996
  const Button = styled.button`
@@ -1064,18 +1052,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1064
1052
  const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
1065
1053
  return {
1066
1054
  displayedHeaders: [
1067
- // TODO: Fix when migrating to v5
1068
- // ...displayedHeaders,
1055
+ ...displayedHeaders,
1069
1056
  {
1070
- key: "__locale__",
1071
- fieldSchema: { type: "string" },
1072
- metadatas: {
1073
- label: {
1074
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1075
- defaultMessage: "locale"
1076
- },
1077
- searchable: false,
1078
- sortable: false
1057
+ label: {
1058
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1059
+ defaultMessage: "locale"
1079
1060
  },
1080
1061
  name: "locale"
1081
1062
  }
@@ -1223,8 +1204,6 @@ const index = {
1223
1204
  app.addRBACMiddleware([localeMiddleware]);
1224
1205
  app.registerPlugin({
1225
1206
  id: pluginId,
1226
- initializer: Initializer,
1227
- isReady: false,
1228
1207
  name: pluginId
1229
1208
  });
1230
1209
  },
@@ -1242,7 +1221,7 @@ const index = {
1242
1221
  },
1243
1222
  id: "internationalization",
1244
1223
  to: "internationalization",
1245
- Component: () => import("./SettingsPage-BWlXRGN7.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
1224
+ Component: () => import("./SettingsPage-D7g35okk.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
1246
1225
  permissions: PERMISSIONS.accessMain
1247
1226
  });
1248
1227
  const contentManager = app.getPlugin("content-manager");
@@ -1359,7 +1338,7 @@ const index = {
1359
1338
  async registerTrads({ locales }) {
1360
1339
  const importedTrads = await Promise.all(
1361
1340
  locales.map((locale) => {
1362
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-18tWw4P6.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1341
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-CM6Pjfyv.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1363
1342
  return {
1364
1343
  data: prefixPluginTranslations(data, pluginId),
1365
1344
  locale
@@ -1385,4 +1364,4 @@ export {
1385
1364
  index as i,
1386
1365
  useCreateLocaleMutation as u
1387
1366
  };
1388
- //# sourceMappingURL=index-DVTdCB4M.mjs.map
1367
+ //# sourceMappingURL=index-1KQC6aOV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-1KQC6aOV.mjs","sources":["../../admin/src/pluginId.ts","../../admin/src/utils/getTranslation.ts","../../admin/src/components/CheckboxConfirmation.tsx","../../admin/src/utils/fields.ts","../../admin/src/utils/strings.ts","../../admin/src/hooks/useI18n.ts","../../admin/src/services/api.ts","../../admin/src/services/locales.ts","../../admin/src/services/relations.ts","../../admin/src/components/BulkLocaleActionModal.tsx","../../admin/src/components/CMHeaderActions.tsx","../../admin/src/components/CMListViewModalsAdditionalInformation.tsx","../../admin/src/components/LocalePicker.tsx","../../admin/src/constants.ts","../../admin/src/contentManagerHooks/editView.tsx","../../admin/src/components/LocaleListCell.tsx","../../admin/src/contentManagerHooks/listView.tsx","../../admin/src/contentReleasesHooks/releaseDetailsView.ts","../../admin/src/middlewares/extendCTBAttributeInitialData.ts","../../admin/src/middlewares/extendCTBInitialData.ts","../../admin/src/middlewares/rbac-middleware.ts","../../admin/src/utils/prefixPluginTranslations.ts","../../admin/src/utils/schemas.ts","../../admin/src/index.ts"],"sourcesContent":["export const pluginId = 'i18n';\n","import { pluginId } from '../pluginId';\n\nconst getTranslation = (id: string) => `${pluginId}.${id}`;\n\nexport { getTranslation };\n","import * as React from 'react';\n\nimport { Button, Checkbox, Dialog, Field, Flex, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nconst TextAlignTypography = styled(Typography)`\n text-align: center;\n`;\n\ninterface IntlMessage extends MessageDescriptor {\n values: object;\n}\n\ninterface CheckboxConfirmationProps {\n description: IntlMessage;\n intlLabel: IntlMessage;\n isCreating?: boolean;\n name: string;\n onChange: (event: { target: { name: string; value: boolean; type: string } }) => void;\n value: boolean;\n}\n\nconst CheckboxConfirmation = ({\n description,\n isCreating = false,\n intlLabel,\n name,\n onChange,\n value,\n}: CheckboxConfirmationProps) => {\n const { formatMessage } = useIntl();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleChange = (value: boolean) => {\n if (isCreating || value) {\n return onChange({ target: { name, value, type: 'checkbox' } });\n }\n\n if (!value) {\n return setIsOpen(true);\n }\n\n return null;\n };\n\n const handleConfirm = () => {\n onChange({ target: { name, value: false, type: 'checkbox' } });\n };\n\n const label = intlLabel.id\n ? formatMessage(\n { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },\n { ...intlLabel.values }\n )\n : name;\n\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={setIsOpen}>\n <Field.Root hint={hint} name={name}>\n <Checkbox onCheckedChange={handleChange} checked={value}>\n {label}\n </Checkbox>\n <Field.Hint />\n </Field.Root>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.title'),\n defaultMessage: 'Disable localization',\n })}\n </Dialog.Header>\n <Dialog.Body icon={<WarningCircle />}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex justifyContent=\"center\">\n <TextAlignTypography>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.content'),\n defaultMessage:\n 'Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing).',\n })}\n </TextAlignTypography>\n </Flex>\n <Flex justifyContent=\"center\">\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.body'),\n defaultMessage: 'Do you want to disable it?',\n })}\n </Typography>\n </Flex>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\">\n {formatMessage({\n id: 'components.popUpWarning.button.cancel',\n defaultMessage: 'No, cancel',\n })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"danger-light\" onClick={handleConfirm}>\n {formatMessage({\n id: getTranslation('CheckboxConfirmation.Modal.button-confirm'),\n defaultMessage: 'Yes, disable',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\nexport { CheckboxConfirmation };\n","const LOCALIZED_FIELDS = [\n 'biginteger',\n 'boolean',\n 'component',\n 'date',\n 'datetime',\n 'decimal',\n 'dynamiczone',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'media',\n 'number',\n 'password',\n 'richtext',\n 'blocks',\n 'string',\n 'text',\n 'time',\n];\n\nconst doesPluginOptionsHaveI18nLocalized = (\n opts?: object\n): opts is { i18n: { localized: boolean } } =>\n typeof opts === 'object' &&\n opts !== null &&\n 'i18n' in opts &&\n typeof opts.i18n === 'object' &&\n opts.i18n !== null &&\n 'localized' in opts.i18n &&\n typeof opts.i18n.localized === 'boolean';\n\nexport { LOCALIZED_FIELDS, doesPluginOptionsHaveI18nLocalized };\n","const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport { capitalize };\n","import * as React from 'react';\n\nimport { useAuth } from '@strapi/admin/strapi-admin';\nimport { unstable_useDocument as useDocument } from '@strapi/content-manager/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport { doesPluginOptionsHaveI18nLocalized } from '../utils/fields';\nimport { capitalize } from '../utils/strings';\n\ntype UseI18n = () => {\n hasI18n: boolean;\n canCreate: string[];\n canRead: string[];\n canUpdate: string[];\n canDelete: string[];\n canPublish: string[];\n};\n\n/**\n * @alpha\n * @description This hook is used to get the i18n status of a content type.\n * Also returns the CRUDP permission locale properties for the content type\n * so we know which locales the user can perform actions on.\n */\nconst useI18n: UseI18n = () => {\n // Extract the params from the URL to pass to our useDocument hook\n const params = useParams<{ collectionType: string; slug: string; model: string }>();\n\n const userPermissions = useAuth('useI18n', (state) => state.permissions);\n const actions = React.useMemo(() => {\n const permissions = userPermissions.filter((permission) => permission.subject === params.slug);\n\n return permissions.reduce<Omit<ReturnType<UseI18n>, 'hasI18n'>>(\n (acc, permission) => {\n const [actionShorthand] = permission.action.split('.').slice(-1);\n\n return {\n ...acc,\n [`can${capitalize(actionShorthand)}`]: permission.properties?.locales ?? [],\n };\n },\n { canCreate: [], canRead: [], canUpdate: [], canDelete: [], canPublish: [] }\n );\n }, [params.slug, userPermissions]);\n\n // TODO: use specific hook to get schema only\n const { schema } = useDocument(\n {\n // We can non-null assert these because below we skip the query if they are not present\n collectionType: params.collectionType!,\n model: params.slug!,\n },\n {\n skip: true,\n }\n );\n\n if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {\n return {\n hasI18n: schema.pluginOptions.i18n.localized,\n ...actions,\n };\n }\n\n return {\n hasI18n: false,\n ...actions,\n };\n};\n\nexport { useI18n };\n","import { adminApi } from '@strapi/admin/strapi-admin';\n\nconst i18nApi = adminApi.enhanceEndpoints({\n addTagTypes: ['Locale'],\n});\n\nexport { i18nApi };\n","import { i18nApi } from './api';\n\nimport type { GetISOLocales } from '../../../shared/contracts/iso-locales';\nimport type {\n GetLocales,\n CreateLocale,\n DeleteLocale,\n UpdateLocale,\n} from '../../../shared/contracts/locales';\n\nconst localesApi = i18nApi.injectEndpoints({\n endpoints: (builder) => ({\n createLocale: builder.mutation<CreateLocale.Response, CreateLocale.Request['body']>({\n query: (data) => ({\n url: '/i18n/locales',\n method: 'POST',\n data,\n }),\n invalidatesTags: [{ type: 'Locale', id: 'LIST' }],\n }),\n deleteLocale: builder.mutation<DeleteLocale.Response, DeleteLocale.Params['id']>({\n query: (id) => ({\n url: `/i18n/locales/${id}`,\n method: 'DELETE',\n }),\n invalidatesTags: (result, error, id) => [{ type: 'Locale', id }],\n }),\n getLocales: builder.query<GetLocales.Response, void>({\n query: () => '/i18n/locales',\n providesTags: (res) => [\n { type: 'Locale', id: 'LIST' },\n ...(Array.isArray(res)\n ? res.map((locale) => ({\n type: 'Locale' as const,\n id: locale.id,\n }))\n : []),\n ],\n }),\n getDefaultLocales: builder.query<GetISOLocales.Response, void>({\n query: () => '/i18n/iso-locales',\n }),\n updateLocale: builder.mutation<\n UpdateLocale.Response,\n UpdateLocale.Request['body'] & UpdateLocale.Params\n >({\n query: ({ id, ...data }) => ({\n url: `/i18n/locales/${id}`,\n method: 'PUT',\n data,\n }),\n invalidatesTags: (result, error, { id }) => [{ type: 'Locale', id }],\n }),\n }),\n});\n\nconst {\n useCreateLocaleMutation,\n useDeleteLocaleMutation,\n useGetLocalesQuery,\n useGetDefaultLocalesQuery,\n useUpdateLocaleMutation,\n} = localesApi;\n\nexport {\n useCreateLocaleMutation,\n useDeleteLocaleMutation,\n useGetLocalesQuery,\n useGetDefaultLocalesQuery,\n useUpdateLocaleMutation,\n};\n","import { i18nApi } from './api';\n\nimport type { CountManyEntriesDraftRelations } from '../../../shared/contracts/content-manager';\n\nconst relationsApi = i18nApi.injectEndpoints({\n overrideExisting: true,\n endpoints: (builder) => ({\n getManyDraftRelationCount: builder.query<\n CountManyEntriesDraftRelations.Response['data'],\n CountManyEntriesDraftRelations.Request['query'] & {\n model: string;\n }\n >({\n query: ({ model, ...params }) => ({\n url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (response: CountManyEntriesDraftRelations.Response) => response.data,\n }),\n }),\n});\n\nconst { useGetManyDraftRelationCountQuery } = relationsApi;\n\nexport { useGetManyDraftRelationCountQuery };\n","import * as React from 'react';\n\nimport { FormErrors, Table, useTable } from '@strapi/admin/strapi-admin';\nimport { Box, Typography, IconButton, Flex, Tooltip, Status } from '@strapi/design-system';\nimport { Pencil, CheckCircle, CrossCircle, ArrowsCounterClockwise } from '@strapi/icons';\nimport { Modules } from '@strapi/types';\nimport { stringify } from 'qs';\nimport { type MessageDescriptor, useIntl, PrimitiveType } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { LocaleStatus } from './CMHeaderActions';\n\ntype Status = Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n\n/* -------------------------------------------------------------------------------------------------\n * EntryValidationText\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EntryValidationTextProps {\n status: Status;\n validationErrors: FormErrors[string] | null;\n}\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\nconst EntryValidationText = ({ status = 'draft', validationErrors }: EntryValidationTextProps) => {\n const { formatMessage } = useIntl();\n\n /**\n * TODO: Should this be extracted an made into a factory to recursively get\n * error messages??\n */\n const getErrorStr = (key: string, value?: FormErrors[string]): string => {\n if (typeof value === 'string') {\n return `${key}: ${value}`;\n } else if (isErrorMessageDescriptor(value)) {\n return `${key}: ${formatMessage(value)}`;\n } else if (Array.isArray(value)) {\n return value.map((v) => getErrorStr(key, v)).join(' ');\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n return Object.entries(value)\n .map(([k, v]) => getErrorStr(k, v))\n .join(' ');\n } else {\n /**\n * unlikely to happen, but we need to return something\n */\n return '';\n }\n };\n\n if (validationErrors) {\n const validationErrorsMessages = Object.entries(validationErrors)\n .map(([key, value]) => {\n return getErrorStr(key, value);\n })\n .join(' ');\n\n return (\n <Flex gap={2}>\n <CrossCircle fill=\"danger600\" />\n <Tooltip label={validationErrorsMessages}>\n <Typography\n maxWidth={'30rem'}\n textColor=\"danger600\"\n variant=\"omega\"\n fontWeight=\"semiBold\"\n ellipsis\n >\n {validationErrorsMessages}\n </Typography>\n </Tooltip>\n </Flex>\n );\n }\n\n if (status === 'published') {\n return (\n <Flex gap={2}>\n <CheckCircle fill=\"success600\" />\n <Typography textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-manager.bulk-publish.already-published',\n defaultMessage: 'Already Published',\n })}\n </Typography>\n </Flex>\n );\n }\n\n if (status === 'modified') {\n return (\n <Flex gap={2}>\n <ArrowsCounterClockwise fill=\"alternative600\" />\n <Typography>\n {formatMessage({\n id: 'app.utils.ready-to-publish-changes',\n defaultMessage: 'Ready to publish changes',\n })}\n </Typography>\n </Flex>\n );\n }\n\n return (\n <Flex gap={2}>\n <CheckCircle fill=\"success600\" />\n <Typography>\n {formatMessage({\n id: 'app.utils.ready-to-publish',\n defaultMessage: 'Ready to publish',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BoldChunk\n * -----------------------------------------------------------------------------------------------*/\n\nconst BoldChunk = (chunks: React.ReactNode) => <Typography fontWeight=\"bold\">{chunks}</Typography>;\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BulkLocaleActionModalProps {\n rows: LocaleStatus[];\n headers: {\n label: string;\n name: string;\n }[];\n localesMetadata: Locale[];\n validationErrors?: FormErrors;\n}\n\nconst BulkLocaleActionModal = ({\n headers,\n rows,\n localesMetadata,\n\n validationErrors = {},\n}: BulkLocaleActionModalProps) => {\n const { formatMessage } = useIntl();\n\n const selectedRows = useTable<LocaleStatus[]>(\n 'BulkLocaleActionModal',\n (state) => state.selectedRows\n );\n\n const getFormattedCountMessage = () => {\n const currentStatusByLocale = rows.reduce<Record<string, string>>((acc, { locale, status }) => {\n acc[locale] = status;\n return acc;\n }, {});\n const localesWithErrors = Object.keys(validationErrors);\n\n const alreadyPublishedCount = selectedRows.filter(\n ({ locale }) => currentStatusByLocale[locale] === 'published'\n ).length;\n\n const readyToPublishCount = selectedRows.filter(\n ({ locale }) =>\n (currentStatusByLocale[locale] === 'draft' ||\n currentStatusByLocale[locale] === 'modified') &&\n !localesWithErrors.includes(locale)\n ).length;\n\n const withErrorsCount = localesWithErrors.length;\n\n return formatMessage(\n {\n id: 'content-manager.containers.list.selectedEntriesModal.selectedCount',\n defaultMessage:\n '<b>{alreadyPublishedCount}</b> {alreadyPublishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action.',\n },\n {\n withErrorsCount,\n readyToPublishCount,\n alreadyPublishedCount,\n b: BoldChunk,\n }\n );\n };\n\n return (\n <React.Fragment>\n <Typography>{getFormattedCountMessage()}</Typography>\n <Box marginTop={5}>\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {headers.map((head) => (\n <Table.HeaderCell key={head.name} {...head} />\n ))}\n </Table.Head>\n <Table.Body>\n {rows.map(({ locale, status }, index) => {\n const error = validationErrors?.[locale] ?? null;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return (\n <Table.Row key={index}>\n <Table.CheckboxCell id={locale} aria-label={`Select ${locale}`} />\n <Table.Cell>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {Array.isArray(localesMetadata)\n ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name\n : locale}\n </Typography>\n </Table.Cell>\n <Table.Cell>\n <Box display=\"flex\">\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n showBullet={false}\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n </Box>\n </Table.Cell>\n <Table.Cell>\n <EntryValidationText validationErrors={error} status={status} />\n </Table.Cell>\n <Table.Cell>\n <IconButton\n tag={Link}\n to={{\n search: stringify({ plugins: { i18n: { locale } } }),\n }}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: locale,\n }\n )}\n borderWidth={0}\n >\n <Pencil />\n </IconButton>\n </Table.Cell>\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table.Content>\n </Box>\n </React.Fragment>\n );\n};\n\nexport { BulkLocaleActionModal };\nexport type { BulkLocaleActionModalProps };\n","import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n useNotification,\n useQueryParams,\n Table,\n useAPIErrorHandler,\n FormErrors,\n} from '@strapi/admin/strapi-admin';\nimport {\n type HeaderActionComponent,\n type DocumentActionComponent,\n unstable_useDocument as useDocument,\n unstable_useDocumentActions as useDocumentActions,\n buildValidParams,\n} from '@strapi/content-manager/strapi-admin';\nimport { Flex, Status, Typography, Button } from '@strapi/design-system';\nimport { WarningCircle, ListPlus, Trash } from '@strapi/icons';\nimport { Modules } from '@strapi/types';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useI18n } from '../hooks/useI18n';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { useGetManyDraftRelationCountQuery } from '../services/relations';\nimport { getTranslation } from '../utils/getTranslation';\nimport { capitalize } from '../utils/strings';\n\nimport { BulkLocaleActionModal } from './BulkLocaleActionModal';\n\nimport type { Locale } from '../../../shared/contracts/locales';\nimport type { I18nBaseQuery } from '../types';\n\n/* -------------------------------------------------------------------------------------------------\n * LocalePickerAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst LocalePickerAction: HeaderActionComponent = ({\n document,\n meta,\n model,\n collectionType,\n documentId,\n}) => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<I18nBaseQuery>();\n const { hasI18n, canCreate, canRead } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery();\n const { schema } = useDocument({ model, collectionType, documentId });\n\n const handleSelect = React.useCallback(\n (value: string) => {\n setQuery({\n plugins: {\n ...query.plugins,\n i18n: {\n locale: value,\n },\n },\n });\n },\n [query.plugins, setQuery]\n );\n\n React.useEffect(() => {\n if (!Array.isArray(locales) || !hasI18n) {\n return;\n }\n /**\n * Handle the case where the current locale query param doesn't exist\n * in the list of available locales, so we redirect to the default locale.\n */\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);\n const defaultLocale = locales.find((locale) => locale.isDefault);\n if (!doesLocaleExist && defaultLocale?.code) {\n handleSelect(defaultLocale.code);\n }\n }, [handleSelect, hasI18n, locales, query.plugins?.i18n?.locale]);\n\n if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {\n return null;\n }\n\n const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;\n\n const allCurrentLocales = [\n { status: getDocumentStatus(document, meta), locale: currentLocale },\n ...(meta?.availableLocales ?? []),\n ];\n\n return {\n label: formatMessage({\n id: getTranslation('Settings.locales.modal.locales.label'),\n defaultMessage: 'Locales',\n }),\n options: locales.map((locale) => {\n const currentLocaleDoc = allCurrentLocales.find((doc) =>\n 'locale' in doc ? doc.locale === locale.code : false\n );\n const status = currentLocaleDoc?.status ?? 'draft';\n\n const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;\n\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return {\n disabled: !permissionsToCheck.includes(locale.code),\n value: locale.code,\n label: locale.name,\n startIcon: schema?.options?.draftAndPublish ? (\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n showBullet={false}\n size={'S'}\n variant={statusVariant}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n ) : null,\n };\n }),\n onSelect: handleSelect,\n value: currentLocale,\n };\n};\n\ntype UseDocument = typeof useDocument;\n\nconst getDocumentStatus = (\n document: ReturnType<UseDocument>['document'],\n meta: ReturnType<UseDocument>['meta']\n): 'draft' | 'published' | 'modified' => {\n const docStatus = document?.status;\n const statuses = meta?.availableStatus ?? [];\n\n /**\n * Creating an entry\n */\n if (!docStatus) {\n return 'draft';\n }\n\n /**\n * We're viewing a draft, but the document could have a published version\n */\n if (docStatus === 'draft' && statuses.find((doc) => doc.publishedAt !== null)) {\n return 'published';\n }\n\n return docStatus;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteLocaleAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeleteLocaleAction: DocumentActionComponent = ({\n document,\n documentId,\n model,\n collectionType,\n}) => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const { delete: deleteAction } = useDocumentActions();\n const { hasI18n, canDelete } = useI18n();\n\n if (!hasI18n) {\n return null;\n }\n\n return {\n disabled:\n (document?.locale && !canDelete.includes(document.locale)) || !document || !document.id,\n position: ['header', 'table-row'],\n label: formatMessage({\n id: getTranslation('actions.delete.label'),\n defaultMessage: 'Delete locale',\n }),\n icon: <StyledTrash />,\n variant: 'danger',\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('actions.delete.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" gap={2}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography tag=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: getTranslation('actions.delete.dialog.body'),\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n ),\n onConfirm: async () => {\n if (!documentId || !document?.locale) {\n console.error(\n \"You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: getTranslation('actions.delete.error'),\n defaultMessage: 'An error occurred while trying to delete the document locale.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await deleteAction({\n documentId,\n model,\n collectionType,\n params: { locale: document.locale },\n });\n\n if (!('error' in res)) {\n navigate({ pathname: `../${collectionType}/${model}` }, { replace: true });\n }\n },\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkPublishAction\n * -----------------------------------------------------------------------------------------------*/\n\nexport type LocaleStatus = {\n locale: string;\n status: Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n};\n\nconst BulkLocalePublishAction: DocumentActionComponent = ({\n document: baseDocument,\n documentId,\n model,\n collectionType,\n}) => {\n const baseLocale = baseDocument?.locale ?? null;\n\n const [{ query }] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const isPublishedTab = query.status === 'published';\n\n const { formatMessage } = useIntl();\n const { hasI18n, canPublish } = useI18n();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [selectedRows, setSelectedRows] = React.useState<any[]>([]);\n const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] =\n React.useState<boolean>(false);\n\n const { publishMany: publishManyAction } = useDocumentActions();\n const {\n document,\n meta: documentMeta,\n schema,\n validate,\n } = useDocument(\n {\n model,\n collectionType,\n documentId,\n params: {\n locale: baseLocale,\n },\n },\n {\n skip: !hasI18n,\n }\n );\n\n const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? undefined : skipToken);\n\n const headers = [\n {\n label: formatMessage({\n id: 'global.name',\n defaultMessage: 'Name',\n }),\n name: 'name',\n },\n {\n label: formatMessage({\n id: getTranslation('CMEditViewBulkLocale.status'),\n defaultMessage: 'Status',\n }),\n name: 'status',\n },\n {\n label: formatMessage({\n id: getTranslation('CMEditViewBulkLocale.publication-status'),\n defaultMessage: 'Publication Status',\n }),\n name: 'publication-status',\n },\n ];\n\n // Extract the rows for the bulk locale publish modal and any validation\n // errors per locale\n const [rows, validationErrors] = React.useMemo(() => {\n if (!document || !documentMeta?.availableLocales) {\n // If we don't have a document or available locales, we return empty rows\n // and no validation errors\n return [[], {}];\n }\n\n // Build the rows for the bulk locale publish modal by combining the current\n // document with all the available locales from the document meta\n const rowsFromMeta: LocaleStatus[] = documentMeta?.availableLocales.map((doc) => {\n const { locale, status } = doc;\n\n return { locale, status };\n });\n rowsFromMeta.unshift({\n locale: document.locale,\n status: document.status,\n });\n\n // Build the validation errors for each locale.\n const allDocuments = [document, ...(documentMeta?.availableLocales ?? [])];\n const errors = allDocuments.reduce<FormErrors>((errs, document) => {\n if (!document) {\n return errs;\n }\n\n // Validate each locale entry via the useDocument validate function and store any errors in a dictionary\n const validation = validate(document as Modules.Documents.AnyDocument);\n if (validation !== null) {\n errs[document.locale] = validation;\n }\n return errs;\n }, {});\n\n return [rowsFromMeta, errors];\n }, [document, documentMeta?.availableLocales, validate]);\n\n const localesToPublish = selectedRows.reduce((acc, selectedRow) => {\n if (\n selectedRow.status !== 'published' &&\n !Object.keys(validationErrors).includes(selectedRow.locale)\n ) {\n acc.push(selectedRow.locale);\n }\n return acc;\n }, []);\n\n const {\n data: draftRelationsCount = 0,\n isLoading: isDraftRelationsLoading,\n error: isDraftRelationsError,\n } = useGetManyDraftRelationCountQuery(\n {\n model,\n documentIds: [documentId!],\n locale: localesToPublish,\n },\n {\n skip: !documentId || localesToPublish.length === 0,\n }\n );\n\n React.useEffect(() => {\n if (isDraftRelationsError) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(isDraftRelationsError),\n });\n }\n }, [isDraftRelationsError, toggleNotification, formatAPIError]);\n\n if (!schema?.options?.draftAndPublish ?? false) {\n return null;\n }\n\n if (!hasI18n) {\n return null;\n }\n\n if (!documentId) {\n return null;\n }\n\n // This document action can be enabled given that draft and publish and i18n are\n // enabled and we can publish the current locale.\n\n const publish = async () => {\n await publishManyAction({\n model,\n documentIds: [documentId],\n params: {\n ...params,\n locale: localesToPublish,\n },\n });\n\n setSelectedRows([]);\n };\n\n const handleAction = async () => {\n if (draftRelationsCount > 0) {\n setIsDraftRelationConfirmationOpen(true);\n } else {\n await publish();\n }\n };\n\n const isUnpublish = document?.status === 'published';\n if (isUnpublish) {\n // TODO: For now we still proceed so we have the bulk locale publish action in all cases\n console.warn(['I18N'], 'Bulk locale unpublish modal not implemented');\n }\n\n if (isDraftRelationConfirmationOpen) {\n return {\n label: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n variant: 'danger',\n dialog: {\n onCancel: () => {\n setIsDraftRelationConfirmationOpen(false);\n },\n onConfirm: async () => {\n await publish();\n\n setIsDraftRelationConfirmationOpen(false);\n },\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('actions.publish.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <WarningCircle width=\"2.4rem\" height=\"2.4rem\" fill=\"danger600\" />\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewBulkLocale.draft-relation-warning'),\n defaultMessage:\n 'Some locales are related to draft entries. Publishing them could leave broken links in your app.',\n })}\n </Typography>\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewBulkLocale.continue-confirmation'),\n defaultMessage: 'Are you sure you want to continue?',\n })}\n </Typography>\n </Flex>\n ),\n },\n };\n }\n\n const hasPermission = selectedRows\n .map(({ locale }) => locale)\n .every((locale) => canPublish.includes(locale));\n\n return {\n label: formatMessage({\n id: getTranslation('CMEditViewBulkLocale.publish-title'),\n defaultMessage: 'Publish Multiple Locales',\n }),\n icon: <ListPlus />,\n disabled: isPublishedTab || canPublish.length === 0,\n position: ['panel'],\n variant: 'secondary',\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: getTranslation('CMEditViewBulkLocale.publish-title'),\n defaultMessage: 'Publish Multiple Locales',\n }),\n content: () => {\n return (\n <Table.Root\n headers={headers}\n rows={rows.map((row) => ({\n ...row,\n id: row.locale,\n }))}\n selectedRows={selectedRows}\n onSelectedRowsChange={(tableSelectedRows) => setSelectedRows(tableSelectedRows)}\n >\n <BulkLocaleActionModal\n validationErrors={validationErrors}\n headers={headers}\n rows={rows}\n localesMetadata={localesMetadata as Locale[]}\n />\n </Table.Root>\n );\n },\n footer: () => (\n <Flex justifyContent=\"flex-end\" width=\"100%\">\n <Button\n loading={isDraftRelationsLoading}\n disabled={!hasPermission || localesToPublish.length === 0}\n variant=\"default\"\n onClick={handleAction}\n >\n {formatMessage({\n id: 'app.utils.publish',\n defaultMessage: 'Publish',\n })}\n </Button>\n </Flex>\n ),\n },\n };\n};\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledTrash = styled(Trash)`\n path {\n fill: currentColor;\n }\n`;\n\nexport { BulkLocalePublishAction, DeleteLocaleAction, LocalePickerAction };\n","import * as React from 'react';\n\nimport { Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useI18n } from '../hooks/useI18n';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst Emphasis = (chunks: React.ReactNode) => {\n return (\n <Typography fontWeight=\"semiBold\" textColor=\"danger500\">\n {chunks}\n </Typography>\n );\n};\n\nconst DeleteModalAdditionalInfo = () => {\n const { hasI18n } = useI18n();\n const { formatMessage } = useIntl();\n\n if (!hasI18n) {\n return null;\n }\n\n return (\n <Typography textColor=\"danger500\">\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.deleteAdditionalInfos'),\n defaultMessage:\n 'This will delete the active locale versions <em>(from Internationalization)</em>',\n },\n {\n em: Emphasis,\n }\n )}\n </Typography>\n );\n};\n\nconst PublishModalAdditionalInfo = () => {\n const { hasI18n } = useI18n();\n const { formatMessage } = useIntl();\n\n if (!hasI18n) {\n return null;\n }\n\n return (\n <Typography textColor=\"danger500\">\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.publishAdditionalInfos'),\n defaultMessage:\n 'This will publish the active locale versions <em>(from Internationalization)</em>',\n },\n {\n em: Emphasis,\n }\n )}\n </Typography>\n );\n};\n\nconst UnpublishModalAdditionalInfo = () => {\n const { hasI18n } = useI18n();\n const { formatMessage } = useIntl();\n\n if (!hasI18n) {\n return null;\n }\n\n return (\n <Typography textColor=\"danger500\">\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.unpublishAdditionalInfos'),\n defaultMessage:\n 'This will unpublish the active locale versions <em>(from Internationalization)</em>',\n },\n {\n em: Emphasis,\n }\n )}\n </Typography>\n );\n};\n\nexport { DeleteModalAdditionalInfo, PublishModalAdditionalInfo, UnpublishModalAdditionalInfo };\n","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useI18n } from '../hooks/useI18n';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { I18nBaseQuery } from '../types';\n\ninterface Query extends I18nBaseQuery {\n page?: number;\n}\n\nconst LocalePicker = () => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<Query>();\n\n const { hasI18n, canRead, canCreate } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery(undefined, {\n skip: !hasI18n,\n });\n\n const handleChange = React.useCallback(\n (code: string, replace = false) => {\n setQuery(\n {\n page: 1,\n plugins: { ...query.plugins, i18n: { locale: code } },\n },\n 'push',\n replace\n );\n },\n [query.plugins, setQuery]\n );\n\n React.useEffect(() => {\n if (!Array.isArray(locales) || !hasI18n) {\n return;\n }\n /**\n * Handle the case where the current locale query param doesn't exist\n * in the list of available locales, so we redirect to the default locale.\n */\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);\n const defaultLocale = locales.find((locale) => locale.isDefault);\n if (!doesLocaleExist && defaultLocale?.code) {\n handleChange(defaultLocale.code, true);\n }\n }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);\n\n if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {\n return null;\n }\n\n const displayedLocales = locales.filter((locale) => {\n /**\n * If you can create or read we allow you to see the locale exists\n * this is because in the ListView, you may be able to create a new entry\n * in a locale you can't read.\n */\n return canCreate.includes(locale.code) || canRead.includes(locale.code);\n });\n\n return (\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: getTranslation('actions.select-locale'),\n defaultMessage: 'Select locale',\n })}\n value={query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code}\n // @ts-expect-error – This can be removed in V2 of the DS.\n onChange={handleChange}\n >\n {displayedLocales.map((locale) => (\n <SingleSelectOption key={locale.id} value={locale.code}>\n {locale.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n};\n\nexport { LocalePicker };\n","export const PERMISSIONS = {\n accessMain: [{ action: 'plugin::i18n.locale.read', subject: null }],\n create: [{ action: 'plugin::i18n.locale.create', subject: null }],\n delete: [{ action: 'plugin::i18n.locale.delete', subject: null }],\n update: [{ action: 'plugin::i18n.locale.update', subject: null }],\n read: [{ action: 'plugin::i18n.locale.read', subject: null }],\n};\n","/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { Flex, VisuallyHidden } from '@strapi/design-system';\nimport { Earth, EarthStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { EditFieldLayout, EditLayout } from '@strapi/content-manager/strapi-admin';\n\ninterface MutateEditViewArgs {\n layout: EditLayout;\n}\n\nconst mutateEditViewHook = ({ layout }: MutateEditViewArgs): MutateEditViewArgs => {\n // If i18n isn't explicitly enabled on the content type, then no field can be localized\n if (\n !('i18n' in layout.options) ||\n (typeof layout.options.i18n === 'object' &&\n layout.options.i18n !== null &&\n 'localized' in layout.options.i18n &&\n !layout.options.i18n.localized)\n ) {\n return { layout };\n }\n\n const components = Object.entries(layout.components).reduce<EditLayout['components']>(\n (acc, [key, componentLayout]) => {\n return {\n ...acc,\n [key]: {\n ...componentLayout,\n layout: componentLayout.layout.map((row) => row.map(addLabelActionToField)),\n },\n };\n },\n {}\n );\n\n return {\n layout: {\n ...layout,\n components,\n layout: layout.layout.map((panel) => panel.map((row) => row.map(addLabelActionToField))),\n },\n } satisfies Pick<MutateEditViewArgs, 'layout'>;\n};\n\nconst addLabelActionToField = (field: EditFieldLayout) => {\n const isFieldLocalized = doesFieldHaveI18nPluginOpt(field.attribute.pluginOptions)\n ? field.attribute.pluginOptions.i18n.localized\n : true || ['uid', 'relation'].includes(field.attribute.type);\n\n const labelActionProps = {\n title: {\n id: isFieldLocalized\n ? getTranslation('Field.localized')\n : getTranslation('Field.not-localized'),\n defaultMessage: isFieldLocalized\n ? 'This value is unique for the selected locale'\n : 'This value is the same across all locales',\n },\n icon: isFieldLocalized ? <Earth /> : <EarthStriked />,\n };\n\n return {\n ...field,\n labelAction: <LabelAction {...labelActionProps} />,\n };\n};\n\nconst doesFieldHaveI18nPluginOpt = (\n pluginOpts?: object\n): pluginOpts is { i18n: { localized: boolean } } => {\n if (!pluginOpts) {\n return false;\n }\n\n return (\n 'i18n' in pluginOpts &&\n typeof pluginOpts.i18n === 'object' &&\n pluginOpts.i18n !== null &&\n 'localized' in pluginOpts.i18n\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LabelAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LabelActionProps {\n title: MessageDescriptor;\n icon: React.ReactNode;\n}\n\nconst LabelAction = ({ title, icon }: LabelActionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Span tag=\"span\">\n <VisuallyHidden tag=\"span\">{formatMessage(title)}</VisuallyHidden>\n {React.cloneElement(icon as React.ReactElement, {\n 'aria-hidden': true,\n focusable: false, // See: https://allyjs.io/tutorials/focusing-in-svg.html#making-svg-elements-focusable\n })}\n </Span>\n );\n};\n\nconst Span = styled(Flex)`\n svg {\n width: 12px;\n height: 12px;\n\n fill: ${({ theme }) => theme.colors.neutral500};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport { mutateEditViewHook };\n","import { unstable_useDocument as useDocument } from '@strapi/content-manager/strapi-admin';\nimport { Box, Flex, Popover, Typography, useCollator } from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { Locale } from '../../../shared/contracts/locales';\nimport { useGetLocalesQuery } from '../services/locales';\n\ninterface LocaleListCellProps {\n documentId: string;\n collectionType: string;\n locale: string;\n model: string;\n}\n\nconst LocaleListCell = ({\n documentId,\n locale: currentLocale,\n collectionType,\n model,\n}: LocaleListCellProps) => {\n // TODO: avoid loading availableLocales for each row but get that from the BE\n const { meta, isLoading } = useDocument({\n documentId,\n collectionType,\n model,\n params: {\n locale: currentLocale,\n },\n });\n\n const { locale: language } = useIntl();\n const { data: locales = [] } = useGetLocalesQuery();\n const formatter = useCollator(language, {\n sensitivity: 'base',\n });\n\n if (!Array.isArray(locales) || isLoading) {\n return null;\n }\n\n const availableLocales = meta?.availableLocales.map((doc) => doc.locale) ?? [];\n const localesForDocument = locales\n .reduce<Locale[]>((acc, locale) => {\n const createdLocale = [currentLocale, ...availableLocales].find((loc) => {\n return loc === locale.code;\n });\n\n if (createdLocale) {\n acc.push(locale);\n }\n\n return acc;\n }, [])\n .map((locale) => {\n if (locale.isDefault) {\n return `${locale.name} (default)`;\n }\n\n return locale.name;\n })\n .toSorted((a, b) => formatter.compare(a, b));\n\n return (\n <Popover.Root>\n <Popover.Trigger>\n <Button type=\"button\" onClick={(e) => e.stopPropagation()}>\n <ActionWrapper\n minWidth=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"3.2rem\"\n width=\"3.2rem\"\n >\n <Typography textColor=\"neutral800\" ellipsis>\n {localesForDocument.join(', ')}\n </Typography>\n <Flex>\n <CaretDown />\n </Flex>\n </ActionWrapper>\n </Button>\n </Popover.Trigger>\n <Popover.Content sideOffset={16}>\n <ul>\n {localesForDocument.map((name) => (\n <Box key={name} padding={3} tag=\"li\">\n <Typography>{name}</Typography>\n </Box>\n ))}\n </ul>\n </Popover.Content>\n </Popover.Root>\n );\n};\n\nconst Button = styled.button`\n width: 100%;\n\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n &:hover {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n }\n &:active {\n svg {\n > g,\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n }\n`;\n\nconst ActionWrapper = styled(Flex)`\n svg {\n height: 0.4rem;\n }\n`;\n\nexport { LocaleListCell };\nexport type { LocaleListCellProps };\n","/* eslint-disable check-file/filename-naming-convention */\nimport { LocaleListCell } from '../components/LocaleListCell';\nimport { doesPluginOptionsHaveI18nLocalized } from '../utils/fields';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { ListFieldLayout, ListLayout } from '@strapi/content-manager/strapi-admin';\n\n/* -------------------------------------------------------------------------------------------------\n * addColumnToTableHook\n * -----------------------------------------------------------------------------------------------*/\ninterface AddColumnToTableHookArgs {\n layout: ListLayout;\n displayedHeaders: ListFieldLayout[];\n}\n\nconst addColumnToTableHook = ({ displayedHeaders, layout }: AddColumnToTableHookArgs) => {\n const { options } = layout;\n\n const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options)\n ? options.i18n.localized\n : false;\n\n if (!isFieldLocalized) {\n return { displayedHeaders, layout };\n }\n\n return {\n displayedHeaders: [\n ...displayedHeaders,\n {\n attribute: { type: 'string' },\n label: {\n id: getTranslation('list-view.table.header.label'),\n defaultMessage: 'Available in',\n },\n searchable: false,\n sortable: false,\n name: 'locales',\n // @ts-expect-error – ID is seen as number | string; this will change when we move the type over.\n cellFormatter: (props, _header, meta) => <LocaleListCell {...props} {...meta} />,\n },\n ],\n layout,\n };\n};\n\nexport { addColumnToTableHook };\n","import { Schema } from '@strapi/types';\n/* -------------------------------------------------------------------------------------------------\n * addLocaleToReleasesHook\n * -----------------------------------------------------------------------------------------------*/\ninterface AddLocaleToReleasesHookArgs {\n displayedHeaders: {\n key: string;\n fieldSchema: Schema.Attribute.Kind | 'custom';\n metadatas: {\n label: { id: string; defaultMessage: string };\n searchable: boolean;\n sortable: boolean;\n };\n name: string;\n }[];\n hasI18nEnabled: boolean;\n}\n\nconst addLocaleToReleasesHook = ({ displayedHeaders = [] }: AddLocaleToReleasesHookArgs) => {\n return {\n displayedHeaders: [\n ...displayedHeaders,\n {\n label: {\n id: 'content-releases.page.ReleaseDetails.table.header.label.locale',\n defaultMessage: 'locale',\n },\n name: 'locale',\n },\n ],\n hasI18nEnabled: true,\n };\n};\n\nexport { addLocaleToReleasesHook };\n","import get from 'lodash/get';\n\nimport type { Middleware } from '@reduxjs/toolkit';\nimport type { Store } from '@strapi/admin/strapi-admin';\n\nconst extendCTBAttributeInitialDataMiddleware: () => Middleware<\n object,\n ReturnType<Store['getState']>\n> = () => {\n return ({ getState }) =>\n (next) =>\n (action) => {\n const enhanceAction = () => {\n // the block here is to catch the error when trying to access the state\n // of the ctb when the plugin is not mounted\n try {\n const store = getState();\n\n const hasi18nEnabled = get(\n store,\n [\n 'content-type-builder_dataManagerProvider',\n 'modifiedData',\n 'contentType',\n 'schema',\n 'pluginOptions',\n 'i18n',\n 'localized',\n ],\n false\n );\n\n if (hasi18nEnabled) {\n const pluginOptions = action.options\n ? { ...action.options.pluginOptions, i18n: { localized: true } }\n : { i18n: { localized: true } };\n\n return next({\n ...action,\n options: {\n pluginOptions,\n },\n });\n }\n\n return next(action);\n } catch (err) {\n return next(action);\n }\n };\n\n if (\n action.type === 'ContentTypeBuilder/FormModal/SET_ATTRIBUTE_DATA_SCHEMA' &&\n action.forTarget === 'contentType' &&\n !['relation', 'component'].includes(action.attributeType) &&\n !action.isEditing\n ) {\n return enhanceAction();\n }\n\n if (\n action.type === 'ContentTypeBuilder/FormModal/SET_CUSTOM_FIELD_DATA_SCHEMA' &&\n action.forTarget === 'contentType' &&\n !action.isEditing\n ) {\n return enhanceAction();\n }\n\n if (\n (action.type ===\n 'ContentTypeBuilder/FormModal/RESET_PROPS_AND_SET_FORM_FOR_ADDING_AN_EXISTING_COMPO' ||\n action.type === 'ContentTypeBuilder/FormModal/RESET_PROPS_AND_SAVE_CURRENT_DATA') &&\n action.forTarget === 'contentType'\n ) {\n return enhanceAction();\n }\n\n return next(action);\n };\n};\n\nexport { extendCTBAttributeInitialDataMiddleware };\n","import type { Middleware } from '@reduxjs/toolkit';\nimport type { Store } from '@strapi/admin/strapi-admin';\n\nconst extendCTBInitialDataMiddleware: () => Middleware<\n object,\n ReturnType<Store['getState']>\n> = () => {\n return () => (next) => (action) => {\n if (\n action.type === 'ContentTypeBuilder/FormModal/SET_DATA_TO_EDIT' &&\n action.modalType === 'contentType'\n ) {\n const i18n = { localized: false };\n\n const pluginOptions = action.data.pluginOptions\n ? { ...action.data.pluginOptions, i18n }\n : { i18n };\n\n const data = { ...action.data, pluginOptions };\n\n if (action.actionType === 'create') {\n return next({ ...action, data });\n }\n\n // Override the action if the pluginOption config does not contain i18n\n // In this case we need to set the proper initialData shape\n if (!action.data.pluginOptions?.i18n?.localized) {\n return next({ ...action, data });\n }\n }\n\n // action is not the one we want to override\n return next(action);\n };\n};\n\nexport { extendCTBInitialDataMiddleware };\n","/* eslint-disable check-file/filename-naming-convention */\nimport * as qs from 'qs';\nimport { matchPath } from 'react-router-dom';\n\nimport type { RBACMiddleware } from '@strapi/admin/strapi-admin';\n\nconst localeMiddleware: RBACMiddleware = (ctx) => (next) => (permissions) => {\n const match = matchPath('/content-manager/:collectionType/:model?/:id', ctx.pathname);\n\n if (!match) {\n return next(permissions);\n }\n\n const search = qs.parse(ctx.search);\n\n if (typeof search !== 'object') {\n return next(permissions);\n }\n\n if (!('plugins' in search && typeof search.plugins === 'object')) {\n return next(permissions);\n }\n\n if (\n !(\n 'i18n' in search.plugins &&\n typeof search.plugins.i18n === 'object' &&\n !Array.isArray(search.plugins.i18n)\n )\n ) {\n return next(permissions);\n }\n\n const { locale } = search.plugins.i18n;\n\n if (typeof locale !== 'string') {\n return next(permissions);\n }\n\n const revisedPermissions = permissions.filter(\n (permission) =>\n !permission.properties?.locales || permission.properties.locales.includes(locale)\n );\n\n return next(revisedPermissions);\n};\n\nexport { localeMiddleware };\n","type TradOptions = Record<string, string>;\n\nconst prefixPluginTranslations = (trad: TradOptions, pluginId: string): TradOptions => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n return Object.keys(trad).reduce((acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n return acc;\n }, {} as TradOptions);\n};\n\nexport { prefixPluginTranslations };\n","import omit from 'lodash/omit';\n\nimport { LOCALIZED_FIELDS, doesPluginOptionsHaveI18nLocalized } from './fields';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * mutateCTBContentTypeSchema\n * -----------------------------------------------------------------------------------------------*/\n\nconst mutateCTBContentTypeSchema = (\n nextSchema: Schema.ContentType,\n prevSchema?: {\n apiID?: string;\n schema?: Schema.ContentType;\n uid?: string;\n }\n) => {\n // Don't perform mutations components\n if (!doesPluginOptionsHaveI18nLocalized(nextSchema.pluginOptions)) {\n return nextSchema;\n }\n\n const isNextSchemaLocalized = nextSchema.pluginOptions.i18n.localized;\n const isPrevSchemaLocalized = doesPluginOptionsHaveI18nLocalized(\n prevSchema?.schema?.pluginOptions\n )\n ? prevSchema?.schema?.pluginOptions.i18n.localized\n : false;\n\n // No need to perform modification on the schema, if the i18n feature was not changed\n // at the ct level\n if (isNextSchemaLocalized && isPrevSchemaLocalized) {\n return nextSchema;\n }\n\n if (isNextSchemaLocalized) {\n const attributes = addLocalisationToFields(nextSchema.attributes);\n\n return { ...nextSchema, attributes };\n }\n\n // Remove the i18n object from the pluginOptions\n if (!isNextSchemaLocalized) {\n const pluginOptions = omit(nextSchema.pluginOptions, 'i18n');\n const attributes = disableAttributesLocalisation(nextSchema.attributes);\n\n return { ...nextSchema, pluginOptions, attributes };\n }\n\n return nextSchema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * addLocalisationToFields\n * -----------------------------------------------------------------------------------------------*/\n\nconst addLocalisationToFields = (attributes: Schema.ContentType['attributes']) =>\n Object.keys(attributes).reduce<Schema.ContentType['attributes']>((acc, current) => {\n const currentAttribute = attributes[current];\n\n if (LOCALIZED_FIELDS.includes(currentAttribute.type)) {\n const i18n = { localized: true };\n\n const pluginOptions = currentAttribute.pluginOptions\n ? { ...currentAttribute.pluginOptions, i18n }\n : { i18n };\n\n acc[current] = { ...currentAttribute, pluginOptions };\n\n return acc;\n }\n\n acc[current] = currentAttribute;\n\n return acc;\n }, {});\n\n/* -------------------------------------------------------------------------------------------------\n * disableAttributesLocalisation\n * -----------------------------------------------------------------------------------------------*/\n\ntype OmitByPath<T extends object, K extends string[]> = Pick<T, Exclude<keyof T, K[number]>>;\n\nconst disableAttributesLocalisation = (attributes: Schema.ContentType['attributes']) =>\n Object.keys(attributes).reduce<\n Record<string, OmitByPath<Schema.ContentType['attributes'][string], ['pluginOptions', 'i18n']>>\n >((acc, current) => {\n acc[current] = omit(attributes[current], 'pluginOptions.i18n');\n\n return acc;\n }, {});\n\nexport { mutateCTBContentTypeSchema };\n","import get from 'lodash/get';\nimport * as yup from 'yup';\n\nimport { CheckboxConfirmation } from './components/CheckboxConfirmation';\nimport {\n BulkLocalePublishAction,\n DeleteLocaleAction,\n LocalePickerAction,\n} from './components/CMHeaderActions';\nimport {\n DeleteModalAdditionalInfo,\n PublishModalAdditionalInfo,\n UnpublishModalAdditionalInfo,\n} from './components/CMListViewModalsAdditionalInformation';\nimport { LocalePicker } from './components/LocalePicker';\nimport { PERMISSIONS } from './constants';\nimport { mutateEditViewHook } from './contentManagerHooks/editView';\nimport { addColumnToTableHook } from './contentManagerHooks/listView';\nimport { addLocaleToReleasesHook } from './contentReleasesHooks/releaseDetailsView';\nimport { extendCTBAttributeInitialDataMiddleware } from './middlewares/extendCTBAttributeInitialData';\nimport { extendCTBInitialDataMiddleware } from './middlewares/extendCTBInitialData';\nimport { localeMiddleware } from './middlewares/rbac-middleware';\nimport { pluginId } from './pluginId';\nimport { i18nApi } from './services/api';\nimport { LOCALIZED_FIELDS } from './utils/fields';\nimport { getTranslation } from './utils/getTranslation';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\nimport { mutateCTBContentTypeSchema } from './utils/schemas';\n\nimport type { DocumentActionComponent } from '@strapi/content-manager/strapi-admin';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: any) {\n app.addMiddlewares([extendCTBAttributeInitialDataMiddleware, extendCTBInitialDataMiddleware]);\n app.addMiddlewares([() => i18nApi.middleware]);\n app.addReducers({\n [i18nApi.reducerPath]: i18nApi.reducer,\n });\n app.addRBACMiddleware([localeMiddleware]);\n app.registerPlugin({\n id: pluginId,\n name: pluginId,\n });\n },\n bootstrap(app: any) {\n // // Hook that adds a column into the CM's LV table\n app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addColumnToTableHook);\n app.registerHook('Admin/CM/pages/EditView/mutate-edit-view-layout', mutateEditViewHook);\n // Hooks that checks if the locale is present in the release\n app.registerHook(\n 'ContentReleases/pages/ReleaseDetails/add-locale-in-releases',\n addLocaleToReleasesHook\n );\n\n // Add the settings link\n app.addSettingsLink('global', {\n intlLabel: {\n id: getTranslation('plugin.name'),\n defaultMessage: 'Internationalization',\n },\n id: 'internationalization',\n to: 'internationalization',\n Component: () =>\n import('./pages/SettingsPage').then((mod) => ({ default: mod.ProtectedSettingsPage })),\n permissions: PERMISSIONS.accessMain,\n });\n\n const contentManager = app.getPlugin('content-manager');\n\n contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);\n contentManager.apis.addDocumentAction((actions: DocumentActionComponent[]) => {\n const indexOfDeleteAction = actions.findIndex((action) => action.type === 'delete');\n actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);\n return actions;\n });\n\n contentManager.apis.addDocumentAction((actions: DocumentActionComponent[]) => {\n // When enabled the bulk locale publish action should be the first action\n // in 'More Document Actions' and therefore the third action in the array\n actions.splice(2, 0, BulkLocalePublishAction);\n return actions;\n });\n\n contentManager.injectComponent('listView', 'actions', {\n name: 'i18n-locale-filter',\n Component: LocalePicker,\n });\n\n contentManager.injectComponent('listView', 'publishModalAdditionalInfos', {\n name: 'i18n-publish-bullets-in-modal',\n Component: PublishModalAdditionalInfo,\n });\n\n contentManager.injectComponent('listView', 'unpublishModalAdditionalInfos', {\n name: 'i18n-unpublish-bullets-in-modal',\n Component: UnpublishModalAdditionalInfo,\n });\n\n contentManager.injectComponent('listView', 'deleteModalAdditionalInfos', {\n name: 'i18n-delete-bullets-in-modal',\n Component: DeleteModalAdditionalInfo,\n });\n\n const ctbPlugin = app.getPlugin('content-type-builder');\n\n if (ctbPlugin) {\n const ctbFormsAPI = ctbPlugin.apis.forms;\n ctbFormsAPI.addContentTypeSchemaMutation(mutateCTBContentTypeSchema);\n ctbFormsAPI.components.add({ id: 'checkboxConfirmation', component: CheckboxConfirmation });\n\n ctbFormsAPI.extendContentType({\n validator: () => ({\n i18n: yup.object().shape({\n localized: yup.bool(),\n }),\n }),\n form: {\n advanced() {\n return [\n {\n name: 'pluginOptions.i18n.localized',\n description: {\n id: getTranslation('plugin.schema.i18n.localized.description-content-type'),\n defaultMessage: 'Allows translating an entry into different languages',\n },\n type: 'checkboxConfirmation',\n intlLabel: {\n id: getTranslation('plugin.schema.i18n.localized.label-content-type'),\n defaultMessage: 'Localization',\n },\n },\n ];\n },\n },\n });\n\n ctbFormsAPI.extendFields(LOCALIZED_FIELDS, {\n validator: (args: any) => ({\n i18n: yup.object().shape({\n localized: yup.bool().test({\n name: 'ensure-unique-localization',\n message: getTranslation('plugin.schema.i18n.ensure-unique-localization'),\n test(value) {\n if (value === undefined || value) {\n return true;\n }\n\n const unique = get(args, ['3', 'modifiedData', 'unique'], null);\n\n // Unique fields must be localized\n if (unique && !value) {\n return false;\n }\n\n return true;\n },\n }),\n }),\n }),\n form: {\n advanced({ contentTypeSchema, forTarget, type, step }: any) {\n if (forTarget !== 'contentType') {\n return [];\n }\n\n const hasI18nEnabled = get(\n contentTypeSchema,\n ['schema', 'pluginOptions', 'i18n', 'localized'],\n false\n );\n\n if (!hasI18nEnabled) {\n return [];\n }\n\n if (type === 'component' && step === '1') {\n return [];\n }\n\n return [\n {\n name: 'pluginOptions.i18n.localized',\n description: {\n id: getTranslation('plugin.schema.i18n.localized.description-field'),\n defaultMessage: 'The field can have different values in each locale',\n },\n type: 'checkbox',\n intlLabel: {\n id: getTranslation('plugin.schema.i18n.localized.label-field'),\n defaultMessage: 'Enable localization for this field',\n },\n },\n ];\n },\n },\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, pluginId),\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"],"names":["value","Button","useDocument","index","useDocumentActions","document","pluginId"],"mappings":"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"}