@strapi/i18n 0.0.0-next.990615b2ed4dd2f0589b4fda91418246d7b9450e → 0.0.0-next.9c630ba4333dffc2c1c8150d9226dfbb67b02e09

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 (193) hide show
  1. package/dist/admin/components/CMHeaderActions.js +240 -4
  2. package/dist/admin/components/CMHeaderActions.js.map +1 -1
  3. package/dist/admin/components/CMHeaderActions.mjs +244 -9
  4. package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
  5. package/dist/admin/components/CreateLocale.js +1 -1
  6. package/dist/admin/components/CreateLocale.js.map +1 -1
  7. package/dist/admin/components/CreateLocale.mjs +1 -1
  8. package/dist/admin/components/CreateLocale.mjs.map +1 -1
  9. package/dist/admin/components/EditLocale.js +1 -1
  10. package/dist/admin/components/EditLocale.js.map +1 -1
  11. package/dist/admin/components/EditLocale.mjs +1 -1
  12. package/dist/admin/components/EditLocale.mjs.map +1 -1
  13. package/dist/admin/components/LocaleListCell.js +65 -45
  14. package/dist/admin/components/LocaleListCell.js.map +1 -1
  15. package/dist/admin/components/LocaleListCell.mjs +66 -46
  16. package/dist/admin/components/LocaleListCell.mjs.map +1 -1
  17. package/dist/admin/components/LocalePicker.js +18 -11
  18. package/dist/admin/components/LocalePicker.js.map +1 -1
  19. package/dist/admin/components/LocalePicker.mjs +19 -12
  20. package/dist/admin/components/LocalePicker.mjs.map +1 -1
  21. package/dist/admin/contentManagerHooks/editView.js +6 -3
  22. package/dist/admin/contentManagerHooks/editView.js.map +1 -1
  23. package/dist/admin/contentManagerHooks/editView.mjs +7 -4
  24. package/dist/admin/contentManagerHooks/editView.mjs.map +1 -1
  25. package/dist/admin/contentManagerHooks/listView.js +2 -1
  26. package/dist/admin/contentManagerHooks/listView.js.map +1 -1
  27. package/dist/admin/contentManagerHooks/listView.mjs +2 -1
  28. package/dist/admin/contentManagerHooks/listView.mjs.map +1 -1
  29. package/dist/admin/hooks/useAILocalizationJobsPolling.js +110 -0
  30. package/dist/admin/hooks/useAILocalizationJobsPolling.js.map +1 -0
  31. package/dist/admin/hooks/useAILocalizationJobsPolling.mjs +89 -0
  32. package/dist/admin/hooks/useAILocalizationJobsPolling.mjs.map +1 -0
  33. package/dist/admin/hooks/useI18n.js +4 -4
  34. package/dist/admin/hooks/useI18n.js.map +1 -1
  35. package/dist/admin/hooks/useI18n.mjs +4 -4
  36. package/dist/admin/hooks/useI18n.mjs.map +1 -1
  37. package/dist/admin/index.js +1 -1
  38. package/dist/admin/index.js.map +1 -1
  39. package/dist/admin/index.mjs +2 -2
  40. package/dist/admin/index.mjs.map +1 -1
  41. package/dist/admin/middlewares/extendCTBAttributeInitialData.js +34 -24
  42. package/dist/admin/middlewares/extendCTBAttributeInitialData.js.map +1 -1
  43. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs +34 -24
  44. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs.map +1 -1
  45. package/dist/admin/pages/SettingsPage.js +121 -46
  46. package/dist/admin/pages/SettingsPage.js.map +1 -1
  47. package/dist/admin/pages/SettingsPage.mjs +124 -30
  48. package/dist/admin/pages/SettingsPage.mjs.map +1 -1
  49. package/dist/admin/services/aiLocalizationJobs.js +26 -0
  50. package/dist/admin/services/aiLocalizationJobs.js.map +1 -0
  51. package/dist/admin/services/aiLocalizationJobs.mjs +24 -0
  52. package/dist/admin/services/aiLocalizationJobs.mjs.map +1 -0
  53. package/dist/admin/services/api.js +4 -1
  54. package/dist/admin/services/api.js.map +1 -1
  55. package/dist/admin/services/api.mjs +4 -1
  56. package/dist/admin/services/api.mjs.map +1 -1
  57. package/dist/admin/services/locales.js +4 -2
  58. package/dist/admin/services/locales.js.map +1 -1
  59. package/dist/admin/services/locales.mjs +4 -2
  60. package/dist/admin/services/locales.mjs.map +1 -1
  61. package/dist/admin/services/settings.js +29 -0
  62. package/dist/admin/services/settings.js.map +1 -0
  63. package/dist/admin/services/settings.mjs +26 -0
  64. package/dist/admin/services/settings.mjs.map +1 -0
  65. package/dist/admin/src/components/CMHeaderActions.d.ts +17 -4
  66. package/dist/admin/src/components/LocaleListCell.d.ts +2 -1
  67. package/dist/admin/src/hooks/useAILocalizationJobsPolling.d.ts +9 -0
  68. package/dist/admin/src/services/aiLocalizationJobs.d.ts +6 -0
  69. package/dist/admin/src/services/api.d.ts +1 -1
  70. package/dist/admin/src/services/locales.d.ts +1 -1
  71. package/dist/admin/src/services/relations.d.ts +1 -1
  72. package/dist/admin/src/services/settings.d.ts +5 -0
  73. package/dist/admin/src/utils/schemas.d.ts +642 -16
  74. package/dist/admin/translations/en.json.js +10 -0
  75. package/dist/admin/translations/en.json.js.map +1 -1
  76. package/dist/admin/translations/en.json.mjs +10 -0
  77. package/dist/admin/translations/en.json.mjs.map +1 -1
  78. package/dist/admin/utils/clean.js +2 -2
  79. package/dist/admin/utils/clean.js.map +1 -1
  80. package/dist/admin/utils/clean.mjs +2 -2
  81. package/dist/admin/utils/clean.mjs.map +1 -1
  82. package/dist/admin/utils/fields.js +6 -1
  83. package/dist/admin/utils/fields.js.map +1 -1
  84. package/dist/admin/utils/fields.mjs +6 -1
  85. package/dist/admin/utils/fields.mjs.map +1 -1
  86. package/dist/admin/utils/schemas.js +19 -13
  87. package/dist/admin/utils/schemas.js.map +1 -1
  88. package/dist/admin/utils/schemas.mjs +19 -13
  89. package/dist/admin/utils/schemas.mjs.map +1 -1
  90. package/dist/server/bootstrap.js +2 -0
  91. package/dist/server/bootstrap.js.map +1 -1
  92. package/dist/server/bootstrap.mjs +2 -0
  93. package/dist/server/bootstrap.mjs.map +1 -1
  94. package/dist/server/constants/iso-locales.json.js +4 -0
  95. package/dist/server/constants/iso-locales.json.js.map +1 -1
  96. package/dist/server/constants/iso-locales.json.mjs +4 -0
  97. package/dist/server/constants/iso-locales.json.mjs.map +1 -1
  98. package/dist/server/controllers/ai-localization-jobs.js +47 -0
  99. package/dist/server/controllers/ai-localization-jobs.js.map +1 -0
  100. package/dist/server/controllers/ai-localization-jobs.mjs +45 -0
  101. package/dist/server/controllers/ai-localization-jobs.mjs.map +1 -0
  102. package/dist/server/controllers/index.js +5 -1
  103. package/dist/server/controllers/index.js.map +1 -1
  104. package/dist/server/controllers/index.mjs +5 -1
  105. package/dist/server/controllers/index.mjs.map +1 -1
  106. package/dist/server/controllers/settings.js +24 -0
  107. package/dist/server/controllers/settings.js.map +1 -0
  108. package/dist/server/controllers/settings.mjs +22 -0
  109. package/dist/server/controllers/settings.mjs.map +1 -0
  110. package/dist/server/models/ai-localization-job.js +60 -0
  111. package/dist/server/models/ai-localization-job.js.map +1 -0
  112. package/dist/server/models/ai-localization-job.mjs +57 -0
  113. package/dist/server/models/ai-localization-job.mjs.map +1 -0
  114. package/dist/server/register.js +3 -1
  115. package/dist/server/register.js.map +1 -1
  116. package/dist/server/register.mjs +3 -1
  117. package/dist/server/register.mjs.map +1 -1
  118. package/dist/server/routes/admin.js +40 -0
  119. package/dist/server/routes/admin.js.map +1 -1
  120. package/dist/server/routes/admin.mjs +40 -0
  121. package/dist/server/routes/admin.mjs.map +1 -1
  122. package/dist/server/routes/content-api.js +11 -7
  123. package/dist/server/routes/content-api.js.map +1 -1
  124. package/dist/server/routes/content-api.mjs +11 -7
  125. package/dist/server/routes/content-api.mjs.map +1 -1
  126. package/dist/server/routes/index.mjs +2 -2
  127. package/dist/server/routes/validation/locale.js +57 -0
  128. package/dist/server/routes/validation/locale.js.map +1 -0
  129. package/dist/server/routes/validation/locale.mjs +36 -0
  130. package/dist/server/routes/validation/locale.mjs.map +1 -0
  131. package/dist/server/services/ai-localization-jobs.js +64 -0
  132. package/dist/server/services/ai-localization-jobs.js.map +1 -0
  133. package/dist/server/services/ai-localization-jobs.mjs +62 -0
  134. package/dist/server/services/ai-localization-jobs.mjs.map +1 -0
  135. package/dist/server/services/ai-localizations.js +272 -0
  136. package/dist/server/services/ai-localizations.js.map +1 -0
  137. package/dist/server/services/ai-localizations.mjs +270 -0
  138. package/dist/server/services/ai-localizations.mjs.map +1 -0
  139. package/dist/server/services/index.js +7 -1
  140. package/dist/server/services/index.js.map +1 -1
  141. package/dist/server/services/index.mjs +7 -1
  142. package/dist/server/services/index.mjs.map +1 -1
  143. package/dist/server/services/settings.js +25 -0
  144. package/dist/server/services/settings.js.map +1 -0
  145. package/dist/server/services/settings.mjs +23 -0
  146. package/dist/server/services/settings.mjs.map +1 -0
  147. package/dist/server/src/bootstrap.d.ts.map +1 -1
  148. package/dist/server/src/controllers/ai-localization-jobs.d.ts +17 -0
  149. package/dist/server/src/controllers/ai-localization-jobs.d.ts.map +1 -0
  150. package/dist/server/src/controllers/index.d.ts +10 -0
  151. package/dist/server/src/controllers/index.d.ts.map +1 -1
  152. package/dist/server/src/controllers/settings.d.ts +7 -0
  153. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  154. package/dist/server/src/index.d.ts +47 -8
  155. package/dist/server/src/index.d.ts.map +1 -1
  156. package/dist/server/src/models/ai-localization-job.d.ts +5 -0
  157. package/dist/server/src/models/ai-localization-job.d.ts.map +1 -0
  158. package/dist/server/src/models/index.d.ts +5 -0
  159. package/dist/server/src/models/index.d.ts.map +1 -0
  160. package/dist/server/src/register.d.ts +1 -1
  161. package/dist/server/src/register.d.ts.map +1 -1
  162. package/dist/server/src/routes/admin.d.ts.map +1 -1
  163. package/dist/server/src/routes/content-api.d.ts +5 -8
  164. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  165. package/dist/server/src/routes/index.d.ts +3 -7
  166. package/dist/server/src/routes/index.d.ts.map +1 -1
  167. package/dist/server/src/routes/validation/index.d.ts +2 -0
  168. package/dist/server/src/routes/validation/index.d.ts.map +1 -0
  169. package/dist/server/src/routes/validation/locale.d.ts +41 -0
  170. package/dist/server/src/routes/validation/locale.d.ts.map +1 -0
  171. package/dist/server/src/services/ai-localization-jobs.d.ts +26 -0
  172. package/dist/server/src/services/ai-localization-jobs.d.ts.map +1 -0
  173. package/dist/server/src/services/ai-localizations.d.ts +18 -0
  174. package/dist/server/src/services/ai-localizations.d.ts.map +1 -0
  175. package/dist/server/src/services/index.d.ts +33 -0
  176. package/dist/server/src/services/index.d.ts.map +1 -1
  177. package/dist/server/src/services/settings.d.ts +13 -0
  178. package/dist/server/src/services/settings.d.ts.map +1 -0
  179. package/dist/server/src/utils/index.d.ts +7 -1
  180. package/dist/server/src/utils/index.d.ts.map +1 -1
  181. package/dist/server/src/validation/settings.d.ts +12 -0
  182. package/dist/server/src/validation/settings.d.ts.map +1 -0
  183. package/dist/server/utils/index.js.map +1 -1
  184. package/dist/server/utils/index.mjs.map +1 -1
  185. package/dist/server/validation/settings.js +11 -0
  186. package/dist/server/validation/settings.js.map +1 -0
  187. package/dist/server/validation/settings.mjs +9 -0
  188. package/dist/server/validation/settings.mjs.map +1 -0
  189. package/dist/shared/contracts/ai-localization-jobs.d.ts +27 -0
  190. package/dist/shared/contracts/ai-localization-jobs.d.ts.map +1 -0
  191. package/dist/shared/contracts/settings.d.ts +40 -0
  192. package/dist/shared/contracts/shared.d.ts.map +1 -0
  193. package/package.json +12 -9
