@strapi/i18n 0.0.0-next.f0a0bc26f5ef0693aaea2a616bc6b816cfee54b6 → 0.0.0-next.f0bfcece1007e5aa527570187635aefc86db536e

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 (385) 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 +721 -0
  6. package/dist/admin/components/CMHeaderActions.js.map +1 -0
  7. package/dist/admin/components/CMHeaderActions.mjs +696 -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 +82 -0
  30. package/dist/admin/components/LocaleListCell.js.map +1 -0
  31. package/dist/admin/components/LocaleListCell.mjs +80 -0
  32. package/dist/admin/components/LocaleListCell.mjs.map +1 -0
  33. package/dist/admin/components/LocalePicker.js +98 -0
  34. package/dist/admin/components/LocalePicker.js.map +1 -0
  35. package/dist/admin/components/LocalePicker.mjs +77 -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 +106 -0
  46. package/dist/admin/contentManagerHooks/editView.js.map +1 -0
  47. package/dist/admin/contentManagerHooks/editView.mjs +85 -0
  48. package/dist/admin/contentManagerHooks/editView.mjs.map +1 -0
  49. package/dist/admin/contentManagerHooks/listView.js +43 -0
  50. package/dist/admin/contentManagerHooks/listView.js.map +1 -0
  51. package/dist/admin/contentManagerHooks/listView.mjs +41 -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/useI18n.js +78 -0
  58. package/dist/admin/hooks/useI18n.js.map +1 -0
  59. package/dist/admin/hooks/useI18n.mjs +57 -0
  60. package/dist/admin/hooks/useI18n.mjs.map +1 -0
  61. package/dist/admin/index.js +225 -5
  62. package/dist/admin/index.js.map +1 -1
  63. package/dist/admin/index.mjs +201 -5
  64. package/dist/admin/index.mjs.map +1 -1
  65. package/dist/admin/middlewares/extendCTBAttributeInitialData.js +71 -0
  66. package/dist/admin/middlewares/extendCTBAttributeInitialData.js.map +1 -0
  67. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs +69 -0
  68. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs.map +1 -0
  69. package/dist/admin/middlewares/extendCTBInitialData.js +40 -0
  70. package/dist/admin/middlewares/extendCTBInitialData.js.map +1 -0
  71. package/dist/admin/middlewares/extendCTBInitialData.mjs +38 -0
  72. package/dist/admin/middlewares/extendCTBInitialData.mjs.map +1 -0
  73. package/dist/admin/middlewares/rbac-middleware.js +49 -0
  74. package/dist/admin/middlewares/rbac-middleware.js.map +1 -0
  75. package/dist/admin/middlewares/rbac-middleware.mjs +28 -0
  76. package/dist/admin/middlewares/rbac-middleware.mjs.map +1 -0
  77. package/dist/admin/pages/SettingsPage.js +107 -0
  78. package/dist/admin/pages/SettingsPage.js.map +1 -0
  79. package/dist/admin/pages/SettingsPage.mjs +85 -0
  80. package/dist/admin/pages/SettingsPage.mjs.map +1 -0
  81. package/dist/admin/pluginId.js +6 -0
  82. package/dist/admin/pluginId.js.map +1 -0
  83. package/dist/admin/pluginId.mjs +4 -0
  84. package/dist/admin/pluginId.mjs.map +1 -0
  85. package/dist/admin/services/api.js +13 -0
  86. package/dist/admin/services/api.js.map +1 -0
  87. package/dist/admin/services/api.mjs +11 -0
  88. package/dist/admin/services/api.mjs.map +1 -0
  89. package/dist/admin/services/locales.js +72 -0
  90. package/dist/admin/services/locales.js.map +1 -0
  91. package/dist/admin/services/locales.mjs +66 -0
  92. package/dist/admin/services/locales.mjs.map +1 -0
  93. package/dist/admin/services/relations.js +23 -0
  94. package/dist/admin/services/relations.js.map +1 -0
  95. package/dist/admin/services/relations.mjs +21 -0
  96. package/dist/admin/services/relations.mjs.map +1 -0
  97. package/dist/admin/src/components/CMHeaderActions.d.ts +1 -1
  98. package/dist/admin/src/components/LocaleListCell.d.ts +4 -4
  99. package/dist/admin/src/components/tests/CreateLocale.test.d.ts +1 -0
  100. package/dist/admin/src/components/tests/DeleteLocale.test.d.ts +1 -0
  101. package/dist/admin/src/components/tests/EditLocale.test.d.ts +1 -0
  102. package/dist/admin/src/components/tests/LocaleListCell.test.d.ts +1 -0
  103. package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +1 -1
  104. package/dist/admin/src/pages/tests/SettingsPage.test.d.ts +1 -0
  105. package/dist/admin/src/services/api.d.ts +1 -1
  106. package/dist/admin/src/services/locales.d.ts +1 -1
  107. package/dist/admin/src/services/relations.d.ts +1 -1
  108. package/dist/admin/src/utils/schemas.d.ts +642 -16
  109. package/dist/admin/tests/server.d.ts +1 -0
  110. package/dist/admin/tests/utils.d.ts +6 -0
  111. package/dist/admin/translations/de.json.js +66 -0
  112. package/dist/admin/translations/de.json.js.map +1 -0
  113. package/dist/admin/translations/de.json.mjs +64 -0
  114. package/dist/admin/translations/de.json.mjs.map +1 -0
  115. package/dist/admin/translations/dk.json.js +66 -0
  116. package/dist/admin/translations/dk.json.js.map +1 -0
  117. package/dist/admin/translations/dk.json.mjs +64 -0
  118. package/dist/admin/translations/dk.json.mjs.map +1 -0
  119. package/dist/admin/translations/en.json.js +81 -0
  120. package/dist/admin/translations/en.json.js.map +1 -0
  121. package/dist/admin/translations/en.json.mjs +79 -0
  122. package/dist/admin/translations/en.json.mjs.map +1 -0
  123. package/dist/admin/translations/es.json.js +66 -0
  124. package/dist/admin/translations/es.json.js.map +1 -0
  125. package/dist/admin/translations/es.json.mjs +64 -0
  126. package/dist/admin/translations/es.json.mjs.map +1 -0
  127. package/dist/admin/translations/fr.json.js +66 -0
  128. package/dist/admin/translations/fr.json.js.map +1 -0
  129. package/dist/admin/translations/fr.json.mjs +64 -0
  130. package/dist/admin/translations/fr.json.mjs.map +1 -0
  131. package/dist/admin/translations/ko.json.js +65 -0
  132. package/dist/admin/translations/ko.json.js.map +1 -0
  133. package/dist/admin/translations/ko.json.mjs +63 -0
  134. package/dist/admin/translations/ko.json.mjs.map +1 -0
  135. package/dist/admin/translations/pl.json.js +66 -0
  136. package/dist/admin/translations/pl.json.js.map +1 -0
  137. package/dist/admin/translations/pl.json.mjs +64 -0
  138. package/dist/admin/translations/pl.json.mjs.map +1 -0
  139. package/dist/admin/translations/ru.json.js +68 -0
  140. package/dist/admin/translations/ru.json.js.map +1 -0
  141. package/dist/admin/translations/ru.json.mjs +66 -0
  142. package/dist/admin/translations/ru.json.mjs.map +1 -0
  143. package/dist/admin/translations/tr.json.js +66 -0
  144. package/dist/admin/translations/tr.json.js.map +1 -0
  145. package/dist/admin/translations/tr.json.mjs +64 -0
  146. package/dist/admin/translations/tr.json.mjs.map +1 -0
  147. package/dist/admin/translations/uk.json.js +82 -0
  148. package/dist/admin/translations/uk.json.js.map +1 -0
  149. package/dist/admin/translations/uk.json.mjs +80 -0
  150. package/dist/admin/translations/uk.json.mjs.map +1 -0
  151. package/dist/admin/translations/zh-Hans.json.js +57 -0
  152. package/dist/admin/translations/zh-Hans.json.js.map +1 -0
  153. package/dist/admin/translations/zh-Hans.json.mjs +55 -0
  154. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  155. package/dist/admin/translations/zh.json.js +66 -0
  156. package/dist/admin/translations/zh.json.js.map +1 -0
  157. package/dist/admin/translations/zh.json.mjs +64 -0
  158. package/dist/admin/translations/zh.json.mjs.map +1 -0
  159. package/dist/admin/utils/baseQuery.js +8 -0
  160. package/dist/admin/utils/baseQuery.js.map +1 -0
  161. package/dist/admin/utils/baseQuery.mjs +6 -0
  162. package/dist/admin/utils/baseQuery.mjs.map +1 -0
  163. package/dist/admin/utils/clean.js +70 -0
  164. package/dist/admin/utils/clean.js.map +1 -0
  165. package/dist/admin/utils/clean.mjs +68 -0
  166. package/dist/admin/utils/clean.mjs.map +1 -0
  167. package/dist/admin/utils/fields.js +34 -0
  168. package/dist/admin/utils/fields.js.map +1 -0
  169. package/dist/admin/utils/fields.mjs +31 -0
  170. package/dist/admin/utils/fields.mjs.map +1 -0
  171. package/dist/admin/utils/getTranslation.js +8 -0
  172. package/dist/admin/utils/getTranslation.js.map +1 -0
  173. package/dist/admin/utils/getTranslation.mjs +6 -0
  174. package/dist/admin/utils/getTranslation.mjs.map +1 -0
  175. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  176. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  177. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  178. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  179. package/dist/admin/utils/schemas.js +74 -0
  180. package/dist/admin/utils/schemas.js.map +1 -0
  181. package/dist/admin/utils/schemas.mjs +72 -0
  182. package/dist/admin/utils/schemas.mjs.map +1 -0
  183. package/dist/admin/utils/strings.js +6 -0
  184. package/dist/admin/utils/strings.js.map +1 -0
  185. package/dist/admin/utils/strings.mjs +4 -0
  186. package/dist/admin/utils/strings.mjs.map +1 -0
  187. package/dist/server/bootstrap.js +79 -0
  188. package/dist/server/bootstrap.js.map +1 -0
  189. package/dist/server/bootstrap.mjs +77 -0
  190. package/dist/server/bootstrap.mjs.map +1 -0
  191. package/dist/server/constants/index.js +29 -0
  192. package/dist/server/constants/index.js.map +1 -0
  193. package/dist/server/constants/index.mjs +25 -0
  194. package/dist/server/constants/index.mjs.map +1 -0
  195. package/dist/server/constants/iso-locales.json.js +2423 -0
  196. package/dist/server/constants/iso-locales.json.js.map +1 -0
  197. package/dist/server/constants/iso-locales.json.mjs +2421 -0
  198. package/dist/server/constants/iso-locales.json.mjs.map +1 -0
  199. package/dist/server/content-types/index.js +10 -0
  200. package/dist/server/content-types/index.js.map +1 -0
  201. package/dist/server/content-types/index.mjs +8 -0
  202. package/dist/server/content-types/index.mjs.map +1 -0
  203. package/dist/server/content-types/locale/index.js +10 -0
  204. package/dist/server/content-types/locale/index.js.map +1 -0
  205. package/dist/server/content-types/locale/index.mjs +8 -0
  206. package/dist/server/content-types/locale/index.mjs.map +1 -0
  207. package/dist/server/content-types/locale/schema.json.js +46 -0
  208. package/dist/server/content-types/locale/schema.json.js.map +1 -0
  209. package/dist/server/content-types/locale/schema.json.mjs +38 -0
  210. package/dist/server/content-types/locale/schema.json.mjs.map +1 -0
  211. package/dist/server/controllers/content-types.js +76 -0
  212. package/dist/server/controllers/content-types.js.map +1 -0
  213. package/dist/server/controllers/content-types.mjs +74 -0
  214. package/dist/server/controllers/content-types.mjs.map +1 -0
  215. package/dist/server/controllers/index.js +14 -0
  216. package/dist/server/controllers/index.js.map +1 -0
  217. package/dist/server/controllers/index.mjs +12 -0
  218. package/dist/server/controllers/index.mjs.map +1 -0
  219. package/dist/server/controllers/iso-locales.js +13 -0
  220. package/dist/server/controllers/iso-locales.js.map +1 -0
  221. package/dist/server/controllers/iso-locales.mjs +11 -0
  222. package/dist/server/controllers/iso-locales.mjs.map +1 -0
  223. package/dist/server/controllers/locales.js +108 -0
  224. package/dist/server/controllers/locales.js.map +1 -0
  225. package/dist/server/controllers/locales.mjs +87 -0
  226. package/dist/server/controllers/locales.mjs.map +1 -0
  227. package/dist/server/controllers/validate-locale-creation.js +47 -0
  228. package/dist/server/controllers/validate-locale-creation.js.map +1 -0
  229. package/dist/server/controllers/validate-locale-creation.mjs +45 -0
  230. package/dist/server/controllers/validate-locale-creation.mjs.map +1 -0
  231. package/dist/server/domain/locale.js +11 -0
  232. package/dist/server/domain/locale.js.map +1 -0
  233. package/dist/server/domain/locale.mjs +9 -0
  234. package/dist/server/domain/locale.mjs.map +1 -0
  235. package/dist/server/graphql.js +115 -0
  236. package/dist/server/graphql.js.map +1 -0
  237. package/dist/server/graphql.mjs +113 -0
  238. package/dist/server/graphql.mjs.map +1 -0
  239. package/dist/server/index.js +18 -3453
  240. package/dist/server/index.js.map +1 -1
  241. package/dist/server/index.mjs +17 -3435
  242. package/dist/server/index.mjs.map +1 -1
  243. package/dist/server/register.js +79 -0
  244. package/dist/server/register.js.map +1 -0
  245. package/dist/server/register.mjs +77 -0
  246. package/dist/server/register.mjs.map +1 -0
  247. package/dist/server/routes/admin.js +102 -0
  248. package/dist/server/routes/admin.js.map +1 -0
  249. package/dist/server/routes/admin.mjs +100 -0
  250. package/dist/server/routes/admin.mjs.map +1 -0
  251. package/dist/server/routes/content-api.js +19 -0
  252. package/dist/server/routes/content-api.js.map +1 -0
  253. package/dist/server/routes/content-api.mjs +17 -0
  254. package/dist/server/routes/content-api.mjs.map +1 -0
  255. package/dist/server/routes/index.js +12 -0
  256. package/dist/server/routes/index.js.map +1 -0
  257. package/dist/server/routes/index.mjs +10 -0
  258. package/dist/server/routes/index.mjs.map +1 -0
  259. package/dist/server/routes/validation/locale.js +57 -0
  260. package/dist/server/routes/validation/locale.js.map +1 -0
  261. package/dist/server/routes/validation/locale.mjs +36 -0
  262. package/dist/server/routes/validation/locale.mjs.map +1 -0
  263. package/dist/server/services/content-types.js +157 -0
  264. package/dist/server/services/content-types.js.map +1 -0
  265. package/dist/server/services/content-types.mjs +155 -0
  266. package/dist/server/services/content-types.mjs.map +1 -0
  267. package/dist/server/services/index.js +22 -0
  268. package/dist/server/services/index.js.map +1 -0
  269. package/dist/server/services/index.mjs +20 -0
  270. package/dist/server/services/index.mjs.map +1 -0
  271. package/dist/server/services/iso-locales.js +12 -0
  272. package/dist/server/services/iso-locales.js.map +1 -0
  273. package/dist/server/services/iso-locales.mjs +10 -0
  274. package/dist/server/services/iso-locales.mjs.map +1 -0
  275. package/dist/server/services/locales.js +114 -0
  276. package/dist/server/services/locales.js.map +1 -0
  277. package/dist/server/services/locales.mjs +112 -0
  278. package/dist/server/services/locales.mjs.map +1 -0
  279. package/dist/server/services/localizations.js +68 -0
  280. package/dist/server/services/localizations.js.map +1 -0
  281. package/dist/server/services/localizations.mjs +66 -0
  282. package/dist/server/services/localizations.mjs.map +1 -0
  283. package/dist/server/services/metrics.js +30 -0
  284. package/dist/server/services/metrics.js.map +1 -0
  285. package/dist/server/services/metrics.mjs +28 -0
  286. package/dist/server/services/metrics.mjs.map +1 -0
  287. package/dist/server/services/permissions/actions.js +136 -0
  288. package/dist/server/services/permissions/actions.js.map +1 -0
  289. package/dist/server/services/permissions/actions.mjs +134 -0
  290. package/dist/server/services/permissions/actions.mjs.map +1 -0
  291. package/dist/server/services/permissions/engine.js +52 -0
  292. package/dist/server/services/permissions/engine.js.map +1 -0
  293. package/dist/server/services/permissions/engine.mjs +50 -0
  294. package/dist/server/services/permissions/engine.mjs.map +1 -0
  295. package/dist/server/services/permissions/sections-builder.js +45 -0
  296. package/dist/server/services/permissions/sections-builder.js.map +1 -0
  297. package/dist/server/services/permissions/sections-builder.mjs +43 -0
  298. package/dist/server/services/permissions/sections-builder.mjs.map +1 -0
  299. package/dist/server/services/permissions.js +14 -0
  300. package/dist/server/services/permissions.js.map +1 -0
  301. package/dist/server/services/permissions.mjs +12 -0
  302. package/dist/server/services/permissions.mjs.map +1 -0
  303. package/dist/server/services/sanitize/index.js +34 -0
  304. package/dist/server/services/sanitize/index.js.map +1 -0
  305. package/dist/server/services/sanitize/index.mjs +32 -0
  306. package/dist/server/services/sanitize/index.mjs.map +1 -0
  307. package/dist/server/src/index.d.ts +3 -7
  308. package/dist/server/src/index.d.ts.map +1 -1
  309. package/dist/server/src/routes/content-api.d.ts +5 -8
  310. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  311. package/dist/server/src/routes/index.d.ts +3 -7
  312. package/dist/server/src/routes/index.d.ts.map +1 -1
  313. package/dist/server/src/routes/validation/index.d.ts +2 -0
  314. package/dist/server/src/routes/validation/index.d.ts.map +1 -0
  315. package/dist/server/src/routes/validation/locale.d.ts +41 -0
  316. package/dist/server/src/routes/validation/locale.d.ts.map +1 -0
  317. package/dist/server/src/services/localizations.d.ts +1 -1
  318. package/dist/server/src/services/localizations.d.ts.map +1 -1
  319. package/dist/server/utils/index.js +16 -0
  320. package/dist/server/utils/index.js.map +1 -0
  321. package/dist/server/utils/index.mjs +13 -0
  322. package/dist/server/utils/index.mjs.map +1 -0
  323. package/dist/server/validation/content-types.js +18 -0
  324. package/dist/server/validation/content-types.js.map +1 -0
  325. package/dist/server/validation/content-types.mjs +16 -0
  326. package/dist/server/validation/content-types.mjs.map +1 -0
  327. package/dist/server/validation/locales.js +23 -0
  328. package/dist/server/validation/locales.js.map +1 -0
  329. package/dist/server/validation/locales.mjs +20 -0
  330. package/dist/server/validation/locales.mjs.map +1 -0
  331. package/dist/shared/contracts/content-manager.d.ts +1 -1
  332. package/dist/shared/contracts/shared.d.ts +1 -1
  333. package/package.json +17 -14
  334. package/dist/_chunks/SettingsPage-JyA1zd8f.js +0 -574
  335. package/dist/_chunks/SettingsPage-JyA1zd8f.js.map +0 -1
  336. package/dist/_chunks/SettingsPage-giNp3Ftr.mjs +0 -554
  337. package/dist/_chunks/SettingsPage-giNp3Ftr.mjs.map +0 -1
  338. package/dist/_chunks/de-9eCAqqrB.mjs +0 -66
  339. package/dist/_chunks/de-9eCAqqrB.mjs.map +0 -1
  340. package/dist/_chunks/de-DtWiGdHl.js +0 -66
  341. package/dist/_chunks/de-DtWiGdHl.js.map +0 -1
  342. package/dist/_chunks/dk-2qBjxt-P.mjs +0 -66
  343. package/dist/_chunks/dk-2qBjxt-P.mjs.map +0 -1
  344. package/dist/_chunks/dk-D8C-casx.js +0 -66
  345. package/dist/_chunks/dk-D8C-casx.js.map +0 -1
  346. package/dist/_chunks/en-BKBz3tro.js +0 -81
  347. package/dist/_chunks/en-BKBz3tro.js.map +0 -1
  348. package/dist/_chunks/en-DlXfy6Gy.mjs +0 -81
  349. package/dist/_chunks/en-DlXfy6Gy.mjs.map +0 -1
  350. package/dist/_chunks/es-DS-XFGSw.js +0 -66
  351. package/dist/_chunks/es-DS-XFGSw.js.map +0 -1
  352. package/dist/_chunks/es-DlmMVaBG.mjs +0 -66
  353. package/dist/_chunks/es-DlmMVaBG.mjs.map +0 -1
  354. package/dist/_chunks/fr-3S6ke71d.mjs +0 -66
  355. package/dist/_chunks/fr-3S6ke71d.mjs.map +0 -1
  356. package/dist/_chunks/fr-BTjekDpq.js +0 -66
  357. package/dist/_chunks/fr-BTjekDpq.js.map +0 -1
  358. package/dist/_chunks/index-Bt5ork2g.mjs +0 -1616
  359. package/dist/_chunks/index-Bt5ork2g.mjs.map +0 -1
  360. package/dist/_chunks/index-BwAeKsym.js +0 -1638
  361. package/dist/_chunks/index-BwAeKsym.js.map +0 -1
  362. package/dist/_chunks/ko-DmcGUBQ3.js +0 -65
  363. package/dist/_chunks/ko-DmcGUBQ3.js.map +0 -1
  364. package/dist/_chunks/ko-qTjQ8IMw.mjs +0 -65
  365. package/dist/_chunks/ko-qTjQ8IMw.mjs.map +0 -1
  366. package/dist/_chunks/pl-B67TSHqT.mjs +0 -66
  367. package/dist/_chunks/pl-B67TSHqT.mjs.map +0 -1
  368. package/dist/_chunks/pl-Cn5RYonZ.js +0 -66
  369. package/dist/_chunks/pl-Cn5RYonZ.js.map +0 -1
  370. package/dist/_chunks/ru-BMBgVL3s.js +0 -68
  371. package/dist/_chunks/ru-BMBgVL3s.js.map +0 -1
  372. package/dist/_chunks/ru-hagMa57T.mjs +0 -68
  373. package/dist/_chunks/ru-hagMa57T.mjs.map +0 -1
  374. package/dist/_chunks/tr-CarUU76c.js +0 -66
  375. package/dist/_chunks/tr-CarUU76c.js.map +0 -1
  376. package/dist/_chunks/tr-Dw_jmkG-.mjs +0 -66
  377. package/dist/_chunks/tr-Dw_jmkG-.mjs.map +0 -1
  378. package/dist/_chunks/zh-57YM4amO.mjs +0 -66
  379. package/dist/_chunks/zh-57YM4amO.mjs.map +0 -1
  380. package/dist/_chunks/zh-CukOviB0.js +0 -66
  381. package/dist/_chunks/zh-CukOviB0.js.map +0 -1
  382. package/dist/_chunks/zh-Hans-DSHIXAa3.js +0 -57
  383. package/dist/_chunks/zh-Hans-DSHIXAa3.js.map +0 -1
  384. package/dist/_chunks/zh-Hans-Dyc-aR-h.mjs +0 -57
  385. package/dist/_chunks/zh-Hans-Dyc-aR-h.mjs.map +0 -1
