@strapi/i18n 0.0.0-experimental.fed75ee8e64c57dbed0b670b25ef026b69baab10 → 0.0.0-next.00380841fe1b29f71fe755bb387fa1f75073621b

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 (460) hide show
  1. package/dist/admin/components/BulkLocaleActionModal.js +262 -0
  2. package/dist/admin/components/BulkLocaleActionModal.js.map +1 -0
  3. package/dist/admin/components/BulkLocaleActionModal.mjs +260 -0
  4. package/dist/admin/components/BulkLocaleActionModal.mjs.map +1 -0
  5. package/dist/admin/components/CMHeaderActions.js +911 -0
  6. package/dist/admin/components/CMHeaderActions.js.map +1 -0
  7. package/dist/admin/components/CMHeaderActions.mjs +885 -0
  8. package/dist/admin/components/CMHeaderActions.mjs.map +1 -0
  9. package/dist/admin/components/CMListViewModalsAdditionalInformation.js +69 -0
  10. package/dist/admin/components/CMListViewModalsAdditionalInformation.js.map +1 -0
  11. package/dist/admin/components/CMListViewModalsAdditionalInformation.mjs +65 -0
  12. package/dist/admin/components/CMListViewModalsAdditionalInformation.mjs.map +1 -0
  13. package/dist/admin/components/CheckboxConfirmation.js +155 -0
  14. package/dist/admin/components/CheckboxConfirmation.js.map +1 -0
  15. package/dist/admin/components/CheckboxConfirmation.mjs +134 -0
  16. package/dist/admin/components/CheckboxConfirmation.mjs.map +1 -0
  17. package/dist/admin/components/CreateLocale.js +395 -0
  18. package/dist/admin/components/CreateLocale.js.map +1 -0
  19. package/dist/admin/components/CreateLocale.mjs +369 -0
  20. package/dist/admin/components/CreateLocale.mjs.map +1 -0
  21. package/dist/admin/components/DeleteLocale.js +90 -0
  22. package/dist/admin/components/DeleteLocale.js.map +1 -0
  23. package/dist/admin/components/DeleteLocale.mjs +69 -0
  24. package/dist/admin/components/DeleteLocale.mjs.map +1 -0
  25. package/dist/admin/components/EditLocale.js +212 -0
  26. package/dist/admin/components/EditLocale.js.map +1 -0
  27. package/dist/admin/components/EditLocale.mjs +190 -0
  28. package/dist/admin/components/EditLocale.mjs.map +1 -0
  29. package/dist/admin/components/LocaleListCell.js +102 -0
  30. package/dist/admin/components/LocaleListCell.js.map +1 -0
  31. package/dist/admin/components/LocaleListCell.mjs +100 -0
  32. package/dist/admin/components/LocaleListCell.mjs.map +1 -0
  33. package/dist/admin/components/LocalePicker.js +105 -0
  34. package/dist/admin/components/LocalePicker.js.map +1 -0
  35. package/dist/admin/components/LocalePicker.mjs +84 -0
  36. package/dist/admin/components/LocalePicker.mjs.map +1 -0
  37. package/dist/admin/components/LocaleTable.js +143 -0
  38. package/dist/admin/components/LocaleTable.js.map +1 -0
  39. package/dist/admin/components/LocaleTable.mjs +122 -0
  40. package/dist/admin/components/LocaleTable.mjs.map +1 -0
  41. package/dist/admin/constants.js +37 -0
  42. package/dist/admin/constants.js.map +1 -0
  43. package/dist/admin/constants.mjs +35 -0
  44. package/dist/admin/constants.mjs.map +1 -0
  45. package/dist/admin/contentManagerHooks/editView.js +109 -0
  46. package/dist/admin/contentManagerHooks/editView.js.map +1 -0
  47. package/dist/admin/contentManagerHooks/editView.mjs +88 -0
  48. package/dist/admin/contentManagerHooks/editView.mjs.map +1 -0
  49. package/dist/admin/contentManagerHooks/listView.js +44 -0
  50. package/dist/admin/contentManagerHooks/listView.js.map +1 -0
  51. package/dist/admin/contentManagerHooks/listView.mjs +42 -0
  52. package/dist/admin/contentManagerHooks/listView.mjs.map +1 -0
  53. package/dist/admin/contentReleasesHooks/releaseDetailsView.js +20 -0
  54. package/dist/admin/contentReleasesHooks/releaseDetailsView.js.map +1 -0
  55. package/dist/admin/contentReleasesHooks/releaseDetailsView.mjs +18 -0
  56. package/dist/admin/contentReleasesHooks/releaseDetailsView.mjs.map +1 -0
  57. package/dist/admin/hooks/useAILocalizationJobsPolling.js +110 -0
  58. package/dist/admin/hooks/useAILocalizationJobsPolling.js.map +1 -0
  59. package/dist/admin/hooks/useAILocalizationJobsPolling.mjs +89 -0
  60. package/dist/admin/hooks/useAILocalizationJobsPolling.mjs.map +1 -0
  61. package/dist/admin/hooks/useI18n.js +78 -0
  62. package/dist/admin/hooks/useI18n.js.map +1 -0
  63. package/dist/admin/hooks/useI18n.mjs +57 -0
  64. package/dist/admin/hooks/useI18n.mjs.map +1 -0
  65. package/dist/admin/index.js +226 -5
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +202 -5
  68. package/dist/admin/index.mjs.map +1 -1
  69. package/dist/admin/middlewares/extendCTBAttributeInitialData.js +71 -0
  70. package/dist/admin/middlewares/extendCTBAttributeInitialData.js.map +1 -0
  71. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs +69 -0
  72. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs.map +1 -0
  73. package/dist/admin/middlewares/extendCTBInitialData.js +40 -0
  74. package/dist/admin/middlewares/extendCTBInitialData.js.map +1 -0
  75. package/dist/admin/middlewares/extendCTBInitialData.mjs +38 -0
  76. package/dist/admin/middlewares/extendCTBInitialData.mjs.map +1 -0
  77. package/dist/admin/middlewares/rbac-middleware.js +49 -0
  78. package/dist/admin/middlewares/rbac-middleware.js.map +1 -0
  79. package/dist/admin/middlewares/rbac-middleware.mjs +28 -0
  80. package/dist/admin/middlewares/rbac-middleware.mjs.map +1 -0
  81. package/dist/admin/pages/SettingsPage.js +182 -0
  82. package/dist/admin/pages/SettingsPage.js.map +1 -0
  83. package/dist/admin/pages/SettingsPage.mjs +179 -0
  84. package/dist/admin/pages/SettingsPage.mjs.map +1 -0
  85. package/dist/admin/pluginId.js +6 -0
  86. package/dist/admin/pluginId.js.map +1 -0
  87. package/dist/admin/pluginId.mjs +4 -0
  88. package/dist/admin/pluginId.mjs.map +1 -0
  89. package/dist/admin/services/aiLocalizationJobs.js +26 -0
  90. package/dist/admin/services/aiLocalizationJobs.js.map +1 -0
  91. package/dist/admin/services/aiLocalizationJobs.mjs +24 -0
  92. package/dist/admin/services/aiLocalizationJobs.mjs.map +1 -0
  93. package/dist/admin/services/api.js +15 -0
  94. package/dist/admin/services/api.js.map +1 -0
  95. package/dist/admin/services/api.mjs +13 -0
  96. package/dist/admin/services/api.mjs.map +1 -0
  97. package/dist/admin/services/locales.js +72 -0
  98. package/dist/admin/services/locales.js.map +1 -0
  99. package/dist/admin/services/locales.mjs +66 -0
  100. package/dist/admin/services/locales.mjs.map +1 -0
  101. package/dist/admin/services/relations.js +23 -0
  102. package/dist/admin/services/relations.js.map +1 -0
  103. package/dist/admin/services/relations.mjs +21 -0
  104. package/dist/admin/services/relations.mjs.map +1 -0
  105. package/dist/admin/services/settings.js +29 -0
  106. package/dist/admin/services/settings.js.map +1 -0
  107. package/dist/admin/services/settings.mjs +26 -0
  108. package/dist/admin/services/settings.mjs.map +1 -0
  109. package/dist/admin/src/components/CMHeaderActions.d.ts +19 -6
  110. package/dist/admin/src/components/LocaleListCell.d.ts +5 -4
  111. package/dist/admin/src/components/tests/CreateLocale.test.d.ts +1 -0
  112. package/dist/admin/src/components/tests/DeleteLocale.test.d.ts +1 -0
  113. package/dist/admin/src/components/tests/EditLocale.test.d.ts +1 -0
  114. package/dist/admin/src/components/tests/LocaleListCell.test.d.ts +1 -0
  115. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +1 -1
  116. package/dist/admin/src/hooks/useAILocalizationJobsPolling.d.ts +9 -0
  117. package/dist/admin/src/pages/tests/SettingsPage.test.d.ts +1 -0
  118. package/dist/admin/src/services/aiLocalizationJobs.d.ts +6 -0
  119. package/dist/admin/src/services/api.d.ts +1 -1
  120. package/dist/admin/src/services/locales.d.ts +1 -1
  121. package/dist/admin/src/services/relations.d.ts +1 -1
  122. package/dist/admin/src/services/settings.d.ts +5 -0
  123. package/dist/admin/src/utils/schemas.d.ts +642 -16
  124. package/dist/admin/tests/server.d.ts +1 -0
  125. package/dist/admin/tests/utils.d.ts +6 -0
  126. package/dist/admin/translations/de.json.js +66 -0
  127. package/dist/admin/translations/de.json.js.map +1 -0
  128. package/dist/admin/translations/de.json.mjs +64 -0
  129. package/dist/admin/translations/de.json.mjs.map +1 -0
  130. package/dist/admin/translations/dk.json.js +66 -0
  131. package/dist/admin/translations/dk.json.js.map +1 -0
  132. package/dist/admin/translations/dk.json.mjs +64 -0
  133. package/dist/admin/translations/dk.json.mjs.map +1 -0
  134. package/dist/admin/translations/en.json.js +91 -0
  135. package/dist/admin/translations/en.json.js.map +1 -0
  136. package/dist/admin/translations/en.json.mjs +89 -0
  137. package/dist/admin/translations/en.json.mjs.map +1 -0
  138. package/dist/admin/translations/es.json.js +66 -0
  139. package/dist/admin/translations/es.json.js.map +1 -0
  140. package/dist/admin/translations/es.json.mjs +64 -0
  141. package/dist/admin/translations/es.json.mjs.map +1 -0
  142. package/dist/admin/translations/fr.json.js +66 -0
  143. package/dist/admin/translations/fr.json.js.map +1 -0
  144. package/dist/admin/translations/fr.json.mjs +64 -0
  145. package/dist/admin/translations/fr.json.mjs.map +1 -0
  146. package/dist/admin/translations/ko.json.js +65 -0
  147. package/dist/admin/translations/ko.json.js.map +1 -0
  148. package/dist/admin/translations/ko.json.mjs +63 -0
  149. package/dist/admin/translations/ko.json.mjs.map +1 -0
  150. package/dist/admin/translations/pl.json.js +66 -0
  151. package/dist/admin/translations/pl.json.js.map +1 -0
  152. package/dist/admin/translations/pl.json.mjs +64 -0
  153. package/dist/admin/translations/pl.json.mjs.map +1 -0
  154. package/dist/admin/translations/ru.json.js +68 -0
  155. package/dist/admin/translations/ru.json.js.map +1 -0
  156. package/dist/admin/translations/ru.json.mjs +66 -0
  157. package/dist/admin/translations/ru.json.mjs.map +1 -0
  158. package/dist/admin/translations/tr.json.js +66 -0
  159. package/dist/admin/translations/tr.json.js.map +1 -0
  160. package/dist/admin/translations/tr.json.mjs +64 -0
  161. package/dist/admin/translations/tr.json.mjs.map +1 -0
  162. package/dist/admin/translations/uk.json.js +82 -0
  163. package/dist/admin/translations/uk.json.js.map +1 -0
  164. package/dist/admin/translations/uk.json.mjs +80 -0
  165. package/dist/admin/translations/uk.json.mjs.map +1 -0
  166. package/dist/admin/translations/zh-Hans.json.js +57 -0
  167. package/dist/admin/translations/zh-Hans.json.js.map +1 -0
  168. package/dist/admin/translations/zh-Hans.json.mjs +55 -0
  169. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  170. package/dist/admin/translations/zh.json.js +66 -0
  171. package/dist/admin/translations/zh.json.js.map +1 -0
  172. package/dist/admin/translations/zh.json.mjs +64 -0
  173. package/dist/admin/translations/zh.json.mjs.map +1 -0
  174. package/dist/admin/utils/baseQuery.js +8 -0
  175. package/dist/admin/utils/baseQuery.js.map +1 -0
  176. package/dist/admin/utils/baseQuery.mjs +6 -0
  177. package/dist/admin/utils/baseQuery.mjs.map +1 -0
  178. package/dist/admin/utils/clean.js +70 -0
  179. package/dist/admin/utils/clean.js.map +1 -0
  180. package/dist/admin/utils/clean.mjs +68 -0
  181. package/dist/admin/utils/clean.mjs.map +1 -0
  182. package/dist/admin/utils/fields.js +34 -0
  183. package/dist/admin/utils/fields.js.map +1 -0
  184. package/dist/admin/utils/fields.mjs +31 -0
  185. package/dist/admin/utils/fields.mjs.map +1 -0
  186. package/dist/admin/utils/getTranslation.js +8 -0
  187. package/dist/admin/utils/getTranslation.js.map +1 -0
  188. package/dist/admin/utils/getTranslation.mjs +6 -0
  189. package/dist/admin/utils/getTranslation.mjs.map +1 -0
  190. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  191. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  192. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  193. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  194. package/dist/admin/utils/schemas.js +74 -0
  195. package/dist/admin/utils/schemas.js.map +1 -0
  196. package/dist/admin/utils/schemas.mjs +72 -0
  197. package/dist/admin/utils/schemas.mjs.map +1 -0
  198. package/dist/admin/utils/strings.js +6 -0
  199. package/dist/admin/utils/strings.js.map +1 -0
  200. package/dist/admin/utils/strings.mjs +4 -0
  201. package/dist/admin/utils/strings.mjs.map +1 -0
  202. package/dist/server/bootstrap.js +81 -0
  203. package/dist/server/bootstrap.js.map +1 -0
  204. package/dist/server/bootstrap.mjs +79 -0
  205. package/dist/server/bootstrap.mjs.map +1 -0
  206. package/dist/server/constants/index.js +29 -0
  207. package/dist/server/constants/index.js.map +1 -0
  208. package/dist/server/constants/index.mjs +25 -0
  209. package/dist/server/constants/index.mjs.map +1 -0
  210. package/dist/server/constants/iso-locales.json.js +2427 -0
  211. package/dist/server/constants/iso-locales.json.js.map +1 -0
  212. package/dist/server/constants/iso-locales.json.mjs +2425 -0
  213. package/dist/server/constants/iso-locales.json.mjs.map +1 -0
  214. package/dist/server/content-types/index.js +10 -0
  215. package/dist/server/content-types/index.js.map +1 -0
  216. package/dist/server/content-types/index.mjs +8 -0
  217. package/dist/server/content-types/index.mjs.map +1 -0
  218. package/dist/server/content-types/locale/index.js +10 -0
  219. package/dist/server/content-types/locale/index.js.map +1 -0
  220. package/dist/server/content-types/locale/index.mjs +8 -0
  221. package/dist/server/content-types/locale/index.mjs.map +1 -0
  222. package/dist/server/content-types/locale/schema.json.js +46 -0
  223. package/dist/server/content-types/locale/schema.json.js.map +1 -0
  224. package/dist/server/content-types/locale/schema.json.mjs +38 -0
  225. package/dist/server/content-types/locale/schema.json.mjs.map +1 -0
  226. package/dist/server/controllers/ai-localization-jobs.js +47 -0
  227. package/dist/server/controllers/ai-localization-jobs.js.map +1 -0
  228. package/dist/server/controllers/ai-localization-jobs.mjs +45 -0
  229. package/dist/server/controllers/ai-localization-jobs.mjs.map +1 -0
  230. package/dist/server/controllers/content-types.js +76 -0
  231. package/dist/server/controllers/content-types.js.map +1 -0
  232. package/dist/server/controllers/content-types.mjs +74 -0
  233. package/dist/server/controllers/content-types.mjs.map +1 -0
  234. package/dist/server/controllers/index.js +18 -0
  235. package/dist/server/controllers/index.js.map +1 -0
  236. package/dist/server/controllers/index.mjs +16 -0
  237. package/dist/server/controllers/index.mjs.map +1 -0
  238. package/dist/server/controllers/iso-locales.js +13 -0
  239. package/dist/server/controllers/iso-locales.js.map +1 -0
  240. package/dist/server/controllers/iso-locales.mjs +11 -0
  241. package/dist/server/controllers/iso-locales.mjs.map +1 -0
  242. package/dist/server/controllers/locales.js +108 -0
  243. package/dist/server/controllers/locales.js.map +1 -0
  244. package/dist/server/controllers/locales.mjs +87 -0
  245. package/dist/server/controllers/locales.mjs.map +1 -0
  246. package/dist/server/controllers/settings.js +24 -0
  247. package/dist/server/controllers/settings.js.map +1 -0
  248. package/dist/server/controllers/settings.mjs +22 -0
  249. package/dist/server/controllers/settings.mjs.map +1 -0
  250. package/dist/server/controllers/validate-locale-creation.js +47 -0
  251. package/dist/server/controllers/validate-locale-creation.js.map +1 -0
  252. package/dist/server/controllers/validate-locale-creation.mjs +45 -0
  253. package/dist/server/controllers/validate-locale-creation.mjs.map +1 -0
  254. package/dist/server/domain/locale.js +11 -0
  255. package/dist/server/domain/locale.js.map +1 -0
  256. package/dist/server/domain/locale.mjs +9 -0
  257. package/dist/server/domain/locale.mjs.map +1 -0
  258. package/dist/server/graphql.js +115 -0
  259. package/dist/server/graphql.js.map +1 -0
  260. package/dist/server/graphql.mjs +113 -0
  261. package/dist/server/graphql.mjs.map +1 -0
  262. package/dist/server/index.js +18 -3430
  263. package/dist/server/index.js.map +1 -1
  264. package/dist/server/index.mjs +17 -3412
  265. package/dist/server/index.mjs.map +1 -1
  266. package/dist/server/models/ai-localization-job.js +60 -0
  267. package/dist/server/models/ai-localization-job.js.map +1 -0
  268. package/dist/server/models/ai-localization-job.mjs +57 -0
  269. package/dist/server/models/ai-localization-job.mjs.map +1 -0
  270. package/dist/server/register.js +81 -0
  271. package/dist/server/register.js.map +1 -0
  272. package/dist/server/register.mjs +79 -0
  273. package/dist/server/register.mjs.map +1 -0
  274. package/dist/server/routes/admin.js +142 -0
  275. package/dist/server/routes/admin.js.map +1 -0
  276. package/dist/server/routes/admin.mjs +140 -0
  277. package/dist/server/routes/admin.mjs.map +1 -0
  278. package/dist/server/routes/content-api.js +19 -0
  279. package/dist/server/routes/content-api.js.map +1 -0
  280. package/dist/server/routes/content-api.mjs +17 -0
  281. package/dist/server/routes/content-api.mjs.map +1 -0
  282. package/dist/server/routes/index.js +12 -0
  283. package/dist/server/routes/index.js.map +1 -0
  284. package/dist/server/routes/index.mjs +10 -0
  285. package/dist/server/routes/index.mjs.map +1 -0
  286. package/dist/server/routes/validation/locale.js +57 -0
  287. package/dist/server/routes/validation/locale.js.map +1 -0
  288. package/dist/server/routes/validation/locale.mjs +36 -0
  289. package/dist/server/routes/validation/locale.mjs.map +1 -0
  290. package/dist/server/services/ai-localization-jobs.js +64 -0
  291. package/dist/server/services/ai-localization-jobs.js.map +1 -0
  292. package/dist/server/services/ai-localization-jobs.mjs +62 -0
  293. package/dist/server/services/ai-localization-jobs.mjs.map +1 -0
  294. package/dist/server/services/ai-localizations.js +272 -0
  295. package/dist/server/services/ai-localizations.js.map +1 -0
  296. package/dist/server/services/ai-localizations.mjs +270 -0
  297. package/dist/server/services/ai-localizations.mjs.map +1 -0
  298. package/dist/server/services/content-types.js +157 -0
  299. package/dist/server/services/content-types.js.map +1 -0
  300. package/dist/server/services/content-types.mjs +155 -0
  301. package/dist/server/services/content-types.mjs.map +1 -0
  302. package/dist/server/services/index.js +28 -0
  303. package/dist/server/services/index.js.map +1 -0
  304. package/dist/server/services/index.mjs +26 -0
  305. package/dist/server/services/index.mjs.map +1 -0
  306. package/dist/server/services/iso-locales.js +12 -0
  307. package/dist/server/services/iso-locales.js.map +1 -0
  308. package/dist/server/services/iso-locales.mjs +10 -0
  309. package/dist/server/services/iso-locales.mjs.map +1 -0
  310. package/dist/server/services/locales.js +114 -0
  311. package/dist/server/services/locales.js.map +1 -0
  312. package/dist/server/services/locales.mjs +112 -0
  313. package/dist/server/services/locales.mjs.map +1 -0
  314. package/dist/server/services/localizations.js +68 -0
  315. package/dist/server/services/localizations.js.map +1 -0
  316. package/dist/server/services/localizations.mjs +66 -0
  317. package/dist/server/services/localizations.mjs.map +1 -0
  318. package/dist/server/services/metrics.js +30 -0
  319. package/dist/server/services/metrics.js.map +1 -0
  320. package/dist/server/services/metrics.mjs +28 -0
  321. package/dist/server/services/metrics.mjs.map +1 -0
  322. package/dist/server/services/permissions/actions.js +136 -0
  323. package/dist/server/services/permissions/actions.js.map +1 -0
  324. package/dist/server/services/permissions/actions.mjs +134 -0
  325. package/dist/server/services/permissions/actions.mjs.map +1 -0
  326. package/dist/server/services/permissions/engine.js +52 -0
  327. package/dist/server/services/permissions/engine.js.map +1 -0
  328. package/dist/server/services/permissions/engine.mjs +50 -0
  329. package/dist/server/services/permissions/engine.mjs.map +1 -0
  330. package/dist/server/services/permissions/sections-builder.js +45 -0
  331. package/dist/server/services/permissions/sections-builder.js.map +1 -0
  332. package/dist/server/services/permissions/sections-builder.mjs +43 -0
  333. package/dist/server/services/permissions/sections-builder.mjs.map +1 -0
  334. package/dist/server/services/permissions.js +14 -0
  335. package/dist/server/services/permissions.js.map +1 -0
  336. package/dist/server/services/permissions.mjs +12 -0
  337. package/dist/server/services/permissions.mjs.map +1 -0
  338. package/dist/server/services/sanitize/index.js +34 -0
  339. package/dist/server/services/sanitize/index.js.map +1 -0
  340. package/dist/server/services/sanitize/index.mjs +32 -0
  341. package/dist/server/services/sanitize/index.mjs.map +1 -0
  342. package/dist/server/services/settings.js +25 -0
  343. package/dist/server/services/settings.js.map +1 -0
  344. package/dist/server/services/settings.mjs +23 -0
  345. package/dist/server/services/settings.mjs.map +1 -0
  346. package/dist/server/src/bootstrap.d.ts.map +1 -1
  347. package/dist/server/src/controllers/ai-localization-jobs.d.ts +17 -0
  348. package/dist/server/src/controllers/ai-localization-jobs.d.ts.map +1 -0
  349. package/dist/server/src/controllers/index.d.ts +10 -0
  350. package/dist/server/src/controllers/index.d.ts.map +1 -1
  351. package/dist/server/src/controllers/settings.d.ts +7 -0
  352. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  353. package/dist/server/src/index.d.ts +53 -8
  354. package/dist/server/src/index.d.ts.map +1 -1
  355. package/dist/server/src/models/ai-localization-job.d.ts +5 -0
  356. package/dist/server/src/models/ai-localization-job.d.ts.map +1 -0
  357. package/dist/server/src/models/index.d.ts +5 -0
  358. package/dist/server/src/models/index.d.ts.map +1 -0
  359. package/dist/server/src/register.d.ts +1 -1
  360. package/dist/server/src/register.d.ts.map +1 -1
  361. package/dist/server/src/routes/admin.d.ts.map +1 -1
  362. package/dist/server/src/routes/content-api.d.ts +5 -8
  363. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  364. package/dist/server/src/routes/index.d.ts +3 -7
  365. package/dist/server/src/routes/index.d.ts.map +1 -1
  366. package/dist/server/src/routes/validation/index.d.ts +2 -0
  367. package/dist/server/src/routes/validation/index.d.ts.map +1 -0
  368. package/dist/server/src/routes/validation/locale.d.ts +41 -0
  369. package/dist/server/src/routes/validation/locale.d.ts.map +1 -0
  370. package/dist/server/src/services/ai-localization-jobs.d.ts +26 -0
  371. package/dist/server/src/services/ai-localization-jobs.d.ts.map +1 -0
  372. package/dist/server/src/services/ai-localizations.d.ts +18 -0
  373. package/dist/server/src/services/ai-localizations.d.ts.map +1 -0
  374. package/dist/server/src/services/index.d.ts +39 -0
  375. package/dist/server/src/services/index.d.ts.map +1 -1
  376. package/dist/server/src/services/localizations.d.ts +1 -1
  377. package/dist/server/src/services/localizations.d.ts.map +1 -1
  378. package/dist/server/src/services/sanitize/index.d.ts +11 -0
  379. package/dist/server/src/services/sanitize/index.d.ts.map +1 -0
  380. package/dist/server/src/services/settings.d.ts +13 -0
  381. package/dist/server/src/services/settings.d.ts.map +1 -0
  382. package/dist/server/src/utils/index.d.ts +9 -1
  383. package/dist/server/src/utils/index.d.ts.map +1 -1
  384. package/dist/server/src/validation/settings.d.ts +12 -0
  385. package/dist/server/src/validation/settings.d.ts.map +1 -0
  386. package/dist/server/utils/index.js +16 -0
  387. package/dist/server/utils/index.js.map +1 -0
  388. package/dist/server/utils/index.mjs +13 -0
  389. package/dist/server/utils/index.mjs.map +1 -0
  390. package/dist/server/validation/content-types.js +18 -0
  391. package/dist/server/validation/content-types.js.map +1 -0
  392. package/dist/server/validation/content-types.mjs +16 -0
  393. package/dist/server/validation/content-types.mjs.map +1 -0
  394. package/dist/server/validation/locales.js +23 -0
  395. package/dist/server/validation/locales.js.map +1 -0
  396. package/dist/server/validation/locales.mjs +20 -0
  397. package/dist/server/validation/locales.mjs.map +1 -0
  398. package/dist/server/validation/settings.js +11 -0
  399. package/dist/server/validation/settings.js.map +1 -0
  400. package/dist/server/validation/settings.mjs +9 -0
  401. package/dist/server/validation/settings.mjs.map +1 -0
  402. package/dist/shared/contracts/ai-localization-jobs.d.ts +27 -0
  403. package/dist/shared/contracts/ai-localization-jobs.d.ts.map +1 -0
  404. package/dist/shared/contracts/content-manager.d.ts +1 -1
  405. package/dist/shared/contracts/settings.d.ts +40 -0
  406. package/dist/shared/contracts/shared.d.ts +1 -1
  407. package/dist/shared/contracts/shared.d.ts.map +1 -0
  408. package/package.json +22 -17
  409. package/dist/_chunks/SettingsPage-DbRFoF_H.mjs +0 -554
  410. package/dist/_chunks/SettingsPage-DbRFoF_H.mjs.map +0 -1
  411. package/dist/_chunks/SettingsPage-uGJv15wR.js +0 -574
  412. package/dist/_chunks/SettingsPage-uGJv15wR.js.map +0 -1
  413. package/dist/_chunks/de-9eCAqqrB.mjs +0 -66
  414. package/dist/_chunks/de-9eCAqqrB.mjs.map +0 -1
  415. package/dist/_chunks/de-DtWiGdHl.js +0 -66
  416. package/dist/_chunks/de-DtWiGdHl.js.map +0 -1
  417. package/dist/_chunks/dk-2qBjxt-P.mjs +0 -66
  418. package/dist/_chunks/dk-2qBjxt-P.mjs.map +0 -1
  419. package/dist/_chunks/dk-D8C-casx.js +0 -66
  420. package/dist/_chunks/dk-D8C-casx.js.map +0 -1
  421. package/dist/_chunks/en-BYRZFDBV.mjs +0 -81
  422. package/dist/_chunks/en-BYRZFDBV.mjs.map +0 -1
  423. package/dist/_chunks/en-Dk9At9_Z.js +0 -81
  424. package/dist/_chunks/en-Dk9At9_Z.js.map +0 -1
  425. package/dist/_chunks/es-DS-XFGSw.js +0 -66
  426. package/dist/_chunks/es-DS-XFGSw.js.map +0 -1
  427. package/dist/_chunks/es-DlmMVaBG.mjs +0 -66
  428. package/dist/_chunks/es-DlmMVaBG.mjs.map +0 -1
  429. package/dist/_chunks/fr-3S6ke71d.mjs +0 -66
  430. package/dist/_chunks/fr-3S6ke71d.mjs.map +0 -1
  431. package/dist/_chunks/fr-BTjekDpq.js +0 -66
  432. package/dist/_chunks/fr-BTjekDpq.js.map +0 -1
  433. package/dist/_chunks/index-7_EUScSl.mjs +0 -1614
  434. package/dist/_chunks/index-7_EUScSl.mjs.map +0 -1
  435. package/dist/_chunks/index-BGtXLYX-.js +0 -1636
  436. package/dist/_chunks/index-BGtXLYX-.js.map +0 -1
  437. package/dist/_chunks/ko-DmcGUBQ3.js +0 -65
  438. package/dist/_chunks/ko-DmcGUBQ3.js.map +0 -1
  439. package/dist/_chunks/ko-qTjQ8IMw.mjs +0 -65
  440. package/dist/_chunks/ko-qTjQ8IMw.mjs.map +0 -1
  441. package/dist/_chunks/pl-B67TSHqT.mjs +0 -66
  442. package/dist/_chunks/pl-B67TSHqT.mjs.map +0 -1
  443. package/dist/_chunks/pl-Cn5RYonZ.js +0 -66
  444. package/dist/_chunks/pl-Cn5RYonZ.js.map +0 -1
  445. package/dist/_chunks/ru-BMBgVL3s.js +0 -68
  446. package/dist/_chunks/ru-BMBgVL3s.js.map +0 -1
  447. package/dist/_chunks/ru-hagMa57T.mjs +0 -68
  448. package/dist/_chunks/ru-hagMa57T.mjs.map +0 -1
  449. package/dist/_chunks/tr-CarUU76c.js +0 -66
  450. package/dist/_chunks/tr-CarUU76c.js.map +0 -1
  451. package/dist/_chunks/tr-Dw_jmkG-.mjs +0 -66
  452. package/dist/_chunks/tr-Dw_jmkG-.mjs.map +0 -1
  453. package/dist/_chunks/zh-57YM4amO.mjs +0 -66
  454. package/dist/_chunks/zh-57YM4amO.mjs.map +0 -1
  455. package/dist/_chunks/zh-CukOviB0.js +0 -66
  456. package/dist/_chunks/zh-CukOviB0.js.map +0 -1
  457. package/dist/_chunks/zh-Hans-DSHIXAa3.js +0 -57
  458. package/dist/_chunks/zh-Hans-DSHIXAa3.js.map +0 -1
  459. package/dist/_chunks/zh-Hans-Dyc-aR-h.mjs +0 -57
  460. package/dist/_chunks/zh-Hans-Dyc-aR-h.mjs.map +0 -1