@@ -1,16 +1,20 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { skipToken } from '@reduxjs/toolkit/query';
4
4
  import { useQueryParams, useForm, useNotification, useAPIErrorHandler, Table } from '@strapi/admin/strapi-admin';
5
+ import { useAIAvailability } from '@strapi/admin/strapi-admin/ee';
5
6
  import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from '@strapi/content-manager/strapi-admin';
6
- import { Dialog, Flex, Typography, Field, SingleSelect, SingleSelectOption, Button, Status, Modal } from '@strapi/design-system';
7
- import { Trash, Plus, Earth, WarningCircle, ListPlus, Cross } from '@strapi/icons';
7
+ import { Status, SingleSelectOption, Box, Typography, Flex, Link, Dialog, Field, SingleSelect, Button, Modal } from '@strapi/design-system';
8
+ import { Trash, Sparkle, Earth, WarningCircle, Plus, ListPlus, Cross } from '@strapi/icons';
8
9
  import { useIntl } from 'react-intl';
9
- import { useNavigate } from 'react-router-dom';
10
+ import { NavLink, useNavigate } from 'react-router-dom';
10
11
  import { styled } from 'styled-components';
12
+ import { useAILocalizationJobsPolling } from '../hooks/useAILocalizationJobsPolling.mjs';
11
13
  import { useI18n } from '../hooks/useI18n.mjs';
14
+ import { useGetAILocalizationJobsByDocumentQuery } from '../services/aiLocalizationJobs.mjs';
12
15
  import { useGetLocalesQuery } from '../services/locales.mjs';
13
16
  import { useGetManyDraftRelationCountQuery } from '../services/relations.mjs';
17
+ import { useGetSettingsQuery } from '../services/settings.mjs';
14
18
  import { cleanData } from '../utils/clean.mjs';
15
19
  import { getTranslation } from '../utils/getTranslation.mjs';
16
20
  import { capitalize } from '../utils/strings.mjs';
@@ -60,6 +64,18 @@ const LocaleOption = ({ isDraftAndPublishEnabled, locale, status, entryExists })
60
64
  ]
61
65
  });
62
66
  };
67
+ const LocaleOptionStartIcon = ({ entryWithLocaleExists, translationStatus, index })=>{
68
+ const isAiAvailable = useAIAvailability();
69
+ if (!entryWithLocaleExists) {
70
+ return /*#__PURE__*/ jsx(Plus, {});
71
+ }
72
+ if (isAiAvailable && index !== 0 && translationStatus === 'failed') {
73
+ return /*#__PURE__*/ jsx(WarningCircle, {
74
+ fill: "warning600"
75
+ });
76
+ }
77
+ return null;
78
+ };
63
79
  const LocalePickerAction = ({ document, meta, model, collectionType, documentId })=>{
64
80
  const { formatMessage } = useIntl();
65
81
  const [{ query }, setQuery] = useQueryParams();
@@ -74,6 +90,14 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
74
90
  locale: currentDesiredLocale
75
91
  }
76
92
  });