@@ -1,1616 +0,0 @@
1
- import get from "lodash/get";
2
- import * as yup from "yup";
3
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
4
- import * as React from "react";
5
- import { Typography, Dialog, Field, Checkbox, Flex, Button, Modal, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
6
- import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, Plus, Download, ListPlus, Cross, Earth, EarthStriked, CaretDown } from "@strapi/icons";
7
- import { useIntl } from "react-intl";
8
- import { styled } from "styled-components";
9
- import { skipToken } from "@reduxjs/toolkit/query";
10
- import { useAuth, adminApi, useTable, Table, useQueryParams, useForm, useNotification, useAPIErrorHandler } from "@strapi/admin/strapi-admin";
11
- import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from "@strapi/content-manager/strapi-admin";
12
- import { useParams, Link, useNavigate, matchPath } from "react-router-dom";
13
- import * as qs from "qs";
14
- import { stringify } from "qs";
15
- import omit from "lodash/omit";
16
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
- const v = glob[path];
18
- if (v) {
19
- return typeof v === "function" ? v() : Promise.resolve(v);
20
- }
21
- return new Promise((_, reject) => {
22
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
23
- });
24
- };
25
- const pluginId = "i18n";
26
- const getTranslation = (id) => `${pluginId}.${id}`;
27
- const TextAlignTypography = styled(Typography)`
28
- text-align: center;
29
- `;
30
- const CheckboxConfirmation = ({
31
- description,
32
- isCreating = false,
33
- intlLabel,
34
- name,
35
- onChange,
36
- value
37
- }) => {
38
- const { formatMessage } = useIntl();
39
- const [isOpen, setIsOpen] = React.useState(false);
40
- const handleChange = (value2) => {
41
- if (isCreating || value2) {
42
- return onChange({ target: { name, value: value2, type: "checkbox" } });
43
- }
44
- if (!value2) {
45
- return setIsOpen(true);
46
- }
47
- return null;
48
- };
49
- const handleConfirm = () => {
50
- onChange({ target: { name, value: false, type: "checkbox" } });
51
- };
52
- const label = intlLabel.id ? formatMessage(
53
- { id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
54
- { ...intlLabel.values }
55
- ) : name;
56
- const hint = description ? formatMessage(
57
- { id: description.id, defaultMessage: description.defaultMessage },
58
- { ...description.values }
59
- ) : "";
60
- return /* @__PURE__ */ jsxs(Dialog.Root, { open: isOpen, onOpenChange: setIsOpen, children: [
61
- /* @__PURE__ */ jsxs(Field.Root, { hint, name, children: [
62
- /* @__PURE__ */ jsx(Checkbox, { onCheckedChange: handleChange, checked: value, children: label }),
63
- /* @__PURE__ */ jsx(Field.Hint, {})
64
- ] }),
65
- /* @__PURE__ */ jsxs(Dialog.Content, { children: [
66
- /* @__PURE__ */ jsx(Dialog.Header, { children: formatMessage({
67
- id: getTranslation("CheckboxConfirmation.Modal.title"),
68
- defaultMessage: "Disable localization"
69
- }) }),
70
- /* @__PURE__ */ jsx(Dialog.Body, { icon: /* @__PURE__ */ jsx(WarningCircle, {}), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
71
- /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(TextAlignTypography, { children: formatMessage({
72
- id: getTranslation("CheckboxConfirmation.Modal.content"),
73
- defaultMessage: "Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing)."
74
- }) }) }),
75
- /* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold", children: formatMessage({
76
- id: getTranslation("CheckboxConfirmation.Modal.body"),
77
- defaultMessage: "Do you want to disable it?"
78
- }) }) })
79
- ] }) }),
80
- /* @__PURE__ */ jsxs(Dialog.Footer, { children: [
81
- /* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", children: formatMessage({
82
- id: "components.popUpWarning.button.cancel",
83
- defaultMessage: "No, cancel"
84
- }) }) }),
85
- /* @__PURE__ */ jsx(Dialog.Action, { children: /* @__PURE__ */ jsx(Button, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
86
- id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
87
- defaultMessage: "Yes, disable"
88
- }) }) })
89
- ] })
90
- ] })
91
- ] });
92
- };
93
- const LOCALIZED_FIELDS = [
94
- "biginteger",
95
- "boolean",
96
- "component",
97
- "date",
98
- "datetime",
99
- "decimal",
100
- "dynamiczone",
101
- "email",
102
- "enumeration",
103
- "float",
104
- "integer",
105
- "json",
106
- "media",
107
- "number",
108
- "password",
109
- "richtext",
110
- "blocks",
111
- "string",
112
- "text",
113
- "time"
114
- ];
115
- const doesPluginOptionsHaveI18nLocalized = (opts) => typeof opts === "object" && opts !== null && "i18n" in opts && typeof opts.i18n === "object" && opts.i18n !== null && "localized" in opts.i18n && typeof opts.i18n.localized === "boolean";
116
- const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
117
- const useI18n = () => {
118
- const params = useParams();
119
- const userPermissions = useAuth("useI18n", (state) => state.permissions);
120
- const actions = React.useMemo(() => {
121
- const permissions = userPermissions.filter((permission) => permission.subject === params.slug);
122
- return permissions.reduce(
123
- (acc, permission) => {
124
- const [actionShorthand] = permission.action.split(".").slice(-1);
125
- return {
126
- ...acc,
127
- [`can${capitalize(actionShorthand)}`]: permission.properties?.locales ?? []
128
- };
129
- },
130
- { canCreate: [], canRead: [], canUpdate: [], canDelete: [], canPublish: [] }
131
- );
132
- }, [params.slug, userPermissions]);
133
- const { schema } = unstable_useDocument(
134
- {
135
- // We can non-null assert these because below we skip the query if they are not present
136
- collectionType: params.collectionType,
137
- model: params.slug
138
- },
139
- {
140
- skip: true
141
- }
142
- );
143
- if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
144
- return {
145
- hasI18n: schema.pluginOptions.i18n.localized,
146
- ...actions
147
- };
148
- }
149
- return {
150
- hasI18n: false,
151
- ...actions
152
- };
153
- };
154
- const i18nApi = adminApi.enhanceEndpoints({
155
- addTagTypes: ["Locale"]
156
- });
157
- const localesApi = i18nApi.injectEndpoints({
158
- endpoints: (builder) => ({
159
- createLocale: builder.mutation({
160
- query: (data) => ({
161
- url: "/i18n/locales",
162
- method: "POST",
163
- data
164
- }),
165
- invalidatesTags: [{ type: "Locale", id: "LIST" }]
166
- }),
167
- deleteLocale: builder.mutation({
168
- query: (id) => ({
169
- url: `/i18n/locales/${id}`,
170
- method: "DELETE"
171
- }),
172
- invalidatesTags: (result, error, id) => [{ type: "Locale", id }]
173
- }),
174
- getLocales: builder.query({
175
- query: () => "/i18n/locales",
176
- providesTags: (res) => [
177
- { type: "Locale", id: "LIST" },
178
- ...Array.isArray(res) ? res.map((locale) => ({
179
- type: "Locale",
180
- id: locale.id
181
- })) : []
182
- ]
183
- }),
184
- getDefaultLocales: builder.query({
185
- query: () => "/i18n/iso-locales"
186
- }),
187
- updateLocale: builder.mutation({
188
- query: ({ id, ...data }) => ({
189
- url: `/i18n/locales/${id}`,
190
- method: "PUT",
191
- data
192
- }),
193
- invalidatesTags: (result, error, { id }) => [{ type: "Locale", id }]
194
- })
195
- })
196
- });
197
- const {
198
- useCreateLocaleMutation,
199
- useDeleteLocaleMutation,
200
- useGetLocalesQuery,
201
- useGetDefaultLocalesQuery,
202
- useUpdateLocaleMutation
203
- } = localesApi;
204
- const relationsApi = i18nApi.injectEndpoints({
205
- overrideExisting: true,
206
- endpoints: (builder) => ({
207
- getManyDraftRelationCount: builder.query({
208
- query: ({ model, ...params }) => ({
209
- url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,
210
- method: "GET",
211
- config: {
212
- params
213
- }
214
- }),
215
- transformResponse: (response) => response.data
216
- })
217
- })
218
- });
219
- const { useGetManyDraftRelationCountQuery } = relationsApi;
220
- const cleanData = (data, schema, components) => {
221
- const cleanedData = removeFields(data, [
222
- "createdAt",
223
- "createdBy",
224
- "updatedAt",
225
- "updatedBy",
226
- "id",
227
- "documentId",
228
- "publishedAt",
229
- "strapi_stage",
230
- "strapi_assignee",
231
- "locale",
232
- "status"
233
- ]);
234
- const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
235
- cleanedData,
236
- schema,
237
- components,
238
- ["relation", "password"]
239
- );
240
- return cleanedDataWithoutPasswordAndRelation;
241
- };
242
- const removeFields = (data, fields) => {
243
- return Object.keys(data).reduce((acc, current) => {
244
- if (fields.includes(current)) {
245
- return acc;
246
- }
247
- acc[current] = data[current];
248
- return acc;
249
- }, {});
250
- };
251
- const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
252
- return Object.keys(data).reduce((acc, current) => {
253
- const attribute = schema.attributes[current] ?? { type: void 0 };
254
- if (fields.includes(attribute.type)) {
255
- return acc;
256
- }
257
- if (attribute.type === "dynamiczone") {
258
- acc[current] = data[current].map((componentValue, index2) => {
259
- const { id: _, ...rest } = recursiveRemoveFieldTypes(
260
- componentValue,
261
- components[componentValue.__component],
262
- components,
263
- fields
264
- );
265
- return {
266
- ...rest,
267
- __temp_key__: index2 + 1
268
- };
269
- });
270
- } else if (attribute.type === "component") {
271
- const { repeatable, component } = attribute;
272
- if (repeatable) {
273
- acc[current] = (data[current] ?? []).map((compoData, index2) => {
274
- const { id: _, ...rest } = recursiveRemoveFieldTypes(
275
- compoData,
276
- components[component],
277
- components,
278
- fields
279
- );
280
- return {
281
- ...rest,
282
- __temp_key__: index2 + 1
283
- };
284
- });
285
- } else {
286
- const { id: _, ...rest } = recursiveRemoveFieldTypes(
287
- data[current] ?? {},
288
- components[component],
289
- components,
290
- fields
291
- );
292
- acc[current] = rest;
293
- }
294
- } else {
295
- acc[current] = data[current];
296
- }
297
- return acc;
298
- }, {});
299
- };
300
- const isErrorMessageDescriptor = (object) => {
301
- return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
302
- };
303
- const EntryValidationText = ({
304
- status = "draft",
305
- validationErrors,
306
- action
307
- }) => {
308
- const { formatMessage } = useIntl();
309
- const getErrorStr = (key, value) => {
310
- if (typeof value === "string") {
311
- return `${key}: ${value}`;
312
- } else if (isErrorMessageDescriptor(value)) {
313
- return `${key}: ${formatMessage(value)}`;
314
- } else if (Array.isArray(value)) {
315
- return value.map((v) => getErrorStr(key, v)).join(" ");
316
- } else if (typeof value === "object" && !Array.isArray(value)) {
317
- return Object.entries(value).map(([k, v]) => getErrorStr(k, v)).join(" ");
318
- } else {
319
- return "";
320
- }
321
- };
322
- if (validationErrors) {
323
- const validationErrorsMessages = Object.entries(validationErrors).map(([key, value]) => {
324
- return getErrorStr(key, value);
325
- }).join(" ");
326
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
327
- /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
328
- /* @__PURE__ */ jsx(Tooltip, { label: validationErrorsMessages, children: /* @__PURE__ */ jsx(
329
- Typography,
330
- {
331
- maxWidth: "30rem",
332
- textColor: "danger600",
333
- variant: "omega",
334
- fontWeight: "semiBold",
335
- ellipsis: true,
336
- children: validationErrorsMessages
337
- }
338
- ) })
339
- ] });
340
- }
341
- const getStatusMessage = () => {
342
- if (action === "bulk-publish") {
343
- if (status === "published") {
344
- return {
345
- icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
346
- text: formatMessage({
347
- id: "content-manager.bulk-publish.already-published",
348
- defaultMessage: "Already Published"
349
- }),
350
- textColor: "success600",
351
- fontWeight: "bold"
352
- };
353
- } else if (status === "modified") {
354
- return {
355
- icon: /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
356
- text: formatMessage({
357
- id: "app.utils.ready-to-publish-changes",
358
- defaultMessage: "Ready to publish changes"
359
- })
360
- };
361
- } else {
362
- return {
363
- icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
364
- text: formatMessage({
365
- id: "app.utils.ready-to-publish",
366
- defaultMessage: "Ready to publish"
367
- })
368
- };
369
- }
370
- } else {
371
- if (status === "draft") {
372
- return {
373
- icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
374
- text: formatMessage({
375
- id: "content-manager.bulk-unpublish.already-unpublished",
376
- defaultMessage: "Already Unpublished"
377
- }),
378
- textColor: "success600",
379
- fontWeight: "bold"
380
- };
381
- } else {
382
- return {
383
- icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
384
- text: formatMessage({
385
- id: "app.utils.ready-to-unpublish-changes",
386
- defaultMessage: "Ready to unpublish"
387
- }),
388
- textColor: "success600",
389
- fontWeight: "bold"
390
- };
391
- }
392
- }
393
- };
394
- const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
395
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
396
- icon,
397
- /* @__PURE__ */ jsx(Typography, { textColor, fontWeight, children: text })
398
- ] });
399
- };
400
- const BoldChunk = (chunks) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: chunks });
401
- const BulkLocaleActionModal = ({
402
- headers,
403
- rows,
404
- localesMetadata,
405
- validationErrors = {},
406
- action
407
- }) => {
408
- const { formatMessage } = useIntl();
409
- const selectedRows = useTable(
410
- "BulkLocaleActionModal",
411
- (state) => state.selectedRows
412
- );
413
- const getFormattedCountMessage = () => {
414
- const currentStatusByLocale = rows.reduce((acc, { locale, status }) => {
415
- acc[locale] = status;
416
- return acc;
417
- }, {});
418
- const localesWithErrors = Object.keys(validationErrors);
419
- const publishedCount = selectedRows.filter(
420
- ({ locale }) => currentStatusByLocale[locale] === "published"
421
- ).length;
422
- const draftCount = selectedRows.filter(
423
- ({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
424
- ).length;
425
- const withErrorsCount = localesWithErrors.length;
426
- const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
427
- const defaultMessage = action === "bulk-publish" ? "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action." : "<b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} already unpublished. <b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} ready to unpublish.";
428
- return formatMessage(
429
- {
430
- id: messageId,
431
- defaultMessage
432
- },
433
- {
434
- withErrorsCount,
435
- draftCount,
436
- publishedCount,
437
- b: BoldChunk
438
- }
439
- );
440
- };
441
- return /* @__PURE__ */ jsxs(Modal.Body, { children: [
442
- /* @__PURE__ */ jsx(Typography, { children: getFormattedCountMessage() }),
443
- /* @__PURE__ */ jsx(Box, { marginTop: 5, children: /* @__PURE__ */ jsxs(Table.Content, { children: [
444
- /* @__PURE__ */ jsxs(Table.Head, { children: [
445
- /* @__PURE__ */ jsx(Table.HeaderCheckboxCell, {}),
446
- headers.map((head) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...head }, head.name))
447
- ] }),
448
- /* @__PURE__ */ jsx(Table.Body, { children: rows.map(({ locale, status }, index2) => {
449
- const error = validationErrors?.[locale] ?? null;
450
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
451
- return /* @__PURE__ */ jsxs(Table.Row, { children: [
452
- /* @__PURE__ */ jsx(Table.CheckboxCell, { id: locale, "aria-label": `Select ${locale}` }),
453
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: Array.isArray(localesMetadata) ? localesMetadata.find((localeEntry) => localeEntry.code === locale)?.name : locale }) }),
454
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Box, { display: "flex", children: /* @__PURE__ */ jsx(
455
- Status,
456
- {
457
- display: "flex",
458
- paddingLeft: "6px",
459
- paddingRight: "6px",
460
- paddingTop: "2px",
461
- paddingBottom: "2px",
462
- size: "S",
463
- variant: statusVariant,
464
- children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
465
- }
466
- ) }) }),
467
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(EntryValidationText, { validationErrors: error, status, action }) }),
468
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(
469
- IconButton,
470
- {
471
- tag: Link,
472
- to: {
473
- search: stringify({ plugins: { i18n: { locale } } })
474
- },
475
- label: formatMessage(
476
- {
477
- id: getTranslation("Settings.list.actions.edit"),
478
- defaultMessage: "Edit {name} locale"
479
- },
480
- {
481
- name: locale
482
- }
483
- ),
484
- variant: "ghost",
485
- children: /* @__PURE__ */ jsx(Pencil, {})
486
- }
487
- ) })
488
- ] }, index2);
489
- }) })
490
- ] }) })
491
- ] });
492
- };
493
- const statusVariants = {
494
- draft: "secondary",
495
- published: "success",
496
- modified: "alternative"
497
- };
498
- const LocaleOption = ({
499
- isDraftAndPublishEnabled,
500
- locale,
501
- status,
502
- entryExists
503
- }) => {
504
- const { formatMessage } = useIntl();
505
- if (!entryExists) {
506
- return formatMessage(
507
- {
508
- id: getTranslation("CMEditViewLocalePicker.locale.create"),
509
- defaultMessage: "Create <bold>{locale}</bold> locale"
510
- },
511
- {
512
- bold: (locale2) => /* @__PURE__ */ jsx("b", { children: locale2 }),
513
- locale: locale.name
514
- }
515
- );
516
- }
517
- return /* @__PURE__ */ jsxs(Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
518
- /* @__PURE__ */ jsx(Typography, { children: locale.name }),
519
- isDraftAndPublishEnabled ? /* @__PURE__ */ jsx(
520
- Status,
521
- {
522
- display: "flex",
523
- paddingLeft: "6px",
524
- paddingRight: "6px",
525
- paddingTop: "2px",
526
- paddingBottom: "2px",
527
- size: "S",
528
- variant: statusVariants[status],
529
- children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
530
- }
531
- ) : null
532
- ] });
533
- };
534
- const LocalePickerAction = ({
535
- document,
536
- meta,
537
- model,
538
- collectionType,
539
- documentId
540
- }) => {
541
- const { formatMessage } = useIntl();
542
- const [{ query }, setQuery] = useQueryParams();
543
- const { hasI18n, canCreate, canRead } = useI18n();
544
- const { data: locales = [] } = useGetLocalesQuery();
545
- const currentDesiredLocale = query.plugins?.i18n?.locale;
546
- const { schema } = unstable_useDocument({
547
- model,
548
- collectionType,
549
- documentId,
550
- params: { locale: currentDesiredLocale }
551
- });
552
- const handleSelect = React.useCallback(
553
- (value) => {
554
- setQuery({
555
- plugins: {
556
- ...query.plugins,
557
- i18n: {
558
- locale: value
559
- }
560
- }
561
- });
562
- },
563
- [query.plugins, setQuery]
564
- );
565
- React.useEffect(() => {
566
- if (!Array.isArray(locales) || !hasI18n) {
567
- return;
568
- }
569
- const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
570
- const defaultLocale = locales.find((locale) => locale.isDefault);
571
- if (!doesLocaleExist && defaultLocale?.code) {
572
- handleSelect(defaultLocale.code);
573
- }
574
- }, [handleSelect, hasI18n, locales, currentDesiredLocale]);
575
- const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
576
- const allCurrentLocales = [
577
- { status: getDocumentStatus(document, meta), locale: currentLocale?.code },
578
- ...meta?.availableLocales ?? []
579
- ];
580
- if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
581
- return null;
582
- }
583
- const displayedLocales = locales.filter((locale) => {
584
- return canRead.includes(locale.code);
585
- });
586
- return {
587
- label: formatMessage({
588
- id: getTranslation("Settings.locales.modal.locales.label"),
589
- defaultMessage: "Locales"
590
- }),
591
- options: displayedLocales.map((locale) => {
592
- const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
593
- const currentLocaleDoc = allCurrentLocales.find(
594
- (doc) => "locale" in doc ? doc.locale === locale.code : false
595
- );
596
- const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
597
- return {
598
- disabled: !permissionsToCheck.includes(locale.code),
599
- value: locale.code,
600
- label: /* @__PURE__ */ jsx(
601
- LocaleOption,
602
- {
603
- isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
604
- locale,
605
- status: currentLocaleDoc?.status,
606
- entryExists: entryWithLocaleExists
607
- }
608
- ),
609
- startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsx(Plus, {}) : null
610
- };
611
- }),
612
- customizeContent: () => currentLocale?.name,
613
- onSelect: handleSelect,
614
- value: currentLocale
615
- };
616
- };
617
- const getDocumentStatus = (document, meta) => {
618
- const docStatus = document?.status;
619
- const statuses = meta?.availableStatus ?? [];
620
- if (!docStatus) {
621
- return "draft";
622
- }
623
- if (docStatus === "draft" && statuses.find((doc) => doc.publishedAt !== null)) {
624
- return "published";
625
- }
626
- return docStatus;
627
- };
628
- const FillFromAnotherLocaleAction = ({
629
- documentId,
630
- meta,
631
- model,
632
- collectionType
633
- }) => {
634
- const { formatMessage } = useIntl();
635
- const [{ query }] = useQueryParams();
636
- const { hasI18n } = useI18n();
637
- const currentDesiredLocale = query.plugins?.i18n?.locale;
638
- const [localeSelected, setLocaleSelected] = React.useState(null);
639
- const setValues = useForm("FillFromAnotherLocale", (state) => state.setValues);
640
- const { getDocument } = unstable_useDocumentActions();
641
- const { schema, components } = unstable_useDocument({
642
- model,
643
- documentId,
644
- collectionType,
645
- params: { locale: currentDesiredLocale }
646
- });
647
- const { data: locales = [] } = useGetLocalesQuery();
648
- const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
649
- const fillFromLocale = (onClose) => async () => {
650
- const response = await getDocument({
651
- collectionType,
652
- model,
653
- documentId,
654
- params: { locale: localeSelected }
655
- });
656
- if (!response || !schema) {
657
- return;
658
- }
659
- const { data } = response;
660
- const cleanedData = cleanData(data, schema, components);
661
- setValues(cleanedData);
662
- onClose();
663
- };
664
- if (!hasI18n) {
665
- return null;
666
- }
667
- return {
668
- type: "icon",
669
- icon: /* @__PURE__ */ jsx(Download, {}),
670
- disabled: availableLocales.length === 0,
671
- label: formatMessage({
672
- id: getTranslation("CMEditViewCopyLocale.copy-text"),
673
- defaultMessage: "Fill in from another locale"
674
- }),
675
- dialog: {
676
- type: "dialog",
677
- title: formatMessage({
678
- id: getTranslation("CMEditViewCopyLocale.dialog.title"),
679
- defaultMessage: "Confirmation"
680
- }),
681
- content: ({ onClose }) => /* @__PURE__ */ jsxs(Fragment, { children: [
682
- /* @__PURE__ */ jsx(Dialog.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 3, children: [
683
- /* @__PURE__ */ jsx(WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
684
- /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
685
- id: getTranslation("CMEditViewCopyLocale.dialog.body"),
686
- defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
687
- }) }),
688
- /* @__PURE__ */ jsxs(Field.Root, { width: "100%", children: [
689
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
690
- id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
691
- defaultMessage: "Locale"
692
- }) }),
693
- /* @__PURE__ */ jsx(
694
- SingleSelect,
695
- {
696
- value: localeSelected,
697
- placeholder: formatMessage({
698
- id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
699
- defaultMessage: "Select one locale..."
700
- }),
701
- onChange: (value) => setLocaleSelected(value),
702
- children: availableLocales.map((locale) => /* @__PURE__ */ jsx(SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
703
- }
704
- )
705
- ] })
706
- ] }) }),
707
- /* @__PURE__ */ jsx(Dialog.Footer, { children: /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
708
- /* @__PURE__ */ jsx(Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
709
- id: getTranslation("CMEditViewCopyLocale.cancel-text"),
710
- defaultMessage: "No, cancel"
711
- }) }),
712
- /* @__PURE__ */ jsx(Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
713
- id: getTranslation("CMEditViewCopyLocale.submit-text"),
714
- defaultMessage: "Yes, fill in"
715
- }) })
716
- ] }) })
717
- ] })
718
- }
719
- };
720
- };
721
- const DeleteLocaleAction = ({
722
- document,
723
- documentId,
724
- model,
725
- collectionType
726
- }) => {
727
- const { formatMessage } = useIntl();
728
- const navigate = useNavigate();
729
- const { toggleNotification } = useNotification();
730
- const { delete: deleteAction } = unstable_useDocumentActions();
731
- const { hasI18n, canDelete } = useI18n();
732
- const [{ query }] = useQueryParams();
733
- const { data: locales = [] } = useGetLocalesQuery();
734
- const currentDesiredLocale = query.plugins?.i18n?.locale;
735
- const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
736
- if (!hasI18n) {
737
- return null;
738
- }
739
- return {
740
- disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
741
- position: ["header", "table-row"],
742
- label: formatMessage(
743
- {
744
- id: getTranslation("actions.delete.label"),
745
- defaultMessage: "Delete entry ({locale})"
746
- },
747
- { locale: locale && locale.name }
748
- ),
749
- icon: /* @__PURE__ */ jsx(StyledTrash, {}),
750
- variant: "danger",
751
- dialog: {
752
- type: "dialog",
753
- title: formatMessage({
754
- id: getTranslation("actions.delete.dialog.title"),
755
- defaultMessage: "Confirmation"
756
- }),
757
- content: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
758
- /* @__PURE__ */ jsx(WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
759
- /* @__PURE__ */ jsx(Typography, { tag: "p", variant: "omega", textAlign: "center", children: formatMessage({
760
- id: getTranslation("actions.delete.dialog.body"),
761
- defaultMessage: "Are you sure?"
762
- }) })
763
- ] }),
764
- onConfirm: async () => {
765
- const unableToDelete = (
766
- // We are unable to delete a collection type without a document ID
767
- // & unable to delete generally if there is no document locale
768
- collectionType !== "single-types" && !documentId || !document?.locale
769
- );
770
- if (unableToDelete) {
771
- console.error(
772
- "You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue."
773
- );
774
- toggleNotification({
775
- message: formatMessage({
776
- id: getTranslation("actions.delete.error"),
777
- defaultMessage: "An error occurred while trying to delete the document locale."
778
- }),
779
- type: "danger"
780
- });
781
- return;
782
- }
783
- const res = await deleteAction({
784
- documentId,
785
- model,
786
- collectionType,
787
- params: { locale: document.locale }
788
- });
789
- if (!("error" in res)) {
790
- navigate({ pathname: `../${collectionType}/${model}` }, { replace: true });
791
- }
792
- }
793
- }
794
- };
795
- };
796
- const BulkLocaleAction = ({
797
- document: baseDocument,
798
- documentId,
799
- model,
800
- collectionType,
801
- action
802
- }) => {
803
- const baseLocale = baseDocument?.locale ?? null;
804
- const [{ query }] = useQueryParams();
805
- const params = React.useMemo(() => buildValidParams(query), [query]);
806
- const isOnPublishedTab = query.status === "published";
807
- const { formatMessage } = useIntl();
808
- const { hasI18n, canPublish } = useI18n();
809
- const { toggleNotification } = useNotification();
810
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
811
- const [selectedRows, setSelectedRows] = React.useState([]);
812
- const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React.useState(false);
813
- const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = unstable_useDocumentActions();
814
- const {
815
- document,
816
- meta: documentMeta,
817
- schema,
818
- validate
819
- } = unstable_useDocument(
820
- {
821
- model,
822
- collectionType,
823
- documentId,
824
- params: {
825
- locale: baseLocale
826
- }
827
- },
828
- {
829
- skip: !hasI18n || !baseLocale
830
- }
831
- );
832
- const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : skipToken);
833
- const headers = [
834
- {
835
- label: formatMessage({
836
- id: "global.name",
837
- defaultMessage: "Name"
838
- }),
839
- name: "name"
840
- },
841
- {
842
- label: formatMessage({
843
- id: getTranslation("CMEditViewBulkLocale.status"),
844
- defaultMessage: "Status"
845
- }),
846
- name: "status"
847
- },
848
- {
849
- label: formatMessage({
850
- id: getTranslation("CMEditViewBulkLocale.publication-status"),
851
- defaultMessage: "Publication Status"
852
- }),
853
- name: "publication-status"
854
- }
855
- ];
856
- const [rows, validationErrors] = React.useMemo(() => {
857
- if (!document || !documentMeta?.availableLocales) {
858
- return [[], {}];
859
- }
860
- const rowsFromMeta = documentMeta?.availableLocales.map((doc) => {
861
- const { locale, status } = doc;
862
- return { locale, status };
863
- });
864
- rowsFromMeta.unshift({
865
- locale: document.locale,
866
- status: document.status
867
- });
868
- const allDocuments = [document, ...documentMeta?.availableLocales ?? []];
869
- const errors = allDocuments.reduce((errs, document2) => {
870
- if (!document2) {
871
- return errs;
872
- }
873
- const validation = validate(document2);
874
- if (validation !== null) {
875
- errs[document2.locale] = validation;
876
- }
877
- return errs;
878
- }, {});
879
- return [rowsFromMeta, errors];
880
- }, [document, documentMeta?.availableLocales, validate]);
881
- const isBulkPublish = action === "bulk-publish";
882
- const localesForAction = selectedRows.reduce((acc, selectedRow) => {
883
- const isValidLocale = (
884
- // Validation errors are irrelevant if we are trying to unpublish
885
- !isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
886
- );
887
- const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
888
- if (shouldAddLocale) {
889
- acc.push(selectedRow.locale);
890
- }
891
- return acc;
892
- }, []);
893
- const enableDraftRelationsCount = false;
894
- const {
895
- data: draftRelationsCount = 0,
896
- isLoading: isDraftRelationsLoading,
897
- error: isDraftRelationsError
898
- } = useGetManyDraftRelationCountQuery(
899
- {
900
- model,
901
- documentIds: [documentId],
902
- locale: localesForAction
903
- },
904
- {
905
- skip: !enableDraftRelationsCount
906
- }
907
- );
908
- React.useEffect(() => {
909
- if (isDraftRelationsError) {
910
- toggleNotification({
911
- type: "danger",
912
- message: formatAPIError(isDraftRelationsError)
913
- });
914
- }
915
- }, [isDraftRelationsError, toggleNotification, formatAPIError]);
916
- if (!schema?.options?.draftAndPublish) {
917
- return null;
918
- }
919
- if (!hasI18n) {
920
- return null;
921
- }
922
- if (!documentId) {
923
- return null;
924
- }
925
- const publish = async () => {
926
- await publishManyAction({
927
- model,
928
- documentIds: [documentId],
929
- params: {
930
- ...params,
931
- locale: localesForAction
932
- }
933
- });
934
- setSelectedRows([]);
935
- };
936
- const unpublish = async () => {
937
- await unpublishManyAction({
938
- model,
939
- documentIds: [documentId],
940
- params: {
941
- ...params,
942
- locale: localesForAction
943
- }
944
- });
945
- setSelectedRows([]);
946
- };
947
- const handleAction = async () => {
948
- if (draftRelationsCount > 0) {
949
- setIsDraftRelationConfirmationOpen(true);
950
- } else if (isBulkPublish) {
951
- await publish();
952
- } else {
953
- await unpublish();
954
- }
955
- };
956
- if (isDraftRelationConfirmationOpen) {
957
- return {
958
- label: formatMessage({
959
- id: "app.components.ConfirmDialog.title",
960
- defaultMessage: "Confirmation"
961
- }),
962
- variant: "danger",
963
- dialog: {
964
- onCancel: () => {
965
- setIsDraftRelationConfirmationOpen(false);
966
- },
967
- onConfirm: async () => {
968
- await publish();
969
- setIsDraftRelationConfirmationOpen(false);
970
- },
971
- type: "dialog",
972
- title: formatMessage({
973
- id: getTranslation("actions.publish.dialog.title"),
974
- defaultMessage: "Confirmation"
975
- }),
976
- content: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "center", gap: 2, children: [
977
- /* @__PURE__ */ jsx(WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
978
- /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
979
- id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
980
- defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
981
- }) }),
982
- /* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
983
- id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
984
- defaultMessage: "Are you sure you want to continue?"
985
- }) })
986
- ] })
987
- }
988
- };
989
- }
990
- const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
991
- return {
992
- label: formatMessage({
993
- id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
994
- defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
995
- }),
996
- variant: isBulkPublish ? "secondary" : "danger",
997
- icon: isBulkPublish ? /* @__PURE__ */ jsx(ListPlus, {}) : /* @__PURE__ */ jsx(Cross, {}),
998
- disabled: isOnPublishedTab || canPublish.length === 0,
999
- position: ["panel"],
1000
- dialog: {
1001
- type: "modal",
1002
- title: formatMessage({
1003
- id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
1004
- defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
1005
- }),
1006
- content: () => {
1007
- return /* @__PURE__ */ jsx(
1008
- Table.Root,
1009
- {
1010
- headers,
1011
- rows: rows.map((row) => ({
1012
- ...row,
1013
- id: row.locale
1014
- })),
1015
- selectedRows,
1016
- onSelectedRowsChange: (tableSelectedRows) => setSelectedRows(tableSelectedRows),
1017
- children: /* @__PURE__ */ jsx(
1018
- BulkLocaleActionModal,
1019
- {
1020
- validationErrors,
1021
- headers,
1022
- rows,
1023
- localesMetadata,
1024
- action: action ?? "bulk-publish"
1025
- }
1026
- )
1027
- }
1028
- );
1029
- },
1030
- footer: () => /* @__PURE__ */ jsx(Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(
1031
- Button,
1032
- {
1033
- loading: isDraftRelationsLoading,
1034
- disabled: !hasPermission || localesForAction.length === 0,
1035
- variant: "default",
1036
- onClick: handleAction,
1037
- children: formatMessage({
1038
- id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
1039
- defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
1040
- })
1041
- }
1042
- ) })
1043
- }
1044
- };
1045
- };
1046
- const BulkLocalePublishAction = (props) => {
1047
- return BulkLocaleAction({ action: "bulk-publish", ...props });
1048
- };
1049
- const BulkLocaleUnpublishAction = (props) => {
1050
- return BulkLocaleAction({ action: "bulk-unpublish", ...props });
1051
- };
1052
- const StyledTrash = styled(Trash)`
1053
- path {
1054
- fill: currentColor;
1055
- }
1056
- `;
1057
- const Emphasis = (chunks) => {
1058
- return /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold", textColor: "danger500", children: chunks });
1059
- };
1060
- const DeleteModalAdditionalInfo = () => {
1061
- const { hasI18n } = useI18n();
1062
- const { formatMessage } = useIntl();
1063
- if (!hasI18n) {
1064
- return null;
1065
- }
1066
- return /* @__PURE__ */ jsx(Typography, { textColor: "danger500", children: formatMessage(
1067
- {
1068
- id: getTranslation("Settings.list.actions.deleteAdditionalInfos"),
1069
- defaultMessage: "This will delete the active locale versions <em>(from Internationalization)</em>"
1070
- },
1071
- {
1072
- em: Emphasis
1073
- }
1074
- ) });
1075
- };
1076
- const PublishModalAdditionalInfo = () => {
1077
- const { hasI18n } = useI18n();
1078
- const { formatMessage } = useIntl();
1079
- if (!hasI18n) {
1080
- return null;
1081
- }
1082
- return /* @__PURE__ */ jsx(Typography, { textColor: "danger500", children: formatMessage(
1083
- {
1084
- id: getTranslation("Settings.list.actions.publishAdditionalInfos"),
1085
- defaultMessage: "This will publish the active locale versions <em>(from Internationalization)</em>"
1086
- },
1087
- {
1088
- em: Emphasis
1089
- }
1090
- ) });
1091
- };
1092
- const UnpublishModalAdditionalInfo = () => {
1093
- const { hasI18n } = useI18n();
1094
- const { formatMessage } = useIntl();
1095
- if (!hasI18n) {
1096
- return null;
1097
- }
1098
- return /* @__PURE__ */ jsx(Typography, { textColor: "danger500", children: formatMessage(
1099
- {
1100
- id: getTranslation("Settings.list.actions.unpublishAdditionalInfos"),
1101
- defaultMessage: "This will unpublish the active locale versions <em>(from Internationalization)</em>"
1102
- },
1103
- {
1104
- em: Emphasis
1105
- }
1106
- ) });
1107
- };
1108
- const LocalePicker = () => {
1109
- const { formatMessage } = useIntl();
1110
- const [{ query }, setQuery] = useQueryParams();
1111
- const { hasI18n, canRead, canCreate } = useI18n();
1112
- const { data: locales = [] } = useGetLocalesQuery(void 0, {
1113
- skip: !hasI18n
1114
- });
1115
- const handleChange = React.useCallback(
1116
- (code, replace = false) => {
1117
- setQuery(
1118
- {
1119
- page: 1,
1120
- plugins: { ...query.plugins, i18n: { locale: code } }
1121
- },
1122
- "push",
1123
- replace
1124
- );
1125
- },
1126
- [query.plugins, setQuery]
1127
- );
1128
- React.useEffect(() => {
1129
- if (!Array.isArray(locales) || !hasI18n) {
1130
- return;
1131
- }
1132
- const currentDesiredLocale = query.plugins?.i18n?.locale;
1133
- const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
1134
- const defaultLocale = locales.find((locale) => locale.isDefault);
1135
- if (!doesLocaleExist && defaultLocale?.code) {
1136
- handleChange(defaultLocale.code, true);
1137
- }
1138
- }, [hasI18n, handleChange, locales, query.plugins?.i18n?.locale]);
1139
- if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
1140
- return null;
1141
- }
1142
- const displayedLocales = locales.filter((locale) => {
1143
- return canCreate.includes(locale.code) || canRead.includes(locale.code);
1144
- });
1145
- return /* @__PURE__ */ jsx(
1146
- SingleSelect,
1147
- {
1148
- size: "S",
1149
- "aria-label": formatMessage({
1150
- id: getTranslation("actions.select-locale"),
1151
- defaultMessage: "Select locale"
1152
- }),
1153
- value: query.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
1154
- onChange: handleChange,
1155
- children: displayedLocales.map((locale) => /* @__PURE__ */ jsx(SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
1156
- }
1157
- );
1158
- };
1159
- const PERMISSIONS = {
1160
- accessMain: [{ action: "plugin::i18n.locale.read", subject: null }],
1161
- create: [{ action: "plugin::i18n.locale.create", subject: null }],
1162
- delete: [{ action: "plugin::i18n.locale.delete", subject: null }],
1163
- update: [{ action: "plugin::i18n.locale.update", subject: null }],
1164
- read: [{ action: "plugin::i18n.locale.read", subject: null }]
1165
- };
1166
- const mutateEditViewHook = ({ layout }) => {
1167
- if (!("i18n" in layout.options) || typeof layout.options.i18n === "object" && layout.options.i18n !== null && "localized" in layout.options.i18n && !layout.options.i18n.localized) {
1168
- return { layout };
1169
- }
1170
- const components = Object.entries(layout.components).reduce(
1171
- (acc, [key, componentLayout]) => {
1172
- return {
1173
- ...acc,
1174
- [key]: {
1175
- ...componentLayout,
1176
- layout: componentLayout.layout.map((row) => row.map(addLabelActionToField))
1177
- }
1178
- };
1179
- },
1180
- {}
1181
- );
1182
- return {
1183
- layout: {
1184
- ...layout,
1185
- components,
1186
- layout: layout.layout.map((panel) => panel.map((row) => row.map(addLabelActionToField)))
1187
- }
1188
- };
1189
- };
1190
- const addLabelActionToField = (field) => {
1191
- const isFieldLocalized = doesFieldHaveI18nPluginOpt(field.attribute.pluginOptions) ? field.attribute.pluginOptions.i18n.localized : true;
1192
- const labelActionProps = {
1193
- title: {
1194
- id: isFieldLocalized ? getTranslation("Field.localized") : getTranslation("Field.not-localized"),
1195
- defaultMessage: isFieldLocalized ? "This value is unique for the selected locale" : "This value is the same across all locales"
1196
- },
1197
- icon: isFieldLocalized ? /* @__PURE__ */ jsx(Earth, {}) : /* @__PURE__ */ jsx(EarthStriked, {})
1198
- };
1199
- return {
1200
- ...field,
1201
- labelAction: /* @__PURE__ */ jsx(LabelAction, { ...labelActionProps })
1202
- };
1203
- };
1204
- const doesFieldHaveI18nPluginOpt = (pluginOpts) => {
1205
- if (!pluginOpts) {
1206
- return false;
1207
- }
1208
- return "i18n" in pluginOpts && typeof pluginOpts.i18n === "object" && pluginOpts.i18n !== null && "localized" in pluginOpts.i18n;
1209
- };
1210
- const LabelAction = ({ title, icon }) => {
1211
- const { formatMessage } = useIntl();
1212
- return /* @__PURE__ */ jsxs(Span, { tag: "span", children: [
1213
- /* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children: formatMessage(title) }),
1214
- React.cloneElement(icon, {
1215
- "aria-hidden": true,
1216
- focusable: false
1217
- // See: https://allyjs.io/tutorials/focusing-in-svg.html#making-svg-elements-focusable
1218
- })
1219
- ] });
1220
- };
1221
- const Span = styled(Flex)`
1222
- svg {
1223
- width: 12px;
1224
- height: 12px;
1225
-
1226
- fill: ${({ theme }) => theme.colors.neutral500};
1227
-
1228
- path {
1229
- fill: ${({ theme }) => theme.colors.neutral500};
1230
- }
1231
- }
1232
- `;
1233
- const LocaleListCell = ({
1234
- documentId,
1235
- locale: currentLocale,
1236
- collectionType,
1237
- model
1238
- }) => {
1239
- const { meta, isLoading } = unstable_useDocument({
1240
- documentId,
1241
- collectionType,
1242
- model,
1243
- params: {
1244
- locale: currentLocale
1245
- }
1246
- });
1247
- const { locale: language } = useIntl();
1248
- const { data: locales = [] } = useGetLocalesQuery();
1249
- const formatter = useCollator(language, {
1250
- sensitivity: "base"
1251
- });
1252
- if (!Array.isArray(locales) || isLoading) {
1253
- return null;
1254
- }
1255
- const availableLocales = meta?.availableLocales.map((doc) => doc.locale) ?? [];
1256
- const localesForDocument = locales.reduce((acc, locale) => {
1257
- const createdLocale = [currentLocale, ...availableLocales].find((loc) => {
1258
- return loc === locale.code;
1259
- });
1260
- if (createdLocale) {
1261
- acc.push(locale);
1262
- }
1263
- return acc;
1264
- }, []).map((locale) => {
1265
- if (locale.isDefault) {
1266
- return `${locale.name} (default)`;
1267
- }
1268
- return locale.name;
1269
- }).toSorted((a, b) => formatter.compare(a, b));
1270
- return /* @__PURE__ */ jsxs(Popover.Root, { children: [
1271
- /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs(Flex, { minWidth: "100%", alignItems: "center", justifyContent: "center", fontWeight: "regular", children: [
1272
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
1273
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(CaretDown, { width: "1.2rem", height: "1.2rem" }) })
1274
- ] }) }) }),
1275
- /* @__PURE__ */ jsx(Popover.Content, { sideOffset: 16, children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) }) })
1276
- ] });
1277
- };
1278
- const addColumnToTableHook = ({ displayedHeaders, layout }) => {
1279
- const { options } = layout;
1280
- const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
1281
- if (!isFieldLocalized) {
1282
- return { displayedHeaders, layout };
1283
- }
1284
- return {
1285
- displayedHeaders: [
1286
- ...displayedHeaders,
1287
- {
1288
- attribute: { type: "string" },
1289
- label: {
1290
- id: getTranslation("list-view.table.header.label"),
1291
- defaultMessage: "Available in"
1292
- },
1293
- searchable: false,
1294
- sortable: false,
1295
- name: "locales",
1296
- // @ts-expect-error – ID is seen as number | string; this will change when we move the type over.
1297
- cellFormatter: (props, _header, meta) => /* @__PURE__ */ jsx(LocaleListCell, { ...props, ...meta })
1298
- }
1299
- ],
1300
- layout
1301
- };
1302
- };
1303
- const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
1304
- return {
1305
- displayedHeaders: [
1306
- ...displayedHeaders,
1307
- {
1308
- label: {
1309
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1310
- defaultMessage: "locale"
1311
- },
1312
- name: "locale"
1313
- }
1314
- ],
1315
- hasI18nEnabled: true
1316
- };
1317
- };
1318
- const extendCTBAttributeInitialDataMiddleware = () => {
1319
- return ({ getState }) => (next) => (action) => {
1320
- const enhanceAction = () => {
1321
- try {
1322
- const store = getState();
1323
- const hasi18nEnabled = get(
1324
- store,
1325
- [
1326
- "content-type-builder_dataManagerProvider",
1327
- "modifiedData",
1328
- "contentType",
1329
- "schema",
1330
- "pluginOptions",
1331
- "i18n",
1332
- "localized"
1333
- ],
1334
- false
1335
- );
1336
- if (hasi18nEnabled) {
1337
- const pluginOptions = action.options ? { ...action.options.pluginOptions, i18n: { localized: true } } : { i18n: { localized: true } };
1338
- return next({
1339
- ...action,
1340
- options: {
1341
- pluginOptions
1342
- }
1343
- });
1344
- }
1345
- return next(action);
1346
- } catch (err) {
1347
- return next(action);
1348
- }
1349
- };
1350
- if (action.type === "ContentTypeBuilder/FormModal/SET_ATTRIBUTE_DATA_SCHEMA" && action.forTarget === "contentType" && !["relation", "component"].includes(action.attributeType) && !action.isEditing) {
1351
- return enhanceAction();
1352
- }
1353
- if (action.type === "ContentTypeBuilder/FormModal/SET_CUSTOM_FIELD_DATA_SCHEMA" && action.forTarget === "contentType" && !action.isEditing) {
1354
- return enhanceAction();
1355
- }
1356
- if ((action.type === "ContentTypeBuilder/FormModal/RESET_PROPS_AND_SET_FORM_FOR_ADDING_AN_EXISTING_COMPO" || action.type === "ContentTypeBuilder/FormModal/RESET_PROPS_AND_SAVE_CURRENT_DATA") && action.forTarget === "contentType") {
1357
- return enhanceAction();
1358
- }
1359
- return next(action);
1360
- };
1361
- };
1362
- const extendCTBInitialDataMiddleware = () => {
1363
- return () => (next) => (action) => {
1364
- if (action.type === "ContentTypeBuilder/FormModal/SET_DATA_TO_EDIT" && action.modalType === "contentType") {
1365
- const i18n = { localized: false };
1366
- const pluginOptions = action.data.pluginOptions ? { ...action.data.pluginOptions, i18n } : { i18n };
1367
- const data = { ...action.data, pluginOptions };
1368
- if (action.actionType === "create") {
1369
- return next({ ...action, data });
1370
- }
1371
- if (!action.data.pluginOptions?.i18n?.localized) {
1372
- return next({ ...action, data });
1373
- }
1374
- }
1375
- return next(action);
1376
- };
1377
- };
1378
- const localeMiddleware = (ctx) => (next) => (permissions) => {
1379
- const match = matchPath("/content-manager/:collectionType/:model?/:id", ctx.pathname);
1380
- if (!match) {
1381
- return next(permissions);
1382
- }
1383
- const search = qs.parse(ctx.search);
1384
- if (typeof search !== "object") {
1385
- return next(permissions);
1386
- }
1387
- if (!("plugins" in search && typeof search.plugins === "object")) {
1388
- return next(permissions);
1389
- }
1390
- if (!("i18n" in search.plugins && typeof search.plugins.i18n === "object" && !Array.isArray(search.plugins.i18n))) {
1391
- return next(permissions);
1392
- }
1393
- const { locale } = search.plugins.i18n;
1394
- if (typeof locale !== "string") {
1395
- return next(permissions);
1396
- }
1397
- const revisedPermissions = permissions.filter(
1398
- (permission) => !permission.properties?.locales || permission.properties.locales.includes(locale)
1399
- );
1400
- return next(revisedPermissions);
1401
- };
1402
- const prefixPluginTranslations = (trad, pluginId2) => {
1403
- return Object.keys(trad).reduce((acc, current) => {
1404
- acc[`${pluginId2}.${current}`] = trad[current];
1405
- return acc;
1406
- }, {});
1407
- };
1408
- const mutateCTBContentTypeSchema = (nextSchema, prevSchema) => {
1409
- if (!doesPluginOptionsHaveI18nLocalized(nextSchema.pluginOptions)) {
1410
- return nextSchema;
1411
- }
1412
- const isNextSchemaLocalized = nextSchema.pluginOptions.i18n.localized;
1413
- const isPrevSchemaLocalized = doesPluginOptionsHaveI18nLocalized(
1414
- prevSchema?.schema?.pluginOptions
1415
- ) ? prevSchema?.schema?.pluginOptions.i18n.localized : false;
1416
- if (isNextSchemaLocalized && isPrevSchemaLocalized) {
1417
- return nextSchema;
1418
- }
1419
- if (isNextSchemaLocalized) {
1420
- const attributes = addLocalisationToFields(nextSchema.attributes);
1421
- return { ...nextSchema, attributes };
1422
- }
1423
- if (!isNextSchemaLocalized) {
1424
- const pluginOptions = omit(nextSchema.pluginOptions, "i18n");
1425
- const attributes = disableAttributesLocalisation(nextSchema.attributes);
1426
- return { ...nextSchema, pluginOptions, attributes };
1427
- }
1428
- return nextSchema;
1429
- };
1430
- const addLocalisationToFields = (attributes) => Object.keys(attributes).reduce((acc, current) => {
1431
- const currentAttribute = attributes[current];
1432
- if (LOCALIZED_FIELDS.includes(currentAttribute.type)) {
1433
- const i18n = { localized: true };
1434
- const pluginOptions = currentAttribute.pluginOptions ? { ...currentAttribute.pluginOptions, i18n } : { i18n };
1435
- acc[current] = { ...currentAttribute, pluginOptions };
1436
- return acc;
1437
- }
1438
- acc[current] = currentAttribute;
1439
- return acc;
1440
- }, {});
1441
- const disableAttributesLocalisation = (attributes) => Object.keys(attributes).reduce((acc, current) => {
1442
- acc[current] = omit(attributes[current], "pluginOptions.i18n");
1443
- return acc;
1444
- }, {});
1445
- const index = {
1446
- register(app) {
1447
- app.addMiddlewares([extendCTBAttributeInitialDataMiddleware, extendCTBInitialDataMiddleware]);
1448
- app.addMiddlewares([() => i18nApi.middleware]);
1449
- app.addReducers({
1450
- [i18nApi.reducerPath]: i18nApi.reducer
1451
- });
1452
- app.addRBACMiddleware([localeMiddleware]);
1453
- app.registerPlugin({
1454
- id: pluginId,
1455
- name: pluginId
1456
- });
1457
- },
1458
- bootstrap(app) {
1459
- app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
1460
- app.registerHook("Admin/CM/pages/EditView/mutate-edit-view-layout", mutateEditViewHook);
1461
- app.registerHook(
1462
- "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
1463
- addLocaleToReleasesHook
1464
- );
1465
- app.addSettingsLink("global", {
1466
- intlLabel: {
1467
- id: getTranslation("plugin.name"),
1468
- defaultMessage: "Internationalization"
1469
- },
1470
- id: "internationalization",
1471
- to: "internationalization",
1472
- Component: () => import("./SettingsPage-giNp3Ftr.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
1473
- permissions: PERMISSIONS.accessMain
1474
- });
1475
- const contentManager = app.getPlugin("content-manager");
1476
- contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
1477
- contentManager.apis.addDocumentAction((actions) => {
1478
- const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
1479
- actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
1480
- return actions;
1481
- });
1482
- contentManager.apis.addDocumentAction((actions) => {
1483
- actions.splice(2, 0, BulkLocalePublishAction);
1484
- actions.splice(5, 0, BulkLocaleUnpublishAction);
1485
- return actions;
1486
- });
1487
- contentManager.injectComponent("listView", "actions", {
1488
- name: "i18n-locale-filter",
1489
- Component: LocalePicker
1490
- });
1491
- contentManager.injectComponent("listView", "publishModalAdditionalInfos", {
1492
- name: "i18n-publish-bullets-in-modal",
1493
- Component: PublishModalAdditionalInfo
1494
- });
1495
- contentManager.injectComponent("listView", "unpublishModalAdditionalInfos", {
1496
- name: "i18n-unpublish-bullets-in-modal",
1497
- Component: UnpublishModalAdditionalInfo
1498
- });
1499
- contentManager.injectComponent("listView", "deleteModalAdditionalInfos", {
1500
- name: "i18n-delete-bullets-in-modal",
1501
- Component: DeleteModalAdditionalInfo
1502
- });
1503
- const ctbPlugin = app.getPlugin("content-type-builder");
1504
- if (ctbPlugin) {
1505
- const ctbFormsAPI = ctbPlugin.apis.forms;
1506
- ctbFormsAPI.addContentTypeSchemaMutation(mutateCTBContentTypeSchema);
1507
- ctbFormsAPI.components.add({ id: "checkboxConfirmation", component: CheckboxConfirmation });
1508
- ctbFormsAPI.extendContentType({
1509
- validator: () => ({
1510
- i18n: yup.object().shape({
1511
- localized: yup.bool()
1512
- })
1513
- }),
1514
- form: {
1515
- advanced() {
1516
- return [
1517
- {
1518
- name: "pluginOptions.i18n.localized",
1519
- description: {
1520
- id: getTranslation("plugin.schema.i18n.localized.description-content-type"),
1521
- defaultMessage: "Allows translating an entry into different languages"
1522
- },
1523
- type: "checkboxConfirmation",
1524
- intlLabel: {
1525
- id: getTranslation("plugin.schema.i18n.localized.label-content-type"),
1526
- defaultMessage: "Localization"
1527
- }
1528
- }
1529
- ];
1530
- }
1531
- }
1532
- });
1533
- ctbFormsAPI.extendFields(LOCALIZED_FIELDS, {
1534
- validator: (args) => ({
1535
- i18n: yup.object().shape({
1536
- localized: yup.bool().test({
1537
- name: "ensure-unique-localization",
1538
- message: getTranslation("plugin.schema.i18n.ensure-unique-localization"),
1539
- test(value) {
1540
- if (value === void 0 || value) {
1541
- return true;
1542
- }
1543
- const unique = get(args, ["3", "modifiedData", "unique"], null);
1544
- if (unique && !value) {
1545
- return false;
1546
- }
1547
- return true;
1548
- }
1549
- })
1550
- })
1551
- }),
1552
- form: {
1553
- advanced({ contentTypeSchema, forTarget, type, step }) {
1554
- if (forTarget !== "contentType") {
1555
- return [];
1556
- }
1557
- const hasI18nEnabled = get(
1558
- contentTypeSchema,
1559
- ["schema", "pluginOptions", "i18n", "localized"],
1560
- false
1561
- );
1562
- if (!hasI18nEnabled) {
1563
- return [];
1564
- }
1565
- if (type === "component" && step === "1") {
1566
- return [];
1567
- }
1568
- return [
1569
- {
1570
- name: "pluginOptions.i18n.localized",
1571
- description: {
1572
- id: getTranslation("plugin.schema.i18n.localized.description-field"),
1573
- defaultMessage: "The field can have different values in each locale"
1574
- },
1575
- type: "checkbox",
1576
- intlLabel: {
1577
- id: getTranslation("plugin.schema.i18n.localized.label-field"),
1578
- defaultMessage: "Enable localization for this field"
1579
- }
1580
- }
1581
- ];
1582
- }
1583
- }
1584
- });
1585
- }
1586
- },
1587
- async registerTrads({ locales }) {
1588
- const importedTrads = await Promise.all(
1589
- locales.map((locale) => {
1590
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-DlXfy6Gy.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
1591
- return {
1592
- data: prefixPluginTranslations(data, pluginId),
1593
- locale
1594
- };
1595
- }).catch(() => {
1596
- return {
1597
- data: {},
1598
- locale
1599
- };
1600
- });
1601
- })
1602
- );
1603
- return Promise.resolve(importedTrads);
1604
- }
1605
- };
1606
- export {
1607
- PERMISSIONS as P,
1608
- useGetDefaultLocalesQuery as a,
1609
- useDeleteLocaleMutation as b,
1610
- useUpdateLocaleMutation as c,
1611
- useGetLocalesQuery as d,
1612
- getTranslation as g,
1613
- index as i,
1614
- useCreateLocaleMutation as u
1615
- };
1616
- //# sourceMappingURL=index-Bt5ork2g.mjs.map