@@ -0,0 +1,885 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { skipToken } from '@reduxjs/toolkit/query';
4
+ import { useQueryParams, useForm, useNotification, useAPIErrorHandler, Table } from '@strapi/admin/strapi-admin';
5
+ import { useAIAvailability } from '@strapi/admin/strapi-admin/ee';
6
+ import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from '@strapi/content-manager/strapi-admin';
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';
9
+ import { useIntl } from 'react-intl';
10
+ import { NavLink, useNavigate } from 'react-router-dom';
11
+ import { styled } from 'styled-components';
12
+ import { useAILocalizationJobsPolling } from '../hooks/useAILocalizationJobsPolling.mjs';
13
+ import { useI18n } from '../hooks/useI18n.mjs';
14
+ import { useGetAILocalizationJobsByDocumentQuery } from '../services/aiLocalizationJobs.mjs';
15
+ import { useGetLocalesQuery } from '../services/locales.mjs';
16
+ import { useGetManyDraftRelationCountQuery } from '../services/relations.mjs';
17
+ import { useGetSettingsQuery } from '../services/settings.mjs';
18
+ import { cleanData } from '../utils/clean.mjs';
19
+ import { getTranslation } from '../utils/getTranslation.mjs';
20
+ import { capitalize } from '../utils/strings.mjs';
21
+ import { BulkLocaleActionModal } from './BulkLocaleActionModal.mjs';
22
+
23
+ const statusVariants = {
24
+ draft: 'secondary',
25
+ published: 'success',
26
+ modified: 'alternative'
27
+ };
28
+ const LocaleOption = ({ isDraftAndPublishEnabled, locale, status, entryExists })=>{
29
+ const { formatMessage } = useIntl();
30
+ if (!entryExists) {
31
+ return formatMessage({
32
+ id: getTranslation('CMEditViewLocalePicker.locale.create'),
33
+ defaultMessage: 'Create <bold>{locale}</bold> locale'
34
+ }, {
35
+ bold: (locale)=>/*#__PURE__*/ jsx("b", {
36
+ children: locale
37
+ }),
38
+ locale: locale.name
39
+ });
40
+ }
41
+ return /*#__PURE__*/ jsxs(Flex, {
42
+ width: "100%",
43
+ gap: 1,
44
+ justifyContent: "space-between",
45
+ children: [
46
+ /*#__PURE__*/ jsx(Typography, {
47
+ children: locale.name
48
+ }),
49
+ isDraftAndPublishEnabled ? /*#__PURE__*/ jsx(Status, {
50
+ display: "flex",
51
+ paddingLeft: "6px",
52
+ paddingRight: "6px",
53
+ paddingTop: "2px",
54
+ paddingBottom: "2px",
55
+ size: "S",
56
+ variant: statusVariants[status],
57
+ children: /*#__PURE__*/ jsx(Typography, {
58
+ tag: "span",
59
+ variant: "pi",
60
+ fontWeight: "bold",
61
+ children: capitalize(status)
62
+ })
63
+ }) : null
64
+ ]
65
+ });
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
+ };
79
+ const LocalePickerAction = ({ document, meta, model, collectionType, documentId })=>{
80
+ const { formatMessage } = useIntl();
81
+ const [{ query }, setQuery] = useQueryParams();
82
+ const { hasI18n, canCreate, canRead } = useI18n();
83
+ const { data: locales = [] } = useGetLocalesQuery();
84
+ const currentDesiredLocale = query.plugins?.i18n?.locale;
85
+ const { schema } = unstable_useDocument({
86
+ model,
87
+ collectionType,
88
+ documentId,
89
+ params: {
90
+ locale: currentDesiredLocale
91
+ }
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 handleSelect = React.useCallback((value)=>{
101
+ setQuery({
102
+ plugins: {
103
+ ...query.plugins,
104
+ i18n: {
105
+ locale: value
106
+ }
107
+ }
108
+ });
109
+ }, [
110
+ query.plugins,
111
+ setQuery
112
+ ]);
113
+ React.useEffect(()=>{
114
+ if (!Array.isArray(locales) || !hasI18n) {
115
+ return;
116
+ }
117
+ /**
118
+ * Handle the case where the current locale query param doesn't exist
119
+ * in the list of available locales, so we redirect to the default locale.
120
+ */ const doesLocaleExist = locales.find((loc)=>loc.code === currentDesiredLocale);
121
+ const defaultLocale = locales.find((locale)=>locale.isDefault);
122
+ if (!doesLocaleExist && defaultLocale?.code) {
123
+ handleSelect(defaultLocale.code);
124
+ }
125
+ }, [
126
+ handleSelect,
127
+ hasI18n,
128
+ locales,
129
+ currentDesiredLocale
130
+ ]);
131
+ const currentLocale = Array.isArray(locales) ? locales.find((locale)=>locale.code === currentDesiredLocale) : undefined;
132
+ // Use meta.availableLocales instead of document.localizations
133
+ // meta.availableLocales contains all locales for the document, even when creating new locales
134
+ const availableLocales = meta?.availableLocales ?? [];
135
+ const documentLocalizations = document?.localizations ?? [];
136
+ // Prefer meta.availableLocales as it's more reliable, fallback to document.localizations
137
+ const allLocalizations = availableLocales.length > 0 ? availableLocales : documentLocalizations;
138
+ const allCurrentLocales = [
139
+ {
140
+ status: getDocumentStatus(document, meta),
141
+ locale: currentLocale?.code
142
+ },
143
+ ...allLocalizations
144
+ ];
145
+ if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
146
+ return null;
147
+ }
148
+ const displayedLocales = locales.filter((locale)=>{
149
+ /**
150
+ * If you can read we allow you to see the locale exists
151
+ * otherwise the locale is hidden.
152
+ */ return canRead.includes(locale.code);
153
+ });
154
+ return {
155
+ label: formatMessage({
156
+ id: getTranslation('Settings.locales.modal.locales.label'),
157
+ defaultMessage: 'Locales'
158
+ }),
159
+ options: displayedLocales.map((locale, index)=>{
160
+ const entryWithLocaleExists = allCurrentLocales.some((doc)=>doc.locale === locale.code);
161
+ const currentLocaleDoc = allCurrentLocales.find((doc)=>'locale' in doc ? doc.locale === locale.code : false);
162
+ const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
163
+ if (window.strapi.future.isEnabled('unstableAILocalizations') && isAiAvailable && settings?.data?.aiLocalizations) {
164
+ return {
165
+ _render: ()=>/*#__PURE__*/ jsxs(React.Fragment, {
166
+ children: [
167
+ /*#__PURE__*/ jsx(SingleSelectOption, {
168
+ disabled: !permissionsToCheck.includes(locale.code),
169
+ startIcon: /*#__PURE__*/ jsx(LocaleOptionStartIcon, {
170
+ entryWithLocaleExists: entryWithLocaleExists,
171
+ translationStatus: jobData?.data?.status,
172
+ index: index
173
+ }),
174
+ value: locale.code,
175
+ children: /*#__PURE__*/ jsx(LocaleOption, {
176
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
177
+ locale: locale,
178
+ status: currentLocaleDoc?.status,
179
+ entryExists: entryWithLocaleExists
180
+ })
181
+ }, locale.code),
182
+ index === 0 && /*#__PURE__*/ jsx(Box, {
183
+ paddingRight: 4,
184
+ paddingLeft: 4,
185
+ paddingTop: 2,
186
+ paddingBottom: 2,
187
+ children: /*#__PURE__*/ jsx(Typography, {
188
+ variant: "sigma",
189
+ children: formatMessage({
190
+ id: getTranslation('CMEditViewLocalePicker.locale.ai-translations'),
191
+ defaultMessage: 'AI Translations'
192
+ })
193
+ })
194
+ })
195
+ ]
196
+ }, index)
197
+ };
198
+ }
199
+ return {
200
+ disabled: !permissionsToCheck.includes(locale.code),
201
+ value: locale.code,
202
+ label: /*#__PURE__*/ jsx(LocaleOption, {
203
+ isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
204
+ locale: locale,
205
+ status: currentLocaleDoc?.status,
206
+ entryExists: entryWithLocaleExists,
207
+ translationStatus: jobData?.data?.status
208
+ }),
209
+ startIcon: /*#__PURE__*/ jsx(LocaleOptionStartIcon, {
210
+ entryWithLocaleExists: entryWithLocaleExists
211
+ })
212
+ };
213
+ }),
214
+ customizeContent: ()=>currentLocale?.name,
215
+ onSelect: handleSelect,
216
+ value: currentLocale
217
+ };
218
+ };
219
+ const getDocumentStatus = (document, meta)=>{
220
+ const docStatus = document?.status;
221
+ const statuses = meta?.availableStatus ?? [];
222
+ /**
223
+ * Creating an entry
224
+ */ if (!docStatus) {
225
+ return 'draft';
226
+ }
227
+ /**
228
+ * We're viewing a draft, but the document could have a published version
229
+ */ if (docStatus === 'draft' && statuses.find((doc)=>doc.publishedAt !== null)) {
230
+ return 'published';
231
+ }
232
+ return docStatus;
233
+ };
234
+ /* -------------------------------------------------------------------------------------------------
235
+ * AISettingsStatusAction
236
+ * -----------------------------------------------------------------------------------------------*/ const AITranslationStatusIcon = styled(Status)`
237
+ display: flex;
238
+ gap: ${({ theme })=>theme.spaces[1]};
239
+ justify-content: center;
240
+ align-items: center;
241
+ height: 100%;
242
+
243
+ // Disabled state
244
+ ${({ $isAISettingEnabled, theme })=>!$isAISettingEnabled && `
245
+ background-color: ${theme.colors.neutral150};
246
+ `}
247
+
248
+ svg {
249
+ ${({ $isAISettingEnabled, theme })=>!$isAISettingEnabled && `
250
+ fill: ${theme.colors.neutral300};
251
+ `}
252
+ }
253
+ `;
254
+ const AITranslationStatusAction = ({ documentId, model, collectionType })=>{
255
+ const { formatMessage } = useIntl();
256
+ const isAIAvailable = useAIAvailability();
257
+ const { data: settings } = useGetSettingsQuery();
258
+ const isAISettingEnabled = settings?.data?.aiLocalizations;
259
+ const { hasI18n } = useI18n();
260
+ // Poll for AI localizations jobs when AI is enabled and we have a documentId
261
+ const { status } = useAILocalizationJobsPolling({
262
+ documentId,
263
+ model,
264
+ collectionType
265
+ });
266
+ const statusVariant = (()=>{
267
+ if (status === 'failed') {
268
+ return 'warning';
269
+ }
270
+ if (isAISettingEnabled) {
271
+ return 'alternative';
272
+ }
273
+ return 'neutral';
274
+ })();
275
+ // Do not display this action when i18n is not available
276
+ if (!hasI18n) {
277
+ return null;
278
+ }
279
+ // Do not display this action when AI is not available
280
+ const hasAIFutureFlag = window.strapi.future.isEnabled('unstableAILocalizations');
281
+ if (!isAIAvailable || !hasAIFutureFlag) {
282
+ return null;
283
+ }
284
+ return {
285
+ _status: {
286
+ message: /*#__PURE__*/ jsx(Box, {
287
+ height: "100%",
288
+ "aria-label": formatMessage({
289
+ id: getTranslation('CMEditViewAITranslation.status-aria-label'),
290
+ defaultMessage: 'AI Translation Status'
291
+ }),
292
+ children: /*#__PURE__*/ jsx(AITranslationStatusIcon, {
293
+ $isAISettingEnabled: Boolean(isAISettingEnabled),
294
+ variant: statusVariant,
295
+ size: "S",
296
+ children: /*#__PURE__*/ jsx(Sparkle, {})
297
+ })
298
+ }),
299
+ tooltip: /*#__PURE__*/ jsxs(Flex, {
300
+ direction: "column",
301
+ padding: 4,
302
+ alignItems: "flex-start",
303
+ width: "25rem",
304
+ children: [
305
+ /*#__PURE__*/ jsx(Typography, {
306
+ variant: "pi",
307
+ fontWeight: "600",
308
+ children: formatMessage({
309
+ id: getTranslation('CMEditViewAITranslation.status-title'),
310
+ defaultMessage: '{enabled, select, true {AI translation enabled} false {AI translation disabled} other {AI translation disabled}}'
311
+ }, {
312
+ enabled: isAISettingEnabled
313
+ })
314
+ }),
315
+ /*#__PURE__*/ jsx(Typography, {
316
+ variant: "pi",
317
+ paddingTop: 1,
318
+ paddingBottom: 3,
319
+ children: formatMessage({
320
+ id: getTranslation('CMEditViewAITranslation.status-description'),
321
+ defaultMessage: 'Our AI translates content in all locales each time you save a modification.'
322
+ })
323
+ }),
324
+ /*#__PURE__*/ jsx(Link, {
325
+ fontSize: "inherit",
326
+ tag: NavLink,
327
+ to: "/settings/internationalization",
328
+ style: {
329
+ alignSelf: 'flex-end'
330
+ },
331
+ children: /*#__PURE__*/ jsx(Typography, {
332
+ variant: "pi",
333
+ textAlign: "right",
334
+ children: formatMessage({
335
+ id: getTranslation('CMEditViewAITranslation.settings-link'),
336
+ defaultMessage: '{enabled, select, true {Disable it in settings} false {Enable it in settings} other {Enable it in settings}}'
337
+ }, {
338
+ enabled: isAISettingEnabled
339
+ })
340
+ })
341
+ })
342
+ ]
343
+ })
344
+ }
345
+ };
346
+ };
347
+ /* -------------------------------------------------------------------------------------------------
348
+ * FillFromAnotherLocaleAction
349
+ * -----------------------------------------------------------------------------------------------*/ const FillFromAnotherLocaleAction = ({ documentId, meta, model, collectionType })=>{
350
+ const { formatMessage } = useIntl();
351
+ const [{ query }] = useQueryParams();
352
+ const { hasI18n } = useI18n();
353
+ const currentDesiredLocale = query.plugins?.i18n?.locale;
354
+ const [localeSelected, setLocaleSelected] = React.useState(null);
355
+ const setValues = useForm('FillFromAnotherLocale', (state)=>state.setValues);
356
+ const { getDocument } = unstable_useDocumentActions();
357
+ const { schema, components } = unstable_useDocument({
358
+ model,
359
+ documentId,
360
+ collectionType,
361
+ params: {
362
+ locale: currentDesiredLocale
363
+ }
364
+ });
365
+ const { data: locales = [] } = useGetLocalesQuery();
366
+ const isAIAvailable = useAIAvailability();
367
+ const { data: settings } = useGetSettingsQuery();
368
+ const isAISettingEnabled = settings?.data?.aiLocalizations;
369
+ const availableLocales = Array.isArray(locales) ? locales.filter((locale)=>meta?.availableLocales.some((l)=>l.locale === locale.code)) : [];
370
+ const fillFromLocale = (onClose)=>async ()=>{
371
+ const response = await getDocument({
372
+ collectionType,
373
+ model,
374
+ documentId,
375
+ params: {
376
+ locale: localeSelected
377
+ }
378
+ });
379
+ if (!response || !schema) {
380
+ return;
381
+ }
382
+ const { data } = response;
383
+ const cleanedData = cleanData(data, schema, components);
384
+ setValues(cleanedData);
385
+ onClose();
386
+ };
387
+ if (!hasI18n) {
388
+ return null;
389
+ }
390
+ // Do not display this action when AI is available and AI translations are enabled
391
+ const hasAIFutureFlag = window.strapi.future.isEnabled('unstableAILocalizations');
392
+ if (hasAIFutureFlag && isAIAvailable && isAISettingEnabled) {
393
+ return null;
394
+ }
395
+ return {
396
+ type: 'icon',
397
+ icon: /*#__PURE__*/ jsx(Earth, {}),
398
+ disabled: availableLocales.length === 0,
399
+ label: formatMessage({
400
+ id: getTranslation('CMEditViewCopyLocale.copy-text'),
401
+ defaultMessage: 'Fill in from another locale'
402
+ }),
403
+ dialog: {
404
+ type: 'dialog',
405
+ title: formatMessage({
406
+ id: getTranslation('CMEditViewCopyLocale.dialog.title'),
407
+ defaultMessage: 'Confirmation'
408
+ }),
409
+ content: ({ onClose })=>/*#__PURE__*/ jsxs(Fragment, {
410
+ children: [
411
+ /*#__PURE__*/ jsx(Dialog.Body, {
412
+ children: /*#__PURE__*/ jsxs(Flex, {
413
+ direction: "column",
414
+ gap: 3,
415
+ children: [
416
+ /*#__PURE__*/ jsx(WarningCircle, {
417
+ width: "24px",
418
+ height: "24px",
419
+ fill: "danger600"
420
+ }),
421
+ /*#__PURE__*/ jsx(Typography, {
422
+ textAlign: "center",
423
+ children: formatMessage({
424
+ id: getTranslation('CMEditViewCopyLocale.dialog.body'),
425
+ defaultMessage: 'Your current content will be erased and filled by the content of the selected locale:'
426
+ })
427
+ }),
428
+ /*#__PURE__*/ jsxs(Field.Root, {
429
+ width: "100%",
430
+ children: [
431
+ /*#__PURE__*/ jsx(Field.Label, {
432
+ children: formatMessage({
433
+ id: getTranslation('CMEditViewCopyLocale.dialog.field.label'),
434
+ defaultMessage: 'Locale'
435
+ })
436
+ }),
437
+ /*#__PURE__*/ jsx(SingleSelect, {
438
+ value: localeSelected,
439
+ placeholder: formatMessage({
440
+ id: getTranslation('CMEditViewCopyLocale.dialog.field.placeholder'),
441
+ defaultMessage: 'Select one locale...'
442
+ }),
443
+ // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.
444
+ onChange: (value)=>setLocaleSelected(value),
445
+ children: availableLocales.map((locale)=>/*#__PURE__*/ jsx(SingleSelectOption, {
446
+ value: locale.code,
447
+ children: locale.name
448
+ }, locale.code))
449
+ })
450
+ ]
451
+ })
452
+ ]
453
+ })
454
+ }),
455
+ /*#__PURE__*/ jsx(Dialog.Footer, {
456
+ children: /*#__PURE__*/ jsxs(Flex, {
457
+ gap: 2,
458
+ width: "100%",
459
+ children: [
460
+ /*#__PURE__*/ jsx(Button, {
461
+ flex: "auto",
462
+ variant: "tertiary",
463
+ onClick: onClose,
464
+ children: formatMessage({
465
+ id: getTranslation('CMEditViewCopyLocale.cancel-text'),
466
+ defaultMessage: 'No, cancel'
467
+ })
468
+ }),
469
+ /*#__PURE__*/ jsx(Button, {
470
+ flex: "auto",
471
+ variant: "success",
472
+ onClick: fillFromLocale(onClose),
473
+ children: formatMessage({
474
+ id: getTranslation('CMEditViewCopyLocale.submit-text'),
475
+ defaultMessage: 'Yes, fill in'
476
+ })
477
+ })
478
+ ]
479
+ })
480
+ })
481
+ ]
482
+ })
483
+ }
484
+ };
485
+ };
486
+ /* -------------------------------------------------------------------------------------------------
487
+ * DeleteLocaleAction
488
+ * -----------------------------------------------------------------------------------------------*/ const DeleteLocaleAction = ({ document, documentId, model, collectionType })=>{
489
+ const { formatMessage } = useIntl();
490
+ const navigate = useNavigate();
491
+ const { toggleNotification } = useNotification();
492
+ const { delete: deleteAction, isLoading } = unstable_useDocumentActions();
493
+ const { hasI18n, canDelete } = useI18n();
494
+ // Get the current locale object, using the URL instead of document so it works while creating
495
+ const [{ query }] = useQueryParams();
496
+ const { data: locales = [] } = useGetLocalesQuery();
497
+ const currentDesiredLocale = query.plugins?.i18n?.locale;
498
+ const locale = !('error' in locales) && locales.find((loc)=>loc.code === currentDesiredLocale);
499
+ if (!hasI18n) {
500
+ return null;
501
+ }
502
+ return {
503
+ disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
504
+ position: [
505
+ 'header',
506
+ 'table-row'
507
+ ],
508
+ label: formatMessage({
509
+ id: getTranslation('actions.delete.label'),
510
+ defaultMessage: 'Delete entry ({locale})'
511
+ }, {
512
+ locale: locale && locale.name
513
+ }),
514
+ icon: /*#__PURE__*/ jsx(StyledTrash, {}),
515
+ variant: 'danger',
516
+ dialog: {
517
+ type: 'dialog',
518
+ title: formatMessage({
519
+ id: getTranslation('actions.delete.dialog.title'),
520
+ defaultMessage: 'Confirmation'
521
+ }),
522
+ content: /*#__PURE__*/ jsxs(Flex, {
523
+ direction: "column",
524
+ gap: 2,
525
+ children: [
526
+ /*#__PURE__*/ jsx(WarningCircle, {
527
+ width: "24px",
528
+ height: "24px",
529
+ fill: "danger600"
530
+ }),
531
+ /*#__PURE__*/ jsx(Typography, {
532
+ tag: "p",
533
+ variant: "omega",
534
+ textAlign: "center",
535
+ children: formatMessage({
536
+ id: getTranslation('actions.delete.dialog.body'),
537
+ defaultMessage: 'Are you sure?'
538
+ })
539
+ })
540
+ ]
541
+ }),
542
+ loading: isLoading,
543
+ onConfirm: async ()=>{
544
+ const unableToDelete = // We are unable to delete a collection type without a document ID
545
+ // & unable to delete generally if there is no document locale
546
+ collectionType !== 'single-types' && !documentId || !document?.locale;
547
+ if (unableToDelete) {
548
+ console.error("You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue.");
549
+ toggleNotification({
550
+ message: formatMessage({
551
+ id: getTranslation('actions.delete.error'),
552
+ defaultMessage: 'An error occurred while trying to delete the document locale.'
553
+ }),
554
+ type: 'danger'
555
+ });
556
+ return;
557
+ }
558
+ const res = await deleteAction({
559
+ documentId,
560
+ model,
561
+ collectionType,
562
+ params: {
563
+ locale: document.locale
564
+ }
565
+ });
566
+ if (!('error' in res)) {
567
+ navigate({
568
+ pathname: `../${collectionType}/${model}`
569
+ }, {
570
+ replace: true
571
+ });
572
+ }
573
+ }
574
+ }
575
+ };
576
+ };
577
+ /* -------------------------------------------------------------------------------------------------
578
+ * BulkLocaleAction
579
+ *
580
+ * This component is used to handle bulk publish and unpublish actions on locales.
581
+ * -----------------------------------------------------------------------------------------------*/ const BulkLocaleAction = ({ document, documentId, model, collectionType, action })=>{
582
+ const locale = document?.locale ?? null;
583
+ const [{ query }] = useQueryParams();
584
+ const params = React.useMemo(()=>buildValidParams(query), [
585
+ query
586
+ ]);
587
+ const isOnPublishedTab = query.status === 'published';
588
+ const { formatMessage } = useIntl();
589
+ const { hasI18n, canPublish } = useI18n();
590
+ const { toggleNotification } = useNotification();
591
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
592
+ const [selectedRows, setSelectedRows] = React.useState([]);
593
+ const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React.useState(false);
594
+ const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = unstable_useDocumentActions();
595
+ const { schema, validate } = unstable_useDocument({
596
+ model,
597
+ collectionType,
598
+ documentId,
599
+ params: {
600
+ locale
601
+ }
602
+ }, {
603
+ // No need to fetch the document, the data is already available in the `document` prop
604
+ skip: true
605
+ });
606
+ const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? undefined : skipToken);
607
+ const headers = [
608
+ {
609
+ label: formatMessage({
610
+ id: 'global.name',
611
+ defaultMessage: 'Name'
612
+ }),
613
+ name: 'name'
614
+ },
615
+ {
616
+ label: formatMessage({
617
+ id: getTranslation('CMEditViewBulkLocale.status'),
618
+ defaultMessage: 'Status'
619
+ }),
620
+ name: 'status'
621
+ },
622
+ {
623
+ label: formatMessage({
624
+ id: getTranslation('CMEditViewBulkLocale.publication-status'),
625
+ defaultMessage: 'Publication Status'
626
+ }),
627
+ name: 'publication-status'
628
+ }
629
+ ];
630
+ // Extract the rows for the bulk locale publish modal and any validation
631
+ // errors per locale
632
+ const [rows, validationErrors] = React.useMemo(()=>{
633
+ if (!document) {
634
+ return [
635
+ [],
636
+ {}
637
+ ];
638
+ }
639
+ const localizations = document.localizations ?? [];
640
+ // Build the rows for the bulk locale publish modal by combining the current
641
+ // document with all the available locales from the document meta
642
+ const locales = localizations.map((doc)=>{
643
+ const { locale, status } = doc;
644
+ return {
645
+ locale,
646
+ status
647
+ };
648
+ });
649
+ // Add the current document locale
650
+ locales.unshift({
651
+ locale: document.locale,
652
+ status: document.status
653
+ });
654
+ // Build the validation errors for each locale.
655
+ const allDocuments = [
656
+ document,
657
+ ...localizations
658
+ ];
659
+ const errors = allDocuments.reduce((errs, document)=>{
660
+ if (!document) {
661
+ return errs;
662
+ }
663
+ // Validate each locale entry via the useDocument validate function and store any errors in a dictionary
664
+ const validation = validate(document);
665
+ if (validation !== null) {
666
+ errs[document.locale] = validation;
667
+ }
668
+ return errs;
669
+ }, {});
670
+ return [
671
+ locales,
672
+ errors
673
+ ];
674
+ }, [
675
+ document,
676
+ validate
677
+ ]);
678
+ const isBulkPublish = action === 'bulk-publish';
679
+ const localesForAction = selectedRows.reduce((acc, selectedRow)=>{
680
+ const isValidLocale = // Validation errors are irrelevant if we are trying to unpublish
681
+ !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale);
682
+ const shouldAddLocale = isBulkPublish ? selectedRow.status !== 'published' && isValidLocale : selectedRow.status !== 'draft' && isValidLocale;
683
+ if (shouldAddLocale) {
684
+ acc.push(selectedRow.locale);
685
+ }
686
+ return acc;
687
+ }, []);
688
+ // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately
689
+ // see https://www.notion.so/strapi/Count-draft-relations-56901b492efb45ab90d42fe975b32bd8?pvs=4
690
+ const enableDraftRelationsCount = false;
691
+ const { data: draftRelationsCount = 0, isLoading: isDraftRelationsLoading, error: isDraftRelationsError } = useGetManyDraftRelationCountQuery({
692
+ model,
693
+ documentIds: [
694
+ documentId
695
+ ],
696
+ locale: localesForAction
697
+ }, {
698
+ skip: !enableDraftRelationsCount
699
+ });
700
+ React.useEffect(()=>{
701
+ if (isDraftRelationsError) {
702
+ toggleNotification({
703
+ type: 'danger',
704
+ message: formatAPIError(isDraftRelationsError)
705
+ });
706
+ }
707
+ }, [
708
+ isDraftRelationsError,
709
+ toggleNotification,
710
+ formatAPIError
711
+ ]);
712
+ if (!schema?.options?.draftAndPublish) {
713
+ return null;
714
+ }
715
+ if (!hasI18n) {
716
+ return null;
717
+ }
718
+ if (!documentId) {
719
+ return null;
720
+ }
721
+ // This document action can be enabled given that draft and publish and i18n are
722
+ // enabled and we can publish the current locale.
723
+ const publish = async ()=>{
724
+ await publishManyAction({
725
+ model,
726
+ documentIds: [
727
+ documentId
728
+ ],
729
+ params: {
730
+ ...params,
731
+ locale: localesForAction
732
+ }
733
+ });
734
+ setSelectedRows([]);
735
+ };
736
+ const unpublish = async ()=>{
737
+ await unpublishManyAction({
738
+ model,
739
+ documentIds: [
740
+ documentId
741
+ ],
742
+ params: {
743
+ ...params,
744
+ locale: localesForAction
745
+ }
746
+ });
747
+ setSelectedRows([]);
748
+ };
749
+ const handleAction = async ()=>{
750
+ if (draftRelationsCount > 0) {
751
+ setIsDraftRelationConfirmationOpen(true);
752
+ } else if (isBulkPublish) {
753
+ await publish();
754
+ } else {
755
+ await unpublish();
756
+ }
757
+ };
758
+ if (isDraftRelationConfirmationOpen) {
759
+ return {
760
+ label: formatMessage({
761
+ id: 'app.components.ConfirmDialog.title',
762
+ defaultMessage: 'Confirmation'
763
+ }),
764
+ variant: 'danger',
765
+ dialog: {
766
+ onCancel: ()=>{
767
+ setIsDraftRelationConfirmationOpen(false);
768
+ },
769
+ onConfirm: async ()=>{
770
+ await publish();
771
+ setIsDraftRelationConfirmationOpen(false);
772
+ },
773
+ type: 'dialog',
774
+ title: formatMessage({
775
+ id: getTranslation('actions.publish.dialog.title'),
776
+ defaultMessage: 'Confirmation'
777
+ }),
778
+ content: /*#__PURE__*/ jsxs(Flex, {
779
+ direction: "column",
780
+ alignItems: "center",
781
+ gap: 2,
782
+ children: [
783
+ /*#__PURE__*/ jsx(WarningCircle, {
784
+ width: "2.4rem",
785
+ height: "2.4rem",
786
+ fill: "danger600"
787
+ }),
788
+ /*#__PURE__*/ jsx(Typography, {
789
+ textAlign: "center",
790
+ children: formatMessage({
791
+ id: getTranslation('CMEditViewBulkLocale.draft-relation-warning'),
792
+ defaultMessage: 'Some locales are related to draft entries. Publishing them could leave broken links in your app.'
793
+ })
794
+ }),
795
+ /*#__PURE__*/ jsx(Typography, {
796
+ textAlign: "center",
797
+ children: formatMessage({
798
+ id: getTranslation('CMEditViewBulkLocale.continue-confirmation'),
799
+ defaultMessage: 'Are you sure you want to continue?'
800
+ })
801
+ })
802
+ ]
803
+ })
804
+ }
805
+ };
806
+ }
807
+ const hasPermission = selectedRows.map(({ locale })=>locale).every((locale)=>canPublish.includes(locale));
808
+ return {
809
+ label: formatMessage({
810
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? 'publish' : 'unpublish'}-title`),
811
+ defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} Multiple Locales`
812
+ }),
813
+ variant: isBulkPublish ? 'secondary' : 'danger',
814
+ icon: isBulkPublish ? /*#__PURE__*/ jsx(ListPlus, {}) : /*#__PURE__*/ jsx(Cross, {}),
815
+ disabled: isOnPublishedTab || canPublish.length === 0,
816
+ position: [
817
+ 'panel'
818
+ ],
819
+ dialog: {
820
+ type: 'modal',
821
+ title: formatMessage({
822
+ id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? 'publish' : 'unpublish'}-title`),
823
+ defaultMessage: `${isBulkPublish ? 'Publish' : 'Unpublish'} Multiple Locales`
824
+ }),
825
+ content: ()=>{
826
+ return /*#__PURE__*/ jsx(Table.Root, {
827
+ headers: headers,
828
+ rows: rows.map((row)=>({
829
+ ...row,
830
+ id: row.locale
831
+ })),
832
+ selectedRows: selectedRows,
833
+ onSelectedRowsChange: (tableSelectedRows)=>setSelectedRows(tableSelectedRows),
834
+ children: /*#__PURE__*/ jsx(BulkLocaleActionModal, {
835
+ validationErrors: validationErrors,
836
+ headers: headers,
837
+ rows: rows,
838
+ localesMetadata: localesMetadata,
839
+ action: action ?? 'bulk-publish'
840
+ })
841
+ });
842
+ },
843
+ footer: ()=>/*#__PURE__*/ jsx(Modal.Footer, {
844
+ justifyContent: "flex-end",
845
+ children: /*#__PURE__*/ jsx(Button, {
846
+ loading: isDraftRelationsLoading,
847
+ disabled: !hasPermission || localesForAction.length === 0,
848
+ variant: "default",
849
+ onClick: handleAction,
850
+ children: formatMessage({
851
+ id: isBulkPublish ? 'app.utils.publish' : 'app.utils.unpublish',
852
+ defaultMessage: isBulkPublish ? 'Publish' : 'Unpublish'
853
+ })
854
+ })
855
+ })
856
+ }
857
+ };
858
+ };
859
+ /* -------------------------------------------------------------------------------------------------
860
+ * BulkLocalePublishAction
861
+ * -----------------------------------------------------------------------------------------------*/ const BulkLocalePublishAction = (props)=>{
862
+ return BulkLocaleAction({
863
+ action: 'bulk-publish',
864
+ ...props
865
+ });
866
+ };
867
+ /* -------------------------------------------------------------------------------------------------
868
+ * BulkLocaleUnpublishAction
869
+ * -----------------------------------------------------------------------------------------------*/ const BulkLocaleUnpublishAction = (props)=>{
870
+ return BulkLocaleAction({
871
+ action: 'bulk-unpublish',
872
+ ...props
873
+ });
874
+ };
875
+ /**
876
+ * Because the icon system is completely broken, we have to do
877
+ * this to remove the fill from the cog.
878
+ */ const StyledTrash = styled(Trash)`
879
+ path {
880
+ fill: currentColor;
881
+ }
882
+ `;
883
+
884
+ export { AITranslationStatusAction, BulkLocalePublishAction, BulkLocaleUnpublishAction, DeleteLocaleAction, FillFromAnotherLocaleAction, LocalePickerAction };
885
+ //# sourceMappingURL=CMHeaderActions.mjs.map