93
+ const { data: jobData } = useGetAILocalizationJobsByDocumentQuery({
94
+ documentId: documentId,
95
+ model: model,
96
+ collectionType: collectionType
97
+ });
98
+ const { data: settings } = useGetSettingsQuery();
99
+ const isAiAvailable = useAIAvailability();
100
+ const setValues = useForm('LocalePickerAction', (state)=>state.setValues);
77
101
  const handleSelect = React.useCallback((value)=>{
78
102
  setQuery({
79
103
  plugins: {
@@ -87,6 +111,51 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
87
111
  query.plugins,
88
112
  setQuery
89
113
  ]);
114
+ const nonTranslatedFields = React.useMemo(()=>{
115
+ if (!schema?.attributes) return [];
116
+ return Object.keys(schema.attributes).filter((field)=>{
117
+ const attribute = schema.attributes[field];
118
+ return attribute?.pluginOptions?.i18n?.localized === false;
119
+ });
120
+ }, [
121
+ schema?.attributes
122
+ ]);
123
+ const sourceLocaleData = React.useMemo(()=>{
124
+ if (!Array.isArray(locales) || !meta?.availableLocales) return null;
125
+ const defaultLocale = locales.find((locale)=>locale.isDefault);
126
+ const existingLocales = meta.availableLocales.map((loc)=>loc.locale);
127
+ const sourceLocaleCode = defaultLocale && existingLocales.includes(defaultLocale.code) && defaultLocale.code !== currentDesiredLocale ? defaultLocale.code : existingLocales.find((locale)=>locale !== currentDesiredLocale);
128
+ if (!sourceLocaleCode) return null;
129
+ // Find the document data from availableLocales (now includes non-translatable fields)
130
+ const sourceLocaleDoc = meta.availableLocales.find((loc)=>loc.locale === sourceLocaleCode);
131
+ return sourceLocaleDoc ? {
132
+ locale: sourceLocaleCode,
133
+ data: sourceLocaleDoc
134
+ } : null;
135
+ }, [
136
+ locales,
137
+ meta?.availableLocales,
138
+ currentDesiredLocale
139
+ ]);
140
+ /**
141
+ * Prefilling form with non-translatable fields from already existing locale
142
+ */ React.useEffect(()=>{
143
+ // Only run when creating a new locale (no document ID yet) and when we have non-translatable fields
144
+ if (!document?.id && nonTranslatedFields.length > 0 && sourceLocaleData?.data) {
145
+ const dataToSet = nonTranslatedFields.reduce((acc, field)=>{
146
+ acc[field] = sourceLocaleData.data[field];
147
+ return acc;
148
+ }, {});
149
+ if (Object.keys(dataToSet).length > 0) {
150
+ setValues(dataToSet);
151
+ }
152
+ }
153
+ }, [
154
+ document?.id,
155
+ nonTranslatedFields,
156
+ sourceLocaleData?.data,
157
+ setValues
158
+ ]);
90
159
  React.useEffect(()=>{
91
160
  if (!Array.isArray(locales) || !hasI18n) {
92
161
  return;
@@ -106,12 +175,18 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
106
175
  currentDesiredLocale
107
176
  ]);
108
177
  const currentLocale = Array.isArray(locales) ? locales.find((locale)=>locale.code === currentDesiredLocale) : undefined;
178
+ // Use meta.availableLocales instead of document.localizations
179
+ // meta.availableLocales contains all locales for the document, even when creating new locales
180
+ const availableLocales = meta?.availableLocales ?? [];
181
+ const documentLocalizations = document?.localizations ?? [];
182
+ // Prefer meta.availableLocales as it's more reliable, fallback to document.localizations
183
+ const allLocalizations = availableLocales.length > 0 ? availableLocales : documentLocalizations;
109
184
  const allCurrentLocales = [
110
185
  {
111
186
  status: getDocumentStatus(document, meta),
112
187
  locale: currentLocale?.code
113
188
  },
114
- ...document?.localizations ?? []
189
+ ...allLocalizations
115
190
  ];
116
191
  if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
117
192
  return null;
@@ -127,10 +202,46 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
127
202
  id: getTranslation('Settings.locales.modal.locales.label'),
128
203
  defaultMessage: 'Locales'
129
204
  }),
130
- options: displayedLocales.map((locale)=>{
205
+ options: displayedLocales.map((locale, index)=>{
131
206
  const entryWithLocaleExists = allCurrentLocales.some((doc)=>doc.locale === locale.code);
132
207
  const currentLocaleDoc = allCurrentLocales.find((doc)=>'locale' in doc ? doc.locale === locale.code : false);
133
208
  const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
209
+ if (window.strapi.future.isEnabled('unstableAILocalizations') && isAiAvailable && settings?.data?.aiLocalizations) {
210
+ return {
211
+ _render: ()=>/*#__PURE__*/ jsxs(React.Fragment, {
212
+ children: [
213
+ /*#__PURE__*/ jsx(SingleSelectOption, {
214
+ disabled: !permissionsToCheck.includes(locale.code),
215
+ startIcon: /*#__PURE__*/ jsx(LocaleOptionStartIcon, {
216
+ entryWithLocaleExists: entryWithLocaleExists,
217
+ translationStatus: jobData?.data?.status,
218
+ index: index
219
+ }),
220
+ value: locale.code,
221
+ children: /*#__PURE__*/ jsx(LocaleOption, {
222
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
223
+ locale: locale,
224
+ status: currentLocaleDoc?.status,
225
+ entryExists: entryWithLocaleExists
226
+ })
227
+ }, locale.code),
228
+ index === 0 && /*#__PURE__*/ jsx(Box, {
229
+ paddingRight: 4,
230
+ paddingLeft: 4,
231
+ paddingTop: 2,
232
+ paddingBottom: 2,
233
+ children: /*#__PURE__*/ jsx(Typography, {
234
+ variant: "sigma",
235
+ children: formatMessage({
236
+ id: getTranslation('CMEditViewLocalePicker.locale.ai-translations'),
237
+ defaultMessage: 'AI Translations'
238
+ })
239
+ })
240
+ })
241
+ ]
242
+ }, index)
243
+ };
244
+ }
134
245
  return {
135
246
  disabled: !permissionsToCheck.includes(locale.code),
136
247
  value: locale.code,
@@ -138,9 +249,12 @@ const LocalePickerAction = ({ document, meta, model, collectionType, documentId
138
249
  isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
139
250
  locale: locale,
140
251
  status: currentLocaleDoc?.status,
141
- entryExists: entryWithLocaleExists
252
+ entryExists: entryWithLocaleExists,
253
+ translationStatus: jobData?.data?.status
142
254
  }),
143
- startIcon: !entryWithLocaleExists ? /*#__PURE__*/ jsx(Plus, {}) : null
255
+ startIcon: /*#__PURE__*/ jsx(LocaleOptionStartIcon, {
256
+ entryWithLocaleExists: entryWithLocaleExists
257
+ })
144
258
  };
145
259
  }),
146
260
  customizeContent: ()=>currentLocale?.name,
@@ -163,6 +277,119 @@ const getDocumentStatus = (document, meta)=>{
163
277
  }
164
278
  return docStatus;
165
279
  };
280
+ /* -------------------------------------------------------------------------------------------------
281
+ * AISettingsStatusAction
282
+ * -----------------------------------------------------------------------------------------------*/ const AITranslationStatusIcon = styled(Status)`
283
+ display: flex;
284
+ gap: ${({ theme })=>theme.spaces[1]};
285
+ justify-content: center;
286
+ align-items: center;
287
+ height: 100%;
288
+
289
+ // Disabled state
290
+ ${({ $isAISettingEnabled, theme })=>!$isAISettingEnabled && `
291
+ background-color: ${theme.colors.neutral150};
292
+ `}
293
+
294
+ svg {
295
+ ${({ $isAISettingEnabled, theme })=>!$isAISettingEnabled && `
296
+ fill: ${theme.colors.neutral300};
297
+ `}
298
+ }
299
+ `;
300
+ const AITranslationStatusAction = ({ documentId, model, collectionType })=>{
301
+ const { formatMessage } = useIntl();
302
+ const isAIAvailable = useAIAvailability();
303
+ const { data: settings } = useGetSettingsQuery();
304
+ const isAISettingEnabled = settings?.data?.aiLocalizations;
305
+ const { hasI18n } = useI18n();
306
+ // Poll for AI localizations jobs when AI is enabled and we have a documentId
307
+ const { status } = useAILocalizationJobsPolling({
308
+ documentId,
309
+ model,
310
+ collectionType
311
+ });
312
+ const statusVariant = (()=>{
313
+ if (status === 'failed') {
314
+ return 'warning';
315
+ }
316
+ if (isAISettingEnabled) {
317
+ return 'alternative';
318
+ }
319
+ return 'neutral';
320
+ })();
321
+ // Do not display this action when i18n is not available
322
+ if (!hasI18n) {
323
+ return null;
324
+ }
325
+ // Do not display this action when AI is not available
326
+ const hasAIFutureFlag = window.strapi.future.isEnabled('unstableAILocalizations');
327
+ if (!isAIAvailable || !hasAIFutureFlag) {
328
+ return null;
329
+ }
330
+ return {
331
+ _status: {
332
+ message: /*#__PURE__*/ jsx(Box, {
333
+ height: "100%",
334
+ "aria-label": formatMessage({
335
+ id: getTranslation('CMEditViewAITranslation.status-aria-label'),
336
+ defaultMessage: 'AI Translation Status'
337
+ }),
338
+ children: /*#__PURE__*/ jsx(AITranslationStatusIcon, {
339
+ $isAISettingEnabled: Boolean(isAISettingEnabled),
340
+ variant: statusVariant,
341
+ size: "S",
342
+ children: /*#__PURE__*/ jsx(Sparkle, {})
343
+ })
344
+ }),
345
+ tooltip: /*#__PURE__*/ jsxs(Flex, {
346
+ direction: "column",
347
+ padding: 4,
348
+ alignItems: "flex-start",
349
+ width: "25rem",
350
+ children: [
351
+ /*#__PURE__*/ jsx(Typography, {
352
+ variant: "pi",
353
+ fontWeight: "600",
354
+ children: formatMessage({
355
+ id: getTranslation('CMEditViewAITranslation.status-title'),
356
+ defaultMessage: '{enabled, select, true {AI translation enabled} false {AI translation disabled} other {AI translation disabled}}'
357
+ }, {
358
+ enabled: isAISettingEnabled
359
+ })
360
+ }),
361
+ /*#__PURE__*/ jsx(Typography, {
362
+ variant: "pi",
363
+ paddingTop: 1,
364
+ paddingBottom: 3,
365
+ children: formatMessage({
366
+ id: getTranslation('CMEditViewAITranslation.status-description'),
367
+ defaultMessage: 'Our AI translates content in all locales each time you save a modification.'
368
+ })
369
+ }),
370
+ /*#__PURE__*/ jsx(Link, {
371
+ fontSize: "inherit",
372
+ tag: NavLink,
373
+ to: "/settings/internationalization",
374
+ style: {
375
+ alignSelf: 'flex-end'
376
+ },
377
+ children: /*#__PURE__*/ jsx(Typography, {
378
+ variant: "pi",
379
+ textAlign: "right",
380
+ children: formatMessage({
381
+ id: getTranslation('CMEditViewAITranslation.settings-link'),
382
+ defaultMessage: '{enabled, select, true {Disable it in settings} false {Enable it in settings} other {Enable it in settings}}'
383
+ }, {
384
+ enabled: isAISettingEnabled
385
+ })
386
+ })
387
+ })
388
+ ]
389
+ })
390
+ }
391
+ };
392
+ };
166
393
  /* -------------------------------------------------------------------------------------------------
167
394
  * FillFromAnotherLocaleAction
168
395
  * -----------------------------------------------------------------------------------------------*/ const FillFromAnotherLocaleAction = ({ documentId, meta, model, collectionType })=>{
@@ -182,6 +409,9 @@ const getDocumentStatus = (document, meta)=>{
182
409
  }
183
410
  });
184
411
  const { data: locales = [] } = useGetLocalesQuery();
412
+ const isAIAvailable = useAIAvailability();
413
+ const { data: settings } = useGetSettingsQuery();
414
+ const isAISettingEnabled = settings?.data?.aiLocalizations;
185
415
  const availableLocales = Array.isArray(locales) ? locales.filter((locale)=>meta?.availableLocales.some((l)=>l.locale === locale.code)) : [];
186
416
  const fillFromLocale = (onClose)=>async ()=>{
187
417
  const response = await getDocument({
@@ -203,6 +433,11 @@ const getDocumentStatus = (document, meta)=>{
203
433
  if (!hasI18n) {
204
434
  return null;
205
435
  }
436
+ // Do not display this action when AI is available and AI translations are enabled
437
+ const hasAIFutureFlag = window.strapi.future.isEnabled('unstableAILocalizations');
438
+ if (hasAIFutureFlag && isAIAvailable && isAISettingEnabled) {
439
+ return null;
440
+ }
206
441
  return {
207
442
  type: 'icon',
208
443
  icon: /*#__PURE__*/ jsx(Earth, {}),
@@ -692,5 +927,5 @@ const getDocumentStatus = (document, meta)=>{
692
927
  }
693
928
  `;
694
929
 
695
- export { BulkLocalePublishAction, BulkLocaleUnpublishAction, DeleteLocaleAction, FillFromAnotherLocaleAction, LocalePickerAction };
930
+ export { AITranslationStatusAction, BulkLocalePublishAction, BulkLocaleUnpublishAction, DeleteLocaleAction, FillFromAnotherLocaleAction, LocalePickerAction };
696
931
  //# sourceMappingURL=CMHeaderActions.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CMHeaderActions.mjs","sources":["../../../admin/src/components/CMHeaderActions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n useNotification,\n useQueryParams,\n Table,\n useAPIErrorHandler,\n FormErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport {\n type DocumentActionComponent,\n type DocumentActionProps,\n unstable_useDocument as useDocument,\n unstable_useDocumentActions as useDocumentActions,\n buildValidParams,\n HeaderActionProps,\n} from '@strapi/content-manager/strapi-admin';\nimport {\n Flex,\n Status,\n Typography,\n Button,\n Modal,\n Field,\n SingleSelect,\n SingleSelectOption,\n Dialog,\n type StatusVariant,\n} from '@strapi/design-system';\nimport { WarningCircle, ListPlus, Trash, Earth, Cross, Plus } from '@strapi/icons';\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 { cleanData } from '../utils/clean';\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';\nimport type { Modules } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * LocalePickerAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LocaleOptionProps {\n isDraftAndPublishEnabled: boolean;\n locale: Locale;\n status: 'draft' | 'published' | 'modified';\n entryExists: boolean;\n}\n\nconst statusVariants: Record<LocaleOptionProps['status'], StatusVariant> = {\n draft: 'secondary',\n published: 'success',\n modified: 'alternative',\n};\n\nconst LocaleOption = ({\n isDraftAndPublishEnabled,\n locale,\n status,\n entryExists,\n}: LocaleOptionProps) => {\n const { formatMessage } = useIntl();\n\n if (!entryExists) {\n return formatMessage(\n {\n id: getTranslation('CMEditViewLocalePicker.locale.create'),\n defaultMessage: 'Create <bold>{locale}</bold> locale',\n },\n {\n bold: (locale: React.ReactNode) => <b>{locale}</b>,\n locale: locale.name,\n }\n );\n }\n\n return (\n <Flex width=\"100%\" gap={1} justifyContent=\"space-between\">\n <Typography>{locale.name}</Typography>\n {isDraftAndPublishEnabled ? (\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size=\"S\"\n variant={statusVariants[status]}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n ) : null}\n </Flex>\n );\n};\n\nconst LocalePickerAction = ({\n document,\n meta,\n model,\n collectionType,\n documentId,\n}: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<I18nBaseQuery>();\n const { hasI18n, canCreate, canRead } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const { schema } = useDocument({\n model,\n collectionType,\n documentId,\n params: { locale: currentDesiredLocale },\n });\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 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, currentDesiredLocale]);\n\n const currentLocale = Array.isArray(locales)\n ? locales.find((locale) => locale.code === currentDesiredLocale)\n : undefined;\n\n const allCurrentLocales = [\n { status: getDocumentStatus(document, meta), locale: currentLocale?.code },\n ...(document?.localizations ?? []),\n ];\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 read we allow you to see the locale exists\n * otherwise the locale is hidden.\n */\n return canRead.includes(locale.code);\n });\n\n return {\n label: formatMessage({\n id: getTranslation('Settings.locales.modal.locales.label'),\n defaultMessage: 'Locales',\n }),\n options: displayedLocales.map((locale) => {\n const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);\n\n const currentLocaleDoc = allCurrentLocales.find((doc) =>\n 'locale' in doc ? doc.locale === locale.code : false\n );\n\n const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;\n\n return {\n disabled: !permissionsToCheck.includes(locale.code),\n value: locale.code,\n label: (\n <LocaleOption\n isDraftAndPublishEnabled={!!schema?.options?.draftAndPublish}\n locale={locale}\n status={currentLocaleDoc?.status}\n entryExists={entryWithLocaleExists}\n />\n ),\n startIcon: !entryWithLocaleExists ? <Plus /> : null,\n };\n }),\n customizeContent: () => currentLocale?.name,\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 * FillFromAnotherLocaleAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst FillFromAnotherLocaleAction = ({\n documentId,\n meta,\n model,\n collectionType,\n}: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams<I18nBaseQuery>();\n const { hasI18n } = useI18n();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const [localeSelected, setLocaleSelected] = React.useState<string | null>(null);\n const setValues = useForm('FillFromAnotherLocale', (state) => state.setValues);\n\n const { getDocument } = useDocumentActions();\n const { schema, components } = useDocument({\n model,\n documentId,\n collectionType,\n params: { locale: currentDesiredLocale },\n });\n const { data: locales = [] } = useGetLocalesQuery();\n\n const availableLocales = Array.isArray(locales)\n ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code))\n : [];\n\n const fillFromLocale = (onClose: () => void) => async () => {\n const response = await getDocument({\n collectionType,\n model,\n documentId,\n params: { locale: localeSelected },\n });\n if (!response || !schema) {\n return;\n }\n\n const { data } = response;\n\n const cleanedData = cleanData(data, schema, components);\n\n setValues(cleanedData);\n\n onClose();\n };\n\n if (!hasI18n) {\n return null;\n }\n\n return {\n type: 'icon',\n icon: <Earth />,\n disabled: availableLocales.length === 0,\n label: formatMessage({\n id: getTranslation('CMEditViewCopyLocale.copy-text'),\n defaultMessage: 'Fill in from another locale',\n }),\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: ({ onClose }: { onClose: () => void }) => (\n <>\n <Dialog.Body>\n <Flex direction=\"column\" gap={3}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.body'),\n defaultMessage:\n 'Your current content will be erased and filled by the content of the selected locale:',\n })}\n </Typography>\n <Field.Root width=\"100%\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.field.label'),\n defaultMessage: 'Locale',\n })}\n </Field.Label>\n <SingleSelect\n value={localeSelected}\n placeholder={formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.field.placeholder'),\n defaultMessage: 'Select one locale...',\n })}\n // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.\n onChange={(value) => setLocaleSelected(value)}\n >\n {availableLocales.map((locale) => (\n <SingleSelectOption key={locale.code} value={locale.code}>\n {locale.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Flex gap={2} width=\"100%\">\n <Button flex=\"auto\" variant=\"tertiary\" onClick={onClose}>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.cancel-text'),\n defaultMessage: 'No, cancel',\n })}\n </Button>\n <Button flex=\"auto\" variant=\"success\" onClick={fillFromLocale(onClose)}>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.submit-text'),\n defaultMessage: 'Yes, fill in',\n })}\n </Button>\n </Flex>\n </Dialog.Footer>\n </>\n ),\n },\n };\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, isLoading } = useDocumentActions();\n const { hasI18n, canDelete } = useI18n();\n\n // Get the current locale object, using the URL instead of document so it works while creating\n const [{ query }] = useQueryParams<I18nBaseQuery>();\n const { data: locales = [] } = useGetLocalesQuery();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const locale = !('error' in locales) && locales.find((loc) => loc.code === currentDesiredLocale);\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 {\n id: getTranslation('actions.delete.label'),\n defaultMessage: 'Delete entry ({locale})',\n },\n { locale: locale && locale.name }\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 loading: isLoading,\n onConfirm: async () => {\n const unableToDelete =\n // We are unable to delete a collection type without a document ID\n // & unable to delete generally if there is no document locale\n (collectionType !== 'single-types' && !documentId) || !document?.locale;\n\n if (unableToDelete) {\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\nexport type LocaleStatus = {\n locale: string;\n status: Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n};\n\ninterface ExtendedDocumentActionProps extends DocumentActionProps {\n action?: 'bulk-publish' | 'bulk-unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleAction\n *\n * This component is used to handle bulk publish and unpublish actions on locales.\n * -----------------------------------------------------------------------------------------------*/\n\nconst BulkLocaleAction: DocumentActionComponent = ({\n document,\n documentId,\n model,\n collectionType,\n action,\n}: ExtendedDocumentActionProps) => {\n const locale = document?.locale ?? null;\n const [{ query }] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const isOnPublishedTab = 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, unpublishMany: unpublishManyAction } =\n useDocumentActions();\n\n const { schema, validate } = useDocument(\n {\n model,\n collectionType,\n documentId,\n params: {\n locale,\n },\n },\n {\n // No need to fetch the document, the data is already available in the `document` prop\n skip: true,\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) {\n return [[], {}];\n }\n\n const localizations = document.localizations ?? [];\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 locales: LocaleStatus[] = localizations.map((doc: any) => {\n const { locale, status } = doc;\n return { locale, status };\n });\n\n // Add the current document locale\n locales.unshift({\n locale: document.locale,\n status: document.status,\n });\n\n // Build the validation errors for each locale.\n const allDocuments = [document, ...localizations];\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 [locales, errors];\n }, [document, validate]);\n\n const isBulkPublish = action === 'bulk-publish';\n const localesForAction = selectedRows.reduce((acc: string[], selectedRow: LocaleStatus) => {\n const isValidLocale =\n // Validation errors are irrelevant if we are trying to unpublish\n !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale);\n\n const shouldAddLocale = isBulkPublish\n ? selectedRow.status !== 'published' && isValidLocale\n : selectedRow.status !== 'draft' && isValidLocale;\n\n if (shouldAddLocale) {\n acc.push(selectedRow.locale);\n }\n\n return acc;\n }, []);\n\n // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately\n // see https://www.notion.so/strapi/Count-draft-relations-56901b492efb45ab90d42fe975b32bd8?pvs=4\n const enableDraftRelationsCount = false;\n const {\n data: draftRelationsCount = 0,\n isLoading: isDraftRelationsLoading,\n error: isDraftRelationsError,\n } = useGetManyDraftRelationCountQuery(\n {\n model,\n documentIds: [documentId!],\n locale: localesForAction,\n },\n {\n skip: !enableDraftRelationsCount || !documentId || localesForAction.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) {\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: localesForAction,\n },\n });\n\n setSelectedRows([]);\n };\n\n const unpublish = async () => {\n await unpublishManyAction({\n model,\n documentIds: [documentId],\n params: {\n ...params,\n locale: localesForAction,\n },\n });\n\n setSelectedRows([]);\n };\n\n const handleAction = async () => {\n if (draftRelationsCount > 0) {\n setIsDraftRelationConfirmationOpen(true);\n } else if (isBulkPublish) {\n await publish();\n } else {\n await unpublish();\n }\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.${isBulkPublish ? 'publish' : 'unpublish'}-title`),\n defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} Multiple Locales`,\n }),\n variant: isBulkPublish ? 'secondary' : 'danger',\n icon: isBulkPublish ? <ListPlus /> : <Cross />,\n disabled: isOnPublishedTab || canPublish.length === 0,\n position: ['panel'],\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? 'publish' : 'unpublish'}-title`),\n defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} 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 action={action ?? 'bulk-publish'}\n />\n </Table.Root>\n );\n },\n footer: () => (\n <Modal.Footer justifyContent=\"flex-end\">\n <Button\n loading={isDraftRelationsLoading}\n disabled={!hasPermission || localesForAction.length === 0}\n variant=\"default\"\n onClick={handleAction}\n >\n {formatMessage({\n id: isBulkPublish ? 'app.utils.publish' : 'app.utils.unpublish',\n defaultMessage: isBulkPublish ? 'Publish' : 'Unpublish',\n })}\n </Button>\n </Modal.Footer>\n ),\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocalePublishAction\n * -----------------------------------------------------------------------------------------------*/\nconst BulkLocalePublishAction: DocumentActionComponent = (props: ExtendedDocumentActionProps) => {\n return BulkLocaleAction({ action: 'bulk-publish', ...props });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleUnpublishAction\n * -----------------------------------------------------------------------------------------------*/\nconst BulkLocaleUnpublishAction: DocumentActionComponent = (props: ExtendedDocumentActionProps) => {\n return BulkLocaleAction({ action: 'bulk-unpublish', ...props });\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 {\n BulkLocalePublishAction,\n BulkLocaleUnpublishAction,\n DeleteLocaleAction,\n LocalePickerAction,\n FillFromAnotherLocaleAction,\n};\n"],"names":["statusVariants","draft","published","modified","LocaleOption","isDraftAndPublishEnabled","locale","status","entryExists","formatMessage","useIntl","id","getTranslation","defaultMessage","bold","_jsx","b","name","_jsxs","Flex","width","gap","justifyContent","Typography","Status","display","paddingLeft","paddingRight","paddingTop","paddingBottom","size","variant","tag","fontWeight","capitalize","LocalePickerAction","document","meta","model","collectionType","documentId","query","setQuery","useQueryParams","hasI18n","canCreate","canRead","useI18n","data","locales","useGetLocalesQuery","currentDesiredLocale","plugins","i18n","schema","useDocument","params","handleSelect","React","useCallback","value","useEffect","Array","isArray","doesLocaleExist","find","loc","code","defaultLocale","isDefault","currentLocale","undefined","allCurrentLocales","getDocumentStatus","localizations","length","displayedLocales","filter","includes","label","options","map","entryWithLocaleExists","some","doc","currentLocaleDoc","permissionsToCheck","disabled","draftAndPublish","startIcon","Plus","customizeContent","onSelect","docStatus","statuses","availableStatus","publishedAt","FillFromAnotherLocaleAction","localeSelected","setLocaleSelected","useState","setValues","useForm","state","getDocument","useDocumentActions","components","availableLocales","l","fillFromLocale","onClose","response","cleanedData","cleanData","type","icon","Earth","dialog","title","content","_Fragment","Dialog","Body","direction","WarningCircle","height","fill","textAlign","Field","Root","Label","SingleSelect","placeholder","onChange","SingleSelectOption","Footer","Button","flex","onClick","DeleteLocaleAction","navigate","useNavigate","toggleNotification","useNotification","delete","deleteAction","isLoading","canDelete","position","StyledTrash","loading","onConfirm","unableToDelete","console","error","message","res","pathname","replace","BulkLocaleAction","action","useMemo","buildValidParams","isOnPublishedTab","canPublish","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","selectedRows","setSelectedRows","isDraftRelationConfirmationOpen","setIsDraftRelationConfirmationOpen","publishMany","publishManyAction","unpublishMany","unpublishManyAction","validate","skip","localesMetadata","skipToken","headers","rows","validationErrors","unshift","allDocuments","errors","reduce","errs","validation","isBulkPublish","localesForAction","acc","selectedRow","isValidLocale","Object","keys","shouldAddLocale","push","enableDraftRelationsCount","draftRelationsCount","isDraftRelationsLoading","isDraftRelationsError","useGetManyDraftRelationCountQuery","documentIds","publish","unpublish","handleAction","onCancel","alignItems","hasPermission","every","ListPlus","Cross","Table","row","onSelectedRowsChange","tableSelectedRows","BulkLocaleActionModal","footer","Modal","BulkLocalePublishAction","props","BulkLocaleUnpublishAction","styled","Trash"],"mappings":"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"}
1
+ {"version":3,"file":"CMHeaderActions.mjs","sources":["../../../admin/src/components/CMHeaderActions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { skipToken } from '@reduxjs/toolkit/query';\nimport {\n useNotification,\n useQueryParams,\n Table,\n useAPIErrorHandler,\n FormErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\nimport {\n type DocumentActionComponent,\n type DocumentActionProps,\n unstable_useDocument as useDocument,\n unstable_useDocumentActions as useDocumentActions,\n buildValidParams,\n HeaderActionProps,\n} from '@strapi/content-manager/strapi-admin';\nimport {\n Flex,\n Status,\n Typography,\n Button,\n Modal,\n Field,\n SingleSelect,\n SingleSelectOption,\n Dialog,\n type StatusVariant,\n Box,\n Link,\n} from '@strapi/design-system';\nimport { WarningCircle, ListPlus, Trash, Earth, Cross, Plus, Sparkle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useAILocalizationJobsPolling } from '../hooks/useAILocalizationJobsPolling';\nimport { useI18n } from '../hooks/useI18n';\nimport { useGetAILocalizationJobsByDocumentQuery } from '../services/aiLocalizationJobs';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { useGetManyDraftRelationCountQuery } from '../services/relations';\nimport { useGetSettingsQuery } from '../services/settings';\nimport { cleanData } from '../utils/clean';\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';\nimport type { Modules } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * LocalePickerAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LocaleOptionProps {\n isDraftAndPublishEnabled: boolean;\n locale: Locale;\n status: 'draft' | 'published' | 'modified';\n entryExists: boolean;\n translationStatus?: 'processing' | 'failed' | 'completed' | undefined;\n}\n\nconst statusVariants: Record<LocaleOptionProps['status'], StatusVariant> = {\n draft: 'secondary',\n published: 'success',\n modified: 'alternative',\n};\n\nconst LocaleOption = ({\n isDraftAndPublishEnabled,\n locale,\n status,\n entryExists,\n}: LocaleOptionProps) => {\n const { formatMessage } = useIntl();\n\n if (!entryExists) {\n return formatMessage(\n {\n id: getTranslation('CMEditViewLocalePicker.locale.create'),\n defaultMessage: 'Create <bold>{locale}</bold> locale',\n },\n {\n bold: (locale: React.ReactNode) => <b>{locale}</b>,\n locale: locale.name,\n }\n );\n }\n\n return (\n <Flex width=\"100%\" gap={1} justifyContent=\"space-between\">\n <Typography>{locale.name}</Typography>\n {isDraftAndPublishEnabled ? (\n <Status\n display=\"flex\"\n paddingLeft=\"6px\"\n paddingRight=\"6px\"\n paddingTop=\"2px\"\n paddingBottom=\"2px\"\n size=\"S\"\n variant={statusVariants[status]}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {capitalize(status)}\n </Typography>\n </Status>\n ) : null}\n </Flex>\n );\n};\n\nconst LocaleOptionStartIcon = ({\n entryWithLocaleExists,\n translationStatus,\n index,\n}: {\n entryWithLocaleExists: boolean;\n translationStatus?: 'processing' | 'failed' | 'completed' | undefined;\n index?: number;\n}) => {\n const isAiAvailable = useAIAvailability();\n\n if (!entryWithLocaleExists) {\n return <Plus />;\n }\n\n if (isAiAvailable && index !== 0 && translationStatus === 'failed') {\n return <WarningCircle fill=\"warning600\" />;\n }\n\n return null;\n};\n\nconst LocalePickerAction = ({\n document,\n meta,\n model,\n collectionType,\n documentId,\n}: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const [{ query }, setQuery] = useQueryParams<I18nBaseQuery>();\n const { hasI18n, canCreate, canRead } = useI18n();\n const { data: locales = [] } = useGetLocalesQuery();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const { schema } = useDocument({\n model,\n collectionType,\n documentId,\n params: { locale: currentDesiredLocale },\n });\n const { data: jobData } = useGetAILocalizationJobsByDocumentQuery({\n documentId: documentId!,\n model: model!,\n collectionType: collectionType!,\n });\n const { data: settings } = useGetSettingsQuery();\n const isAiAvailable = useAIAvailability();\n const setValues = useForm('LocalePickerAction', (state) => state.setValues);\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 const nonTranslatedFields = React.useMemo(() => {\n if (!schema?.attributes) return [];\n return Object.keys(schema.attributes).filter((field) => {\n const attribute = schema.attributes[field] as Record<string, unknown>;\n return (attribute?.pluginOptions as any)?.i18n?.localized === false;\n });\n }, [schema?.attributes]);\n\n const sourceLocaleData = React.useMemo(() => {\n if (!Array.isArray(locales) || !meta?.availableLocales) return null;\n\n const defaultLocale = locales.find((locale: Locale) => locale.isDefault);\n const existingLocales = meta.availableLocales.map((loc) => loc.locale);\n\n const sourceLocaleCode =\n defaultLocale &&\n existingLocales.includes(defaultLocale.code) &&\n defaultLocale.code !== currentDesiredLocale\n ? defaultLocale.code\n : existingLocales.find((locale) => locale !== currentDesiredLocale);\n\n if (!sourceLocaleCode) return null;\n\n // Find the document data from availableLocales (now includes non-translatable fields)\n const sourceLocaleDoc = meta.availableLocales.find((loc) => loc.locale === sourceLocaleCode);\n\n return sourceLocaleDoc\n ? { locale: sourceLocaleCode, data: sourceLocaleDoc as Record<string, unknown> }\n : null;\n }, [locales, meta?.availableLocales, currentDesiredLocale]);\n\n /**\n * Prefilling form with non-translatable fields from already existing locale\n */\n React.useEffect(() => {\n // Only run when creating a new locale (no document ID yet) and when we have non-translatable fields\n if (!document?.id && nonTranslatedFields.length > 0 && sourceLocaleData?.data) {\n const dataToSet = nonTranslatedFields.reduce(\n (acc: Record<string, unknown>, field: string) => {\n acc[field] = sourceLocaleData.data[field];\n return acc;\n },\n {}\n );\n\n if (Object.keys(dataToSet).length > 0) {\n setValues(dataToSet);\n }\n }\n }, [document?.id, nonTranslatedFields, sourceLocaleData?.data, setValues]);\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 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, currentDesiredLocale]);\n\n const currentLocale = Array.isArray(locales)\n ? locales.find((locale) => locale.code === currentDesiredLocale)\n : undefined;\n\n // Use meta.availableLocales instead of document.localizations\n // meta.availableLocales contains all locales for the document, even when creating new locales\n const availableLocales = meta?.availableLocales ?? [];\n const documentLocalizations = document?.localizations ?? [];\n\n // Prefer meta.availableLocales as it's more reliable, fallback to document.localizations\n const allLocalizations = availableLocales.length > 0 ? availableLocales : documentLocalizations;\n\n const allCurrentLocales = [\n { status: getDocumentStatus(document, meta), locale: currentLocale?.code },\n ...allLocalizations,\n ];\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 read we allow you to see the locale exists\n * otherwise the locale is hidden.\n */\n return canRead.includes(locale.code);\n });\n\n return {\n label: formatMessage({\n id: getTranslation('Settings.locales.modal.locales.label'),\n defaultMessage: 'Locales',\n }),\n options: displayedLocales.map((locale, index) => {\n const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);\n\n const currentLocaleDoc = allCurrentLocales.find((doc) =>\n 'locale' in doc ? doc.locale === locale.code : false\n );\n\n const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;\n\n if (\n window.strapi.future.isEnabled('unstableAILocalizations') &&\n isAiAvailable &&\n settings?.data?.aiLocalizations\n ) {\n return {\n _render: () => (\n <React.Fragment key={index}>\n <SingleSelectOption\n disabled={!permissionsToCheck.includes(locale.code)}\n key={locale.code}\n startIcon={\n <LocaleOptionStartIcon\n entryWithLocaleExists={entryWithLocaleExists}\n translationStatus={jobData?.data?.status}\n index={index}\n />\n }\n value={locale.code}\n >\n <LocaleOption\n isDraftAndPublishEnabled={!!schema?.options?.draftAndPublish}\n locale={locale}\n status={currentLocaleDoc?.status}\n entryExists={entryWithLocaleExists}\n />\n </SingleSelectOption>\n {index === 0 && (\n <Box paddingRight={4} paddingLeft={4} paddingTop={2} paddingBottom={2}>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('CMEditViewLocalePicker.locale.ai-translations'),\n defaultMessage: 'AI Translations',\n })}\n </Typography>\n </Box>\n )}\n </React.Fragment>\n ),\n };\n }\n\n return {\n disabled: !permissionsToCheck.includes(locale.code),\n value: locale.code,\n label: (\n <LocaleOption\n isDraftAndPublishEnabled={!!schema?.options?.draftAndPublish}\n locale={locale}\n status={currentLocaleDoc?.status}\n entryExists={entryWithLocaleExists}\n translationStatus={jobData?.data?.status}\n />\n ),\n startIcon: <LocaleOptionStartIcon entryWithLocaleExists={entryWithLocaleExists} />,\n };\n }),\n customizeContent: () => currentLocale?.name,\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 * AISettingsStatusAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst AITranslationStatusIcon = styled(Status)<{ $isAISettingEnabled: boolean }>`\n display: flex;\n gap: ${({ theme }) => theme.spaces[1]};\n justify-content: center;\n align-items: center;\n height: 100%;\n\n // Disabled state\n ${({ $isAISettingEnabled, theme }) =>\n !$isAISettingEnabled &&\n `\n background-color: ${theme.colors.neutral150};\n `}\n\n svg {\n ${({ $isAISettingEnabled, theme }) =>\n !$isAISettingEnabled &&\n `\n fill: ${theme.colors.neutral300};\n `}\n }\n`;\n\nconst AITranslationStatusAction = ({ documentId, model, collectionType }: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const isAIAvailable = useAIAvailability();\n const { data: settings } = useGetSettingsQuery();\n const isAISettingEnabled = settings?.data?.aiLocalizations;\n const { hasI18n } = useI18n();\n\n // Poll for AI localizations jobs when AI is enabled and we have a documentId\n const { status } = useAILocalizationJobsPolling({\n documentId,\n model,\n collectionType,\n });\n const statusVariant = (() => {\n if (status === 'failed') {\n return 'warning';\n }\n\n if (isAISettingEnabled) {\n return 'alternative';\n }\n\n return 'neutral';\n })();\n\n // Do not display this action when i18n is not available\n if (!hasI18n) {\n return null;\n }\n\n // Do not display this action when AI is not available\n const hasAIFutureFlag = window.strapi.future.isEnabled('unstableAILocalizations');\n if (!isAIAvailable || !hasAIFutureFlag) {\n return null;\n }\n\n return {\n _status: {\n message: (\n <Box\n height=\"100%\"\n aria-label={formatMessage({\n id: getTranslation('CMEditViewAITranslation.status-aria-label'),\n defaultMessage: 'AI Translation Status',\n })}\n >\n <AITranslationStatusIcon\n $isAISettingEnabled={Boolean(isAISettingEnabled)}\n variant={statusVariant}\n size=\"S\"\n >\n <Sparkle />\n </AITranslationStatusIcon>\n </Box>\n ),\n tooltip: (\n <Flex direction=\"column\" padding={4} alignItems=\"flex-start\" width=\"25rem\">\n <Typography variant=\"pi\" fontWeight=\"600\">\n {formatMessage(\n {\n id: getTranslation('CMEditViewAITranslation.status-title'),\n defaultMessage:\n '{enabled, select, true {AI translation enabled} false {AI translation disabled} other {AI translation disabled}}',\n },\n { enabled: isAISettingEnabled }\n )}\n </Typography>\n <Typography variant=\"pi\" paddingTop={1} paddingBottom={3}>\n {formatMessage({\n id: getTranslation('CMEditViewAITranslation.status-description'),\n defaultMessage:\n 'Our AI translates content in all locales each time you save a modification.',\n })}\n </Typography>\n <Link\n fontSize=\"inherit\"\n tag={NavLink}\n to=\"/settings/internationalization\"\n style={{ alignSelf: 'flex-end' }}\n >\n <Typography variant=\"pi\" textAlign=\"right\">\n {formatMessage(\n {\n id: getTranslation('CMEditViewAITranslation.settings-link'),\n defaultMessage:\n '{enabled, select, true {Disable it in settings} false {Enable it in settings} other {Enable it in settings}}',\n },\n { enabled: isAISettingEnabled }\n )}\n </Typography>\n </Link>\n </Flex>\n ),\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FillFromAnotherLocaleAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst FillFromAnotherLocaleAction = ({\n documentId,\n meta,\n model,\n collectionType,\n}: HeaderActionProps) => {\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams<I18nBaseQuery>();\n const { hasI18n } = useI18n();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const [localeSelected, setLocaleSelected] = React.useState<string | null>(null);\n const setValues = useForm('FillFromAnotherLocale', (state) => state.setValues);\n\n const { getDocument } = useDocumentActions();\n const { schema, components } = useDocument({\n model,\n documentId,\n collectionType,\n params: { locale: currentDesiredLocale },\n });\n const { data: locales = [] } = useGetLocalesQuery();\n\n const isAIAvailable = useAIAvailability();\n const { data: settings } = useGetSettingsQuery();\n const isAISettingEnabled = settings?.data?.aiLocalizations;\n\n const availableLocales = Array.isArray(locales)\n ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code))\n : [];\n\n const fillFromLocale = (onClose: () => void) => async () => {\n const response = await getDocument({\n collectionType,\n model,\n documentId,\n params: { locale: localeSelected },\n });\n if (!response || !schema) {\n return;\n }\n\n const { data } = response;\n\n const cleanedData = cleanData(data, schema, components);\n\n setValues(cleanedData);\n\n onClose();\n };\n\n if (!hasI18n) {\n return null;\n }\n\n // Do not display this action when AI is available and AI translations are enabled\n const hasAIFutureFlag = window.strapi.future.isEnabled('unstableAILocalizations');\n if (hasAIFutureFlag && isAIAvailable && isAISettingEnabled) {\n return null;\n }\n\n return {\n type: 'icon',\n icon: <Earth />,\n disabled: availableLocales.length === 0,\n label: formatMessage({\n id: getTranslation('CMEditViewCopyLocale.copy-text'),\n defaultMessage: 'Fill in from another locale',\n }),\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.title'),\n defaultMessage: 'Confirmation',\n }),\n content: ({ onClose }: { onClose: () => void }) => (\n <>\n <Dialog.Body>\n <Flex direction=\"column\" gap={3}>\n <WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />\n <Typography textAlign=\"center\">\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.body'),\n defaultMessage:\n 'Your current content will be erased and filled by the content of the selected locale:',\n })}\n </Typography>\n <Field.Root width=\"100%\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.field.label'),\n defaultMessage: 'Locale',\n })}\n </Field.Label>\n <SingleSelect\n value={localeSelected}\n placeholder={formatMessage({\n id: getTranslation('CMEditViewCopyLocale.dialog.field.placeholder'),\n defaultMessage: 'Select one locale...',\n })}\n // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.\n onChange={(value) => setLocaleSelected(value)}\n >\n {availableLocales.map((locale) => (\n <SingleSelectOption key={locale.code} value={locale.code}>\n {locale.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Flex gap={2} width=\"100%\">\n <Button flex=\"auto\" variant=\"tertiary\" onClick={onClose}>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.cancel-text'),\n defaultMessage: 'No, cancel',\n })}\n </Button>\n <Button flex=\"auto\" variant=\"success\" onClick={fillFromLocale(onClose)}>\n {formatMessage({\n id: getTranslation('CMEditViewCopyLocale.submit-text'),\n defaultMessage: 'Yes, fill in',\n })}\n </Button>\n </Flex>\n </Dialog.Footer>\n </>\n ),\n },\n };\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, isLoading } = useDocumentActions();\n const { hasI18n, canDelete } = useI18n();\n\n // Get the current locale object, using the URL instead of document so it works while creating\n const [{ query }] = useQueryParams<I18nBaseQuery>();\n const { data: locales = [] } = useGetLocalesQuery();\n const currentDesiredLocale = query.plugins?.i18n?.locale;\n const locale = !('error' in locales) && locales.find((loc) => loc.code === currentDesiredLocale);\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 {\n id: getTranslation('actions.delete.label'),\n defaultMessage: 'Delete entry ({locale})',\n },\n { locale: locale && locale.name }\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 loading: isLoading,\n onConfirm: async () => {\n const unableToDelete =\n // We are unable to delete a collection type without a document ID\n // & unable to delete generally if there is no document locale\n (collectionType !== 'single-types' && !documentId) || !document?.locale;\n\n if (unableToDelete) {\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\nexport type LocaleStatus = {\n locale: string;\n status: Modules.Documents.Params.PublicationStatus.Kind | 'modified';\n};\n\ninterface ExtendedDocumentActionProps extends DocumentActionProps {\n action?: 'bulk-publish' | 'bulk-unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleAction\n *\n * This component is used to handle bulk publish and unpublish actions on locales.\n * -----------------------------------------------------------------------------------------------*/\n\nconst BulkLocaleAction: DocumentActionComponent = ({\n document,\n documentId,\n model,\n collectionType,\n action,\n}: ExtendedDocumentActionProps) => {\n const locale = document?.locale ?? null;\n const [{ query }] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const isOnPublishedTab = 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, unpublishMany: unpublishManyAction } =\n useDocumentActions();\n\n const { schema, validate } = useDocument(\n {\n model,\n collectionType,\n documentId,\n params: {\n locale,\n },\n },\n {\n // No need to fetch the document, the data is already available in the `document` prop\n skip: true,\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) {\n return [[], {}];\n }\n\n const localizations = document.localizations ?? [];\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 locales: LocaleStatus[] = localizations.map((doc: any) => {\n const { locale, status } = doc;\n return { locale, status };\n });\n\n // Add the current document locale\n locales.unshift({\n locale: document.locale,\n status: document.status,\n });\n\n // Build the validation errors for each locale.\n const allDocuments = [document, ...localizations];\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 [locales, errors];\n }, [document, validate]);\n\n const isBulkPublish = action === 'bulk-publish';\n const localesForAction = selectedRows.reduce((acc: string[], selectedRow: LocaleStatus) => {\n const isValidLocale =\n // Validation errors are irrelevant if we are trying to unpublish\n !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale);\n\n const shouldAddLocale = isBulkPublish\n ? selectedRow.status !== 'published' && isValidLocale\n : selectedRow.status !== 'draft' && isValidLocale;\n\n if (shouldAddLocale) {\n acc.push(selectedRow.locale);\n }\n\n return acc;\n }, []);\n\n // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately\n // see https://www.notion.so/strapi/Count-draft-relations-56901b492efb45ab90d42fe975b32bd8?pvs=4\n const enableDraftRelationsCount = false;\n const {\n data: draftRelationsCount = 0,\n isLoading: isDraftRelationsLoading,\n error: isDraftRelationsError,\n } = useGetManyDraftRelationCountQuery(\n {\n model,\n documentIds: [documentId!],\n locale: localesForAction,\n },\n {\n skip: !enableDraftRelationsCount || !documentId || localesForAction.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) {\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: localesForAction,\n },\n });\n\n setSelectedRows([]);\n };\n\n const unpublish = async () => {\n await unpublishManyAction({\n model,\n documentIds: [documentId],\n params: {\n ...params,\n locale: localesForAction,\n },\n });\n\n setSelectedRows([]);\n };\n\n const handleAction = async () => {\n if (draftRelationsCount > 0) {\n setIsDraftRelationConfirmationOpen(true);\n } else if (isBulkPublish) {\n await publish();\n } else {\n await unpublish();\n }\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.${isBulkPublish ? 'publish' : 'unpublish'}-title`),\n defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} Multiple Locales`,\n }),\n variant: isBulkPublish ? 'secondary' : 'danger',\n icon: isBulkPublish ? <ListPlus /> : <Cross />,\n disabled: isOnPublishedTab || canPublish.length === 0,\n position: ['panel'],\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? 'publish' : 'unpublish'}-title`),\n defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} 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 action={action ?? 'bulk-publish'}\n />\n </Table.Root>\n );\n },\n footer: () => (\n <Modal.Footer justifyContent=\"flex-end\">\n <Button\n loading={isDraftRelationsLoading}\n disabled={!hasPermission || localesForAction.length === 0}\n variant=\"default\"\n onClick={handleAction}\n >\n {formatMessage({\n id: isBulkPublish ? 'app.utils.publish' : 'app.utils.unpublish',\n defaultMessage: isBulkPublish ? 'Publish' : 'Unpublish',\n })}\n </Button>\n </Modal.Footer>\n ),\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocalePublishAction\n * -----------------------------------------------------------------------------------------------*/\nconst BulkLocalePublishAction: DocumentActionComponent = (props: ExtendedDocumentActionProps) => {\n return BulkLocaleAction({ action: 'bulk-publish', ...props });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BulkLocaleUnpublishAction\n * -----------------------------------------------------------------------------------------------*/\nconst BulkLocaleUnpublishAction: DocumentActionComponent = (props: ExtendedDocumentActionProps) => {\n return BulkLocaleAction({ action: 'bulk-unpublish', ...props });\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 {\n BulkLocalePublishAction,\n BulkLocaleUnpublishAction,\n DeleteLocaleAction,\n LocalePickerAction,\n FillFromAnotherLocaleAction,\n AITranslationStatusAction,\n};\n"],"names":["statusVariants","draft","published","modified","LocaleOption","isDraftAndPublishEnabled","locale","status","entryExists","formatMessage","useIntl","id","getTranslation","defaultMessage","bold","_jsx","b","name","_jsxs","Flex","width","gap","justifyContent","Typography","Status","display","paddingLeft","paddingRight","paddingTop","paddingBottom","size","variant","tag","fontWeight","capitalize","LocaleOptionStartIcon","entryWithLocaleExists","translationStatus","index","isAiAvailable","useAIAvailability","Plus","WarningCircle","fill","LocalePickerAction","document","meta","model","collectionType","documentId","query","setQuery","useQueryParams","hasI18n","canCreate","canRead","useI18n","data","locales","useGetLocalesQuery","currentDesiredLocale","plugins","i18n","schema","useDocument","params","jobData","useGetAILocalizationJobsByDocumentQuery","settings","useGetSettingsQuery","setValues","useForm","state","handleSelect","React","useCallback","value","nonTranslatedFields","useMemo","attributes","Object","keys","filter","field","attribute","pluginOptions","localized","sourceLocaleData","Array","isArray","availableLocales","defaultLocale","find","isDefault","existingLocales","map","loc","sourceLocaleCode","includes","code","sourceLocaleDoc","useEffect","length","dataToSet","reduce","acc","doesLocaleExist","currentLocale","undefined","documentLocalizations","localizations","allLocalizations","allCurrentLocales","getDocumentStatus","displayedLocales","label","options","some","doc","currentLocaleDoc","permissionsToCheck","window","strapi","future","isEnabled","aiLocalizations","_render","Fragment","SingleSelectOption","disabled","startIcon","draftAndPublish","Box","customizeContent","onSelect","docStatus","statuses","availableStatus","publishedAt","AITranslationStatusIcon","styled","theme","spaces","$isAISettingEnabled","colors","neutral150","neutral300","AITranslationStatusAction","isAIAvailable","isAISettingEnabled","useAILocalizationJobsPolling","statusVariant","hasAIFutureFlag","_status","message","height","aria-label","Boolean","Sparkle","tooltip","direction","padding","alignItems","enabled","Link","fontSize","NavLink","to","style","alignSelf","textAlign","FillFromAnotherLocaleAction","localeSelected","setLocaleSelected","useState","getDocument","useDocumentActions","components","l","fillFromLocale","onClose","response","cleanedData","cleanData","type","icon","Earth","dialog","title","content","_Fragment","Dialog","Body","Field","Root","Label","SingleSelect","placeholder","onChange","Footer","Button","flex","onClick","DeleteLocaleAction","navigate","useNavigate","toggleNotification","useNotification","delete","deleteAction","isLoading","canDelete","position","StyledTrash","loading","onConfirm","unableToDelete","console","error","res","pathname","replace","BulkLocaleAction","action","buildValidParams","isOnPublishedTab","canPublish","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","selectedRows","setSelectedRows","isDraftRelationConfirmationOpen","setIsDraftRelationConfirmationOpen","publishMany","publishManyAction","unpublishMany","unpublishManyAction","validate","skip","localesMetadata","skipToken","headers","rows","validationErrors","unshift","allDocuments","errors","errs","validation","isBulkPublish","localesForAction","selectedRow","isValidLocale","shouldAddLocale","push","enableDraftRelationsCount","draftRelationsCount","isDraftRelationsLoading","isDraftRelationsError","useGetManyDraftRelationCountQuery","documentIds","publish","unpublish","handleAction","onCancel","hasPermission","every","ListPlus","Cross","Table","row","onSelectedRowsChange","tableSelectedRows","BulkLocaleActionModal","footer","Modal","BulkLocalePublishAction","props","BulkLocaleUnpublishAction","Trash"],"mappings":"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"}
@@ -103,7 +103,7 @@ const CreateModal = ({ onClose })=>{
103
103
  type: 'success',
104
104
  message: formatMessage({
105
105
  id: getTranslation.getTranslation('Settings.locales.modal.create.success'),
106
- defaultMessage: 'Created locale'
106
+ defaultMessage: 'Locale successfully added'
107
107
  })
108
108
  });
109
109
  refetchPermissions();