@strapi/admin 5.43.0 → 5.45.0

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 (384) hide show
  1. package/dist/admin/admin/src/StrapiApp.js +17 -4
  2. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  3. package/dist/admin/admin/src/StrapiApp.mjs +18 -5
  4. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/Form.js +18 -8
  6. package/dist/admin/admin/src/components/Form.js.map +1 -1
  7. package/dist/admin/admin/src/components/Form.mjs +18 -8
  8. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/Layouts/Layout.js +1 -0
  10. package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
  11. package/dist/admin/admin/src/components/Layouts/Layout.mjs +1 -0
  12. package/dist/admin/admin/src/components/Layouts/Layout.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/Table.js.map +1 -1
  14. package/dist/admin/admin/src/components/Table.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/Widgets.js +52 -0
  16. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  17. package/dist/admin/admin/src/components/Widgets.mjs +54 -3
  18. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  19. package/dist/admin/admin/src/constants.js +49 -0
  20. package/dist/admin/admin/src/constants.js.map +1 -1
  21. package/dist/admin/admin/src/constants.mjs +49 -0
  22. package/dist/admin/admin/src/constants.mjs.map +1 -1
  23. package/dist/admin/admin/src/core/apis/router.js +4 -4
  24. package/dist/admin/admin/src/core/apis/router.js.map +1 -1
  25. package/dist/admin/admin/src/core/apis/router.mjs +4 -4
  26. package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
  27. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  28. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  29. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView/components → components/Tokens}/FormApiTokenContainer.js +48 -11
  30. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -0
  31. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView/components → components/Tokens}/FormApiTokenContainer.mjs +49 -12
  32. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -0
  33. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +1 -1
  34. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +1 -1
  36. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js +1 -1
  38. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js.map +1 -1
  39. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs +1 -1
  40. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs.map +1 -1
  41. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +21 -1
  42. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +21 -1
  44. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +1 -1
  46. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +1 -1
  48. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js +33 -0
  50. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.mjs +14 -1
  52. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.js +1 -1
  54. package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js.map +1 -0
  55. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.mjs +1 -1
  56. package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.mjs.map +1 -0
  57. package/dist/admin/admin/src/pages/Settings/constants.js +182 -151
  58. package/dist/admin/admin/src/pages/Settings/constants.js.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/constants.mjs +182 -151
  60. package/dist/admin/admin/src/pages/Settings/constants.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.js +17 -0
  62. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.js.map +1 -0
  63. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.mjs +15 -0
  64. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.mjs.map +1 -0
  65. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js +314 -0
  66. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js.map +1 -0
  67. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.mjs +292 -0
  68. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.mjs.map +1 -0
  69. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js +70 -0
  70. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js.map +1 -0
  71. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.mjs +49 -0
  72. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.mjs.map +1 -0
  73. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js +254 -0
  74. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js.map +1 -0
  75. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.mjs +231 -0
  76. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.mjs.map +1 -0
  77. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +42 -33
  78. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  79. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +43 -34
  80. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +3 -2
  82. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +3 -2
  84. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +23 -12
  86. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +23 -12
  88. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +124 -35
  90. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs +126 -37
  92. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +24 -9
  94. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +24 -9
  96. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +5 -3
  98. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs +5 -3
  100. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +171 -36
  102. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +172 -37
  104. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  105. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +5 -3
  106. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
  107. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs +5 -3
  108. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js +59 -1
  110. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs +40 -1
  112. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.js +89 -0
  114. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.js.map +1 -0
  115. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.mjs +86 -0
  116. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.mjs.map +1 -0
  117. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.js +35 -9
  118. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.js.map +1 -1
  119. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.mjs +35 -10
  120. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.mjs.map +1 -1
  121. package/dist/admin/admin/src/render.js +6 -3
  122. package/dist/admin/admin/src/render.js.map +1 -1
  123. package/dist/admin/admin/src/render.mjs +6 -3
  124. package/dist/admin/admin/src/render.mjs.map +1 -1
  125. package/dist/admin/admin/src/router.js +4 -4
  126. package/dist/admin/admin/src/router.js.map +1 -1
  127. package/dist/admin/admin/src/router.mjs +1 -1
  128. package/dist/admin/admin/src/router.mjs.map +1 -1
  129. package/dist/admin/admin/src/services/apiTokens.js +85 -2
  130. package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
  131. package/dist/admin/admin/src/services/apiTokens.mjs +80 -3
  132. package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
  133. package/dist/admin/admin/src/translations/ar.json.js +4 -1
  134. package/dist/admin/admin/src/translations/ar.json.js.map +1 -1
  135. package/dist/admin/admin/src/translations/ar.json.mjs +4 -1
  136. package/dist/admin/admin/src/translations/ar.json.mjs.map +1 -1
  137. package/dist/admin/admin/src/translations/cs.json.js +736 -13
  138. package/dist/admin/admin/src/translations/cs.json.js.map +1 -1
  139. package/dist/admin/admin/src/translations/cs.json.mjs +728 -14
  140. package/dist/admin/admin/src/translations/cs.json.mjs.map +1 -1
  141. package/dist/admin/admin/src/translations/de.json.js +4 -1
  142. package/dist/admin/admin/src/translations/de.json.js.map +1 -1
  143. package/dist/admin/admin/src/translations/de.json.mjs +4 -1
  144. package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
  145. package/dist/admin/admin/src/translations/en.json.js +20 -2
  146. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  147. package/dist/admin/admin/src/translations/en.json.mjs +20 -2
  148. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  149. package/dist/admin/admin/src/translations/es.json.js +4 -1
  150. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  151. package/dist/admin/admin/src/translations/es.json.mjs +4 -1
  152. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  153. package/dist/admin/admin/src/translations/fr.json.js +4 -1
  154. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  155. package/dist/admin/admin/src/translations/fr.json.mjs +4 -1
  156. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  157. package/dist/admin/admin/src/translations/it.json.js +4 -1
  158. package/dist/admin/admin/src/translations/it.json.js.map +1 -1
  159. package/dist/admin/admin/src/translations/it.json.mjs +4 -1
  160. package/dist/admin/admin/src/translations/it.json.mjs.map +1 -1
  161. package/dist/admin/admin/src/translations/ru.json.js +32 -19
  162. package/dist/admin/admin/src/translations/ru.json.js.map +1 -1
  163. package/dist/admin/admin/src/translations/ru.json.mjs +32 -19
  164. package/dist/admin/admin/src/translations/ru.json.mjs.map +1 -1
  165. package/dist/admin/admin/src/translations/zh-Hans.json.js +4 -1
  166. package/dist/admin/admin/src/translations/zh-Hans.json.js.map +1 -1
  167. package/dist/admin/admin/src/translations/zh-Hans.json.mjs +4 -1
  168. package/dist/admin/admin/src/translations/zh-Hans.json.mjs.map +1 -1
  169. package/dist/admin/admin/src/utils/getFetchClient.js +33 -4
  170. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  171. package/dist/admin/admin/src/utils/getFetchClient.mjs +33 -4
  172. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  173. package/dist/admin/admin/tests/server.js +99 -21
  174. package/dist/admin/admin/tests/server.js.map +1 -1
  175. package/dist/admin/admin/tests/server.mjs +99 -21
  176. package/dist/admin/admin/tests/server.mjs.map +1 -1
  177. package/dist/admin/src/components/Widgets.d.ts +2 -1
  178. package/dist/admin/src/constants.d.ts +26 -0
  179. package/dist/admin/src/core/apis/router.d.ts +1 -1
  180. package/dist/admin/src/features/Tracking.d.ts +2 -1
  181. package/dist/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.d.ts +24 -0
  182. package/dist/admin/src/pages/Settings/components/Tokens/Table.d.ts +2 -1
  183. package/dist/admin/src/pages/Settings/components/Tokens/constants.d.ts +17 -0
  184. package/dist/admin/src/pages/Settings/constants.d.ts +1 -1
  185. package/dist/admin/src/pages/Settings/pages/AdminTokens/CreateView.d.ts +1 -0
  186. package/dist/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.d.ts +2 -0
  187. package/dist/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.d.ts +13 -0
  188. package/dist/admin/src/pages/Settings/pages/AdminTokens/ListView.d.ts +2 -0
  189. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.d.ts +4 -3
  190. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +3 -1
  191. package/dist/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.d.ts +1 -0
  192. package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +5 -0
  193. package/dist/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.d.ts +8 -7
  194. package/dist/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.d.ts +27 -0
  195. package/dist/admin/src/pages/Settings/pages/Roles/utils/updateValues.d.ts +8 -2
  196. package/dist/admin/src/services/apiTokens.d.ts +5 -2
  197. package/dist/admin/src/types/permissions.d.ts +1 -1
  198. package/dist/admin/src/utils/getFetchClient.d.ts +14 -1
  199. package/dist/server/server/src/bootstrap.js +37 -5
  200. package/dist/server/server/src/bootstrap.js.map +1 -1
  201. package/dist/server/server/src/bootstrap.mjs +37 -5
  202. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  203. package/dist/server/server/src/config/admin-actions.js +48 -0
  204. package/dist/server/server/src/config/admin-actions.js.map +1 -1
  205. package/dist/server/server/src/config/admin-actions.mjs +48 -0
  206. package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
  207. package/dist/server/server/src/content-types/Permission.js +10 -1
  208. package/dist/server/server/src/content-types/Permission.js.map +1 -1
  209. package/dist/server/server/src/content-types/Permission.mjs +10 -1
  210. package/dist/server/server/src/content-types/Permission.mjs.map +1 -1
  211. package/dist/server/server/src/content-types/User.js +8 -0
  212. package/dist/server/server/src/content-types/User.js.map +1 -1
  213. package/dist/server/server/src/content-types/User.mjs +8 -0
  214. package/dist/server/server/src/content-types/User.mjs.map +1 -1
  215. package/dist/server/server/src/content-types/api-token.js +27 -1
  216. package/dist/server/server/src/content-types/api-token.js.map +1 -1
  217. package/dist/server/server/src/content-types/api-token.mjs +27 -1
  218. package/dist/server/server/src/content-types/api-token.mjs.map +1 -1
  219. package/dist/server/server/src/controllers/admin-token.js +194 -0
  220. package/dist/server/server/src/controllers/admin-token.js.map +1 -0
  221. package/dist/server/server/src/controllers/admin-token.mjs +192 -0
  222. package/dist/server/server/src/controllers/admin-token.mjs.map +1 -0
  223. package/dist/server/server/src/controllers/api-token.js +48 -47
  224. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  225. package/dist/server/server/src/controllers/api-token.mjs +48 -47
  226. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  227. package/dist/server/server/src/controllers/index.js +2 -0
  228. package/dist/server/server/src/controllers/index.js.map +1 -1
  229. package/dist/server/server/src/controllers/index.mjs +2 -0
  230. package/dist/server/server/src/controllers/index.mjs.map +1 -1
  231. package/dist/server/server/src/domain/permission/index.js +2 -1
  232. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  233. package/dist/server/server/src/domain/permission/index.mjs +2 -1
  234. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  235. package/dist/server/server/src/policies/index.js +2 -0
  236. package/dist/server/server/src/policies/index.js.map +1 -1
  237. package/dist/server/server/src/policies/index.mjs +2 -0
  238. package/dist/server/server/src/policies/index.mjs.map +1 -1
  239. package/dist/server/server/src/policies/isAdminTokensEnabled.js +16 -0
  240. package/dist/server/server/src/policies/isAdminTokensEnabled.js.map +1 -0
  241. package/dist/server/server/src/policies/isAdminTokensEnabled.mjs +14 -0
  242. package/dist/server/server/src/policies/isAdminTokensEnabled.mjs.map +1 -0
  243. package/dist/server/server/src/register.js +4 -2
  244. package/dist/server/server/src/register.js.map +1 -1
  245. package/dist/server/server/src/register.mjs +4 -2
  246. package/dist/server/server/src/register.mjs.map +1 -1
  247. package/dist/server/server/src/routes/admin-tokens.js +140 -0
  248. package/dist/server/server/src/routes/admin-tokens.js.map +1 -0
  249. package/dist/server/server/src/routes/admin-tokens.mjs +138 -0
  250. package/dist/server/server/src/routes/admin-tokens.mjs.map +1 -0
  251. package/dist/server/server/src/routes/index.js +2 -0
  252. package/dist/server/server/src/routes/index.js.map +1 -1
  253. package/dist/server/server/src/routes/index.mjs +2 -0
  254. package/dist/server/server/src/routes/index.mjs.map +1 -1
  255. package/dist/server/server/src/services/api-token.js +805 -101
  256. package/dist/server/server/src/services/api-token.js.map +1 -1
  257. package/dist/server/server/src/services/api-token.mjs +800 -101
  258. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  259. package/dist/server/server/src/services/constants.js +2 -0
  260. package/dist/server/server/src/services/constants.js.map +1 -1
  261. package/dist/server/server/src/services/constants.mjs +2 -0
  262. package/dist/server/server/src/services/constants.mjs.map +1 -1
  263. package/dist/server/server/src/services/homepage.js +1 -1
  264. package/dist/server/server/src/services/homepage.js.map +1 -1
  265. package/dist/server/server/src/services/homepage.mjs +1 -1
  266. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  267. package/dist/server/server/src/services/index.js +2 -1
  268. package/dist/server/server/src/services/index.js.map +1 -1
  269. package/dist/server/server/src/services/index.mjs +3 -2
  270. package/dist/server/server/src/services/index.mjs.map +1 -1
  271. package/dist/server/server/src/services/permission/engine.js +6 -0
  272. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  273. package/dist/server/server/src/services/permission/engine.mjs +6 -0
  274. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  275. package/dist/server/server/src/services/permission/queries.js +11 -2
  276. package/dist/server/server/src/services/permission/queries.js.map +1 -1
  277. package/dist/server/server/src/services/permission/queries.mjs +12 -3
  278. package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
  279. package/dist/server/server/src/services/role.js +3 -0
  280. package/dist/server/server/src/services/role.js.map +1 -1
  281. package/dist/server/server/src/services/role.mjs +3 -0
  282. package/dist/server/server/src/services/role.mjs.map +1 -1
  283. package/dist/server/server/src/strategies/admin-token.js +110 -0
  284. package/dist/server/server/src/strategies/admin-token.js.map +1 -0
  285. package/dist/server/server/src/strategies/admin-token.mjs +104 -0
  286. package/dist/server/server/src/strategies/admin-token.mjs.map +1 -0
  287. package/dist/server/server/src/strategies/api-token-utils.js +56 -0
  288. package/dist/server/server/src/strategies/api-token-utils.js.map +1 -0
  289. package/dist/server/server/src/strategies/api-token-utils.mjs +52 -0
  290. package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -0
  291. package/dist/server/server/src/strategies/content-api-token.js +104 -0
  292. package/dist/server/server/src/strategies/content-api-token.js.map +1 -0
  293. package/dist/server/server/src/strategies/content-api-token.mjs +98 -0
  294. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -0
  295. package/dist/server/server/src/validation/admin-tokens.js +28 -0
  296. package/dist/server/server/src/validation/admin-tokens.js.map +1 -0
  297. package/dist/server/server/src/validation/admin-tokens.mjs +25 -0
  298. package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -0
  299. package/dist/server/server/src/validation/api-tokens.js +5 -2
  300. package/dist/server/server/src/validation/api-tokens.js.map +1 -1
  301. package/dist/server/server/src/validation/api-tokens.mjs +5 -2
  302. package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
  303. package/dist/server/server/src/validation/project-settings.js +15 -16
  304. package/dist/server/server/src/validation/project-settings.js.map +1 -1
  305. package/dist/server/server/src/validation/project-settings.mjs +4 -5
  306. package/dist/server/server/src/validation/project-settings.mjs.map +1 -1
  307. package/dist/server/src/bootstrap.d.ts.map +1 -1
  308. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  309. package/dist/server/src/content-types/Permission.d.ts +9 -0
  310. package/dist/server/src/content-types/Permission.d.ts.map +1 -1
  311. package/dist/server/src/content-types/User.d.ts +8 -0
  312. package/dist/server/src/content-types/User.d.ts.map +1 -1
  313. package/dist/server/src/content-types/api-token.d.ts +23 -0
  314. package/dist/server/src/content-types/api-token.d.ts.map +1 -1
  315. package/dist/server/src/content-types/index.d.ts +40 -0
  316. package/dist/server/src/content-types/index.d.ts.map +1 -1
  317. package/dist/server/src/controllers/admin-token.d.ts +12 -0
  318. package/dist/server/src/controllers/admin-token.d.ts.map +1 -0
  319. package/dist/server/src/controllers/api-token.d.ts +0 -1
  320. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  321. package/dist/server/src/controllers/index.d.ts +9 -1
  322. package/dist/server/src/controllers/index.d.ts.map +1 -1
  323. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  324. package/dist/server/src/index.d.ts +56 -2
  325. package/dist/server/src/index.d.ts.map +1 -1
  326. package/dist/server/src/policies/index.d.ts +5 -0
  327. package/dist/server/src/policies/index.d.ts.map +1 -1
  328. package/dist/server/src/policies/isAdminTokensEnabled.d.ts +7 -0
  329. package/dist/server/src/policies/isAdminTokensEnabled.d.ts.map +1 -0
  330. package/dist/server/src/register.d.ts.map +1 -1
  331. package/dist/server/src/routes/admin-tokens.d.ts +15 -0
  332. package/dist/server/src/routes/admin-tokens.d.ts.map +1 -0
  333. package/dist/server/src/routes/index.d.ts.map +1 -1
  334. package/dist/server/src/services/api-token.d.ts +136 -12
  335. package/dist/server/src/services/api-token.d.ts.map +1 -1
  336. package/dist/server/src/services/constants.d.ts +13 -11
  337. package/dist/server/src/services/constants.d.ts.map +1 -1
  338. package/dist/server/src/services/index.d.ts +2 -2
  339. package/dist/server/src/services/index.d.ts.map +1 -1
  340. package/dist/server/src/services/permission/engine.d.ts +5 -0
  341. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  342. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  343. package/dist/server/src/services/permission.d.ts +1 -0
  344. package/dist/server/src/services/permission.d.ts.map +1 -1
  345. package/dist/server/src/services/role.d.ts.map +1 -1
  346. package/dist/server/src/strategies/admin-token.d.ts +51 -0
  347. package/dist/server/src/strategies/admin-token.d.ts.map +1 -0
  348. package/dist/server/src/strategies/api-token-utils.d.ts +13 -0
  349. package/dist/server/src/strategies/api-token-utils.d.ts.map +1 -0
  350. package/dist/server/src/strategies/{api-token.d.ts → content-api-token.d.ts} +10 -11
  351. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -0
  352. package/dist/server/src/strategies/index.d.ts +2 -1
  353. package/dist/server/src/strategies/index.d.ts.map +1 -1
  354. package/dist/server/src/validation/admin-tokens.d.ts +75 -0
  355. package/dist/server/src/validation/admin-tokens.d.ts.map +1 -0
  356. package/dist/server/src/validation/api-tokens.d.ts +4 -2
  357. package/dist/server/src/validation/api-tokens.d.ts.map +1 -1
  358. package/dist/server/src/validation/project-settings.d.ts +10 -10
  359. package/dist/server/src/validation/project-settings.d.ts.map +1 -1
  360. package/dist/shared/contracts/admin-token.d.ts +122 -0
  361. package/dist/shared/contracts/admin-token.d.ts.map +1 -0
  362. package/dist/shared/contracts/api-token.d.ts +6 -95
  363. package/dist/shared/contracts/api-token.d.ts.map +1 -1
  364. package/dist/shared/contracts/content-api-token.d.ts +97 -0
  365. package/dist/shared/contracts/content-api-token.d.ts.map +1 -0
  366. package/dist/shared/contracts/shared.d.ts +1 -0
  367. package/dist/shared/contracts/shared.d.ts.map +1 -1
  368. package/package.json +10 -10
  369. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.js.map +0 -1
  370. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.mjs.map +0 -1
  371. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.js +0 -37
  372. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.js.map +0 -1
  373. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.mjs +0 -16
  374. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.mjs.map +0 -1
  375. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.js.map +0 -1
  376. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.mjs.map +0 -1
  377. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.d.ts +0 -20
  378. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.d.ts +0 -17
  379. package/dist/server/server/src/strategies/api-token.js +0 -144
  380. package/dist/server/server/src/strategies/api-token.js.map +0 -1
  381. package/dist/server/server/src/strategies/api-token.mjs +0 -138
  382. package/dist/server/server/src/strategies/api-token.mjs.map +0 -1
  383. package/dist/server/src/strategies/api-token.d.ts.map +0 -1
  384. /package/dist/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
1
+ {"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n kind?: 'admin' | 'content-api';\n type?: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
1
+ {"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n kind?: 'admin' | 'content-api';\n type?: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
@@ -4,13 +4,29 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  require('react');
5
5
  var designSystem = require('@strapi/design-system');
6
6
  var reactIntl = require('react-intl');
7
- var LifeSpanInput = require('../../../../components/Tokens/LifeSpanInput.js');
8
- var TokenDescription = require('../../../../components/Tokens/TokenDescription.js');
9
- var TokenName = require('../../../../components/Tokens/TokenName.js');
10
- var TokenTypeSelect = require('../../../../components/Tokens/TokenTypeSelect.js');
7
+ var Auth = require('../../../../features/Auth.js');
8
+ var LifeSpanInput = require('./LifeSpanInput.js');
9
+ var TokenDescription = require('./TokenDescription.js');
10
+ var TokenName = require('./TokenName.js');
11
+ var TokenTypeSelect = require('./TokenTypeSelect.js');
11
12
 
12
- const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreating, values = {}, apiToken = {}, onDispatch, setHasChangedPermissions })=>{
13
+ const formatAdminUserName = (owner)=>{
14
+ const full = [
15
+ owner.firstname,
16
+ owner.lastname
17
+ ].filter(Boolean).join(' ');
18
+ return full || owner.username || owner.email || '';
19
+ };
20
+ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreating, values = {}, apiToken = {}, kind, onDispatch, setHasChangedPermissions })=>{
13
21
  const { formatMessage } = reactIntl.useIntl();
22
+ const currentUser = Auth.useAuth('FormApiTokenContainer', (state)=>state.user);
23
+ const ownerToDisplay = (()=>{
24
+ const owner = kind === 'admin' ? apiToken?.adminUserOwner : undefined;
25
+ if (owner === undefined || owner === null) return null;
26
+ if (typeof owner !== 'object') return null;
27
+ if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;
28
+ return owner;
29
+ })();
14
30
  const handleChangeSelectApiTokenType = ({ target: { value } })=>{
15
31
  setHasChangedPermissions(false);
16
32
  if (value === 'full-access') {
@@ -108,7 +124,7 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
108
124
  token: apiToken
109
125
  })
110
126
  }, "lifespan"),
111
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
127
+ kind === 'content-api' && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
112
128
  m: 6,
113
129
  xs: 12,
114
130
  direction: "column",
@@ -121,24 +137,45 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
121
137
  defaultMessage: 'Token type'
122
138
  },
123
139
  onChange: (value)=>{
124
- // @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
125
140
  handleChangeSelectApiTokenType({
126
141
  target: {
127
- value
142
+ value: String(value)
128
143
  }
129
144
  });
130
- // @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
131
145
  onChange({
132
146
  target: {
133
147
  name: 'type',
134
- value
148
+ value: String(value)
135
149
  }
136
150
  });
137
151
  },
138
152
  options: typeOptions,
139
153
  canEditInputs: canEditInputs
140
154
  })
141
- }, "type")
155
+ }, "type"),
156
+ ownerToDisplay !== null && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
157
+ m: 6,
158
+ xs: 12,
159
+ direction: "column",
160
+ alignItems: "stretch",
161
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
162
+ name: "adminUserOwner",
163
+ children: [
164
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
165
+ children: formatMessage({
166
+ id: 'Settings.tokens.form.owner',
167
+ defaultMessage: 'Owner'
168
+ })
169
+ }),
170
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextInput, {
171
+ type: "text",
172
+ value: formatAdminUserName(ownerToDisplay),
173
+ disabled: true,
174
+ onChange: ()=>{}
175
+ })
176
+ ]
177
+ })
178
+ }, "owner")
142
179
  ]
143
180
  })
144
181
  ]
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormApiTokenContainer.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Field, Flex, Grid, TextInput, Typography } from '@strapi/design-system';\nimport { FormikErrors } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth } from '../../../../features/Auth';\n\nimport { LifeSpanInput } from './LifeSpanInput';\nimport { TokenDescription } from './TokenDescription';\nimport { TokenName } from './TokenName';\nimport { TokenTypeSelect } from './TokenTypeSelect';\n\nimport type { AdminApiToken } from '../../../../../../shared/contracts/admin-token';\nimport type { ApiToken, ContentApiApiToken } from '../../../../../../shared/contracts/api-token';\nimport type { AdminTokenOwner } from '../../../../../../shared/contracts/shared';\nimport type { AuthContextValue } from '../../../../features/Auth';\n\ninterface FormApiTokenContainerProps {\n errors?: FormikErrors<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n onChange: ({ target: { name, value } }: { target: { name: string; value: string } }) => void;\n canEditInputs: boolean;\n values?: Partial<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n isCreating: boolean;\n apiToken?: null | Partial<ApiToken>;\n kind: 'admin' | 'content-api';\n onDispatch: React.Dispatch<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: any;\n value?: unknown;\n }>;\n setHasChangedPermissions: (hasChanged: boolean) => void;\n}\n\nconst formatAdminUserName = (\n owner: Pick<AdminTokenOwner, 'firstname' | 'lastname' | 'email' | 'username'>\n): string => {\n const full = [owner.firstname, owner.lastname].filter(Boolean).join(' ');\n return full || owner.username || owner.email || '';\n};\n\nexport const FormApiTokenContainer = ({\n errors = {},\n onChange,\n canEditInputs,\n isCreating,\n values = {},\n apiToken = {},\n kind,\n onDispatch,\n setHasChangedPermissions,\n}: FormApiTokenContainerProps) => {\n const { formatMessage } = useIntl();\n const currentUser = useAuth('FormApiTokenContainer', (state: AuthContextValue) => state.user);\n\n const ownerToDisplay = (() => {\n const owner =\n kind === 'admin'\n ? (apiToken as Partial<AdminApiToken> | null | undefined)?.adminUserOwner\n : undefined;\n if (owner === undefined || owner === null) return null;\n if (typeof owner !== 'object') return null;\n if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;\n return owner;\n })();\n\n const handleChangeSelectApiTokenType = ({ target: { value } }: { target: { value: string } }) => {\n setHasChangedPermissions(false);\n\n if (value === 'full-access') {\n onDispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (value === 'read-only') {\n onDispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n };\n\n const typeOptions = [\n {\n value: 'read-only',\n label: {\n id: 'Settings.tokens.types.read-only',\n defaultMessage: 'Read-only',\n },\n },\n {\n value: 'full-access',\n label: {\n id: 'Settings.tokens.types.full-access',\n defaultMessage: 'Full access',\n },\n },\n {\n value: 'custom',\n label: {\n id: 'Settings.tokens.types.custom',\n defaultMessage: 'Custom',\n },\n },\n ];\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n </Typography>\n <Grid.Root gap={5}>\n <Grid.Item key=\"name\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenName\n error={errors['name']}\n value={values['name']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"description\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenDescription\n error={errors['description']}\n value={values['description']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"lifespan\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <LifeSpanInput\n isCreating={isCreating}\n error={errors['lifespan']}\n value={values['lifespan']}\n onChange={onChange}\n token={apiToken}\n />\n </Grid.Item>\n\n {kind === 'content-api' && (\n <Grid.Item key=\"type\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenTypeSelect\n value={values['type']}\n error={errors['type']}\n label={{\n id: 'Settings.tokens.form.type',\n defaultMessage: 'Token type',\n }}\n onChange={(value) => {\n handleChangeSelectApiTokenType({ target: { value: String(value) } });\n\n onChange({ target: { name: 'type', value: String(value) } });\n }}\n options={typeOptions}\n canEditInputs={canEditInputs}\n />\n </Grid.Item>\n )}\n {ownerToDisplay !== null && (\n <Grid.Item key=\"owner\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"adminUserOwner\">\n <Field.Label>\n {formatMessage({\n id: 'Settings.tokens.form.owner',\n defaultMessage: 'Owner',\n })}\n </Field.Label>\n <TextInput\n type=\"text\"\n value={formatAdminUserName(ownerToDisplay)}\n disabled\n onChange={() => {}}\n />\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n );\n};\n"],"names":["formatAdminUserName","owner","full","firstname","lastname","filter","Boolean","join","username","email","FormApiTokenContainer","errors","onChange","canEditInputs","isCreating","values","apiToken","kind","onDispatch","setHasChangedPermissions","formatMessage","useIntl","currentUser","useAuth","state","user","ownerToDisplay","adminUserOwner","undefined","id","handleChangeSelectApiTokenType","target","value","type","typeOptions","label","defaultMessage","_jsx","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","_jsxs","Flex","direction","alignItems","gap","Typography","variant","tag","Grid","Root","Item","m","xs","TokenName","error","TokenDescription","LifeSpanInput","token","TokenTypeSelect","String","name","options","Field","Label","TextInput","disabled"],"mappings":"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"}
@@ -1,14 +1,30 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import 'react';
3
- import { Box, Flex, Typography, Grid } from '@strapi/design-system';
3
+ import { Box, Flex, Typography, Grid, Field, TextInput } from '@strapi/design-system';
4
4
  import { useIntl } from 'react-intl';
5
- import { LifeSpanInput } from '../../../../components/Tokens/LifeSpanInput.mjs';
6
- import { TokenDescription } from '../../../../components/Tokens/TokenDescription.mjs';
7
- import { TokenName } from '../../../../components/Tokens/TokenName.mjs';
8
- import { TokenTypeSelect } from '../../../../components/Tokens/TokenTypeSelect.mjs';
5
+ import { useAuth } from '../../../../features/Auth.mjs';
6
+ import { LifeSpanInput } from './LifeSpanInput.mjs';
7
+ import { TokenDescription } from './TokenDescription.mjs';
8
+ import { TokenName } from './TokenName.mjs';
9
+ import { TokenTypeSelect } from './TokenTypeSelect.mjs';
9
10
 
10
- const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreating, values = {}, apiToken = {}, onDispatch, setHasChangedPermissions })=>{
11
+ const formatAdminUserName = (owner)=>{
12
+ const full = [
13
+ owner.firstname,
14
+ owner.lastname
15
+ ].filter(Boolean).join(' ');
16
+ return full || owner.username || owner.email || '';
17
+ };
18
+ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreating, values = {}, apiToken = {}, kind, onDispatch, setHasChangedPermissions })=>{
11
19
  const { formatMessage } = useIntl();
20
+ const currentUser = useAuth('FormApiTokenContainer', (state)=>state.user);
21
+ const ownerToDisplay = (()=>{
22
+ const owner = kind === 'admin' ? apiToken?.adminUserOwner : undefined;
23
+ if (owner === undefined || owner === null) return null;
24
+ if (typeof owner !== 'object') return null;
25
+ if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;
26
+ return owner;
27
+ })();
12
28
  const handleChangeSelectApiTokenType = ({ target: { value } })=>{
13
29
  setHasChangedPermissions(false);
14
30
  if (value === 'full-access') {
@@ -106,7 +122,7 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
106
122
  token: apiToken
107
123
  })
108
124
  }, "lifespan"),
109
- /*#__PURE__*/ jsx(Grid.Item, {
125
+ kind === 'content-api' && /*#__PURE__*/ jsx(Grid.Item, {
110
126
  m: 6,
111
127
  xs: 12,
112
128
  direction: "column",
@@ -119,24 +135,45 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
119
135
  defaultMessage: 'Token type'
120
136
  },
121
137
  onChange: (value)=>{
122
- // @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
123
138
  handleChangeSelectApiTokenType({
124
139
  target: {
125
- value
140
+ value: String(value)
126
141
  }
127
142
  });
128
- // @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
129
143
  onChange({
130
144
  target: {
131
145
  name: 'type',
132
- value
146
+ value: String(value)
133
147
  }
134
148
  });
135
149
  },
136
150
  options: typeOptions,
137
151
  canEditInputs: canEditInputs
138
152
  })
139
- }, "type")
153
+ }, "type"),
154
+ ownerToDisplay !== null && /*#__PURE__*/ jsx(Grid.Item, {
155
+ m: 6,
156
+ xs: 12,
157
+ direction: "column",
158
+ alignItems: "stretch",
159
+ children: /*#__PURE__*/ jsxs(Field.Root, {
160
+ name: "adminUserOwner",
161
+ children: [
162
+ /*#__PURE__*/ jsx(Field.Label, {
163
+ children: formatMessage({
164
+ id: 'Settings.tokens.form.owner',
165
+ defaultMessage: 'Owner'
166
+ })
167
+ }),
168
+ /*#__PURE__*/ jsx(TextInput, {
169
+ type: "text",
170
+ value: formatAdminUserName(ownerToDisplay),
171
+ disabled: true,
172
+ onChange: ()=>{}
173
+ })
174
+ ]
175
+ })
176
+ }, "owner")
140
177
  ]
141
178
  })
142
179
  ]
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormApiTokenContainer.mjs","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Field, Flex, Grid, TextInput, Typography } from '@strapi/design-system';\nimport { FormikErrors } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth } from '../../../../features/Auth';\n\nimport { LifeSpanInput } from './LifeSpanInput';\nimport { TokenDescription } from './TokenDescription';\nimport { TokenName } from './TokenName';\nimport { TokenTypeSelect } from './TokenTypeSelect';\n\nimport type { AdminApiToken } from '../../../../../../shared/contracts/admin-token';\nimport type { ApiToken, ContentApiApiToken } from '../../../../../../shared/contracts/api-token';\nimport type { AdminTokenOwner } from '../../../../../../shared/contracts/shared';\nimport type { AuthContextValue } from '../../../../features/Auth';\n\ninterface FormApiTokenContainerProps {\n errors?: FormikErrors<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n onChange: ({ target: { name, value } }: { target: { name: string; value: string } }) => void;\n canEditInputs: boolean;\n values?: Partial<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n isCreating: boolean;\n apiToken?: null | Partial<ApiToken>;\n kind: 'admin' | 'content-api';\n onDispatch: React.Dispatch<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: any;\n value?: unknown;\n }>;\n setHasChangedPermissions: (hasChanged: boolean) => void;\n}\n\nconst formatAdminUserName = (\n owner: Pick<AdminTokenOwner, 'firstname' | 'lastname' | 'email' | 'username'>\n): string => {\n const full = [owner.firstname, owner.lastname].filter(Boolean).join(' ');\n return full || owner.username || owner.email || '';\n};\n\nexport const FormApiTokenContainer = ({\n errors = {},\n onChange,\n canEditInputs,\n isCreating,\n values = {},\n apiToken = {},\n kind,\n onDispatch,\n setHasChangedPermissions,\n}: FormApiTokenContainerProps) => {\n const { formatMessage } = useIntl();\n const currentUser = useAuth('FormApiTokenContainer', (state: AuthContextValue) => state.user);\n\n const ownerToDisplay = (() => {\n const owner =\n kind === 'admin'\n ? (apiToken as Partial<AdminApiToken> | null | undefined)?.adminUserOwner\n : undefined;\n if (owner === undefined || owner === null) return null;\n if (typeof owner !== 'object') return null;\n if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;\n return owner;\n })();\n\n const handleChangeSelectApiTokenType = ({ target: { value } }: { target: { value: string } }) => {\n setHasChangedPermissions(false);\n\n if (value === 'full-access') {\n onDispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (value === 'read-only') {\n onDispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n };\n\n const typeOptions = [\n {\n value: 'read-only',\n label: {\n id: 'Settings.tokens.types.read-only',\n defaultMessage: 'Read-only',\n },\n },\n {\n value: 'full-access',\n label: {\n id: 'Settings.tokens.types.full-access',\n defaultMessage: 'Full access',\n },\n },\n {\n value: 'custom',\n label: {\n id: 'Settings.tokens.types.custom',\n defaultMessage: 'Custom',\n },\n },\n ];\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n </Typography>\n <Grid.Root gap={5}>\n <Grid.Item key=\"name\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenName\n error={errors['name']}\n value={values['name']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"description\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenDescription\n error={errors['description']}\n value={values['description']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"lifespan\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <LifeSpanInput\n isCreating={isCreating}\n error={errors['lifespan']}\n value={values['lifespan']}\n onChange={onChange}\n token={apiToken}\n />\n </Grid.Item>\n\n {kind === 'content-api' && (\n <Grid.Item key=\"type\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenTypeSelect\n value={values['type']}\n error={errors['type']}\n label={{\n id: 'Settings.tokens.form.type',\n defaultMessage: 'Token type',\n }}\n onChange={(value) => {\n handleChangeSelectApiTokenType({ target: { value: String(value) } });\n\n onChange({ target: { name: 'type', value: String(value) } });\n }}\n options={typeOptions}\n canEditInputs={canEditInputs}\n />\n </Grid.Item>\n )}\n {ownerToDisplay !== null && (\n <Grid.Item key=\"owner\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"adminUserOwner\">\n <Field.Label>\n {formatMessage({\n id: 'Settings.tokens.form.owner',\n defaultMessage: 'Owner',\n })}\n </Field.Label>\n <TextInput\n type=\"text\"\n value={formatAdminUserName(ownerToDisplay)}\n disabled\n onChange={() => {}}\n />\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n );\n};\n"],"names":["formatAdminUserName","owner","full","firstname","lastname","filter","Boolean","join","username","email","FormApiTokenContainer","errors","onChange","canEditInputs","isCreating","values","apiToken","kind","onDispatch","setHasChangedPermissions","formatMessage","useIntl","currentUser","useAuth","state","user","ownerToDisplay","adminUserOwner","undefined","id","handleChangeSelectApiTokenType","target","value","type","typeOptions","label","defaultMessage","_jsx","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","_jsxs","Flex","direction","alignItems","gap","Typography","variant","tag","Grid","Root","Item","m","xs","TokenName","error","TokenDescription","LifeSpanInput","token","TokenTypeSelect","String","name","options","Field","Label","TextInput","disabled"],"mappings":"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"}
@@ -140,7 +140,7 @@ const FormHead = ({ title, token, setToken, toggleToken, showToken, canShowToken
140
140
  width: "100%",
141
141
  gap: 2,
142
142
  children: [
143
- token?.id && toggleToken && /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.apiTokens.ViewAPIToken, {
143
+ token?.id && toggleToken && canShowToken === true && /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.apiTokens.ViewAPIToken, {
144
144
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
145
145
  label: !canShowToken && formatMessage({
146
146
  id: 'Settings.tokens.encryptionKeyMissing',
@@ -1 +1 @@
1
- {"version":3,"file":"FormHead.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormHead.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Tooltip } from '@strapi/design-system';\nimport { Check, ArrowClockwise, Eye, EyeStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ConfirmDialog } from '../../../../components/ConfirmDialog';\nimport { tours } from '../../../../components/GuidedTour/Tours';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useRegenerateTokenMutation } from '../../../../services/transferTokens';\n\nimport type { Data } from '@strapi/types';\n\ninterface RegenerateProps {\n onRegenerate?: (newKey: string) => void;\n url: string;\n}\n\nconst ActionButton = styled(Button)`\n white-space: nowrap;\n`;\n\nconst Regenerate = ({ onRegenerate, url }: RegenerateProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const [isLoadingConfirmation, setIsLoadingConfirmation] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [regenerateToken] = useRegenerateTokenMutation();\n\n const regenerateData = async () => {\n try {\n const res = await regenerateToken(url);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n if (onRegenerate) {\n onRegenerate(res.data.accessKey);\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n } finally {\n setIsLoadingConfirmation(false);\n }\n };\n\n const handleConfirmRegeneration = async () => {\n regenerateData();\n setShowConfirmDialog(false);\n };\n\n return (\n <Dialog.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Dialog.Trigger>\n <ActionButton\n startIcon={<ArrowClockwise />}\n type=\"button\"\n size=\"S\"\n variant=\"tertiary\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"regenerate\"\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </ActionButton>\n </Dialog.Trigger>\n\n <ConfirmDialog\n title={formatMessage({\n id: 'Settings.tokens.RegenerateDialog.title',\n defaultMessage: 'Regenerate token',\n })}\n endAction={\n <Button\n startIcon={<ArrowClockwise />}\n loading={isLoadingConfirmation}\n onClick={handleConfirmRegeneration}\n >\n {formatMessage({\n id: 'Settings.tokens.Button.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n }\n >\n {formatMessage({\n id: 'Settings.tokens.popUpWarning.message',\n defaultMessage: 'Are you sure you want to regenerate this token?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\ninterface Token {\n id: Data.ID;\n name: string;\n}\n\ninterface FormHeadProps<TToken extends Token | null> {\n title: MessageDescriptor;\n token: TToken;\n canEditInputs: boolean;\n canRegenerate: boolean;\n canShowToken?: boolean;\n setToken: (token: TToken) => void;\n toggleToken?: () => void;\n showToken?: boolean;\n isSubmitting: boolean;\n regenerateUrl: string;\n}\n\nexport const FormHead = <TToken extends Token | null>({\n title,\n token,\n setToken,\n toggleToken,\n showToken,\n canShowToken,\n canEditInputs,\n canRegenerate,\n isSubmitting,\n regenerateUrl,\n}: FormHeadProps<TToken>) => {\n const { formatMessage } = useIntl();\n const handleRegenerate = (newKey: string) => {\n setToken({\n ...token,\n accessKey: newKey,\n });\n toggleToken?.();\n };\n\n return (\n <Layouts.Header\n title={token?.name || formatMessage(title)}\n primaryAction={\n canEditInputs ? (\n <Flex width=\"100%\" gap={2} wrap={{ initial: 'wrap', medium: 'nowrap' }}>\n {canRegenerate && token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )}\n <Flex width=\"100%\" gap={2}>\n {token?.id && toggleToken && (\n <tours.apiTokens.ViewAPIToken>\n <Tooltip\n label={\n !canShowToken &&\n formatMessage({\n id: 'Settings.tokens.encryptionKeyMissing',\n defaultMessage:\n 'In order to view the token, you need a valid encryption key in the admin configuration',\n })\n }\n >\n <ActionButton\n type=\"button\"\n startIcon={showToken ? <EyeStriked /> : <Eye />}\n variant=\"secondary\"\n onClick={() => toggleToken?.()}\n disabled={!canShowToken}\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.viewToken',\n defaultMessage: 'View token',\n })}\n </ActionButton>\n </Tooltip>\n </tours.apiTokens.ViewAPIToken>\n )}\n <ActionButton\n disabled={isSubmitting}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </ActionButton>\n </Flex>\n </Flex>\n ) : (\n canRegenerate &&\n token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )\n )\n }\n navigationAction={\n // The back link for mobile works differently; it is placed higher up in the DOM.\n <Box display={{ initial: 'none', medium: 'block' }}>\n <BackButton />\n </Box>\n }\n ellipsis\n />\n );\n};\n"],"names":["ActionButton","styled","Button","Regenerate","onRegenerate","url","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","isLoadingConfirmation","setIsLoadingConfirmation","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","regenerateToken","useRegenerateTokenMutation","regenerateData","res","type","message","error","data","accessKey","id","defaultMessage","handleConfirmRegeneration","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Trigger","startIcon","ArrowClockwise","size","variant","onClick","name","fullWidth","ConfirmDialog","title","endAction","loading","FormHead","token","setToken","toggleToken","showToken","canShowToken","canEditInputs","canRegenerate","isSubmitting","regenerateUrl","handleRegenerate","newKey","Layouts","Header","primaryAction","Flex","width","gap","wrap","initial","medium","tours","apiTokens","ViewAPIToken","Tooltip","label","EyeStriked","Eye","disabled","Check","navigationAction","Box","display","BackButton","ellipsis"],"mappings":"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"}
1
+ {"version":3,"file":"FormHead.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormHead.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Tooltip } from '@strapi/design-system';\nimport { Check, ArrowClockwise, Eye, EyeStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ConfirmDialog } from '../../../../components/ConfirmDialog';\nimport { tours } from '../../../../components/GuidedTour/Tours';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useRegenerateTokenMutation } from '../../../../services/transferTokens';\n\nimport type { Data } from '@strapi/types';\n\ninterface RegenerateProps {\n onRegenerate?: (newKey: string) => void;\n url: string;\n}\n\nconst ActionButton = styled(Button)`\n white-space: nowrap;\n`;\n\nconst Regenerate = ({ onRegenerate, url }: RegenerateProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const [isLoadingConfirmation, setIsLoadingConfirmation] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [regenerateToken] = useRegenerateTokenMutation();\n\n const regenerateData = async () => {\n try {\n const res = await regenerateToken(url);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n if (onRegenerate) {\n onRegenerate(res.data.accessKey);\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n } finally {\n setIsLoadingConfirmation(false);\n }\n };\n\n const handleConfirmRegeneration = async () => {\n regenerateData();\n setShowConfirmDialog(false);\n };\n\n return (\n <Dialog.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Dialog.Trigger>\n <ActionButton\n startIcon={<ArrowClockwise />}\n type=\"button\"\n size=\"S\"\n variant=\"tertiary\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"regenerate\"\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </ActionButton>\n </Dialog.Trigger>\n\n <ConfirmDialog\n title={formatMessage({\n id: 'Settings.tokens.RegenerateDialog.title',\n defaultMessage: 'Regenerate token',\n })}\n endAction={\n <Button\n startIcon={<ArrowClockwise />}\n loading={isLoadingConfirmation}\n onClick={handleConfirmRegeneration}\n >\n {formatMessage({\n id: 'Settings.tokens.Button.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n }\n >\n {formatMessage({\n id: 'Settings.tokens.popUpWarning.message',\n defaultMessage: 'Are you sure you want to regenerate this token?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\ninterface Token {\n id: Data.ID;\n name: string;\n}\n\ninterface FormHeadProps<TToken extends Token | null> {\n title: MessageDescriptor;\n token: TToken;\n canEditInputs: boolean;\n canRegenerate: boolean;\n canShowToken?: boolean;\n setToken: (token: TToken) => void;\n toggleToken?: () => void;\n showToken?: boolean;\n isSubmitting: boolean;\n regenerateUrl: string;\n}\n\nexport const FormHead = <TToken extends Token | null>({\n title,\n token,\n setToken,\n toggleToken,\n showToken,\n canShowToken,\n canEditInputs,\n canRegenerate,\n isSubmitting,\n regenerateUrl,\n}: FormHeadProps<TToken>) => {\n const { formatMessage } = useIntl();\n const handleRegenerate = (newKey: string) => {\n setToken({\n ...token,\n accessKey: newKey,\n });\n toggleToken?.();\n };\n\n return (\n <Layouts.Header\n title={token?.name || formatMessage(title)}\n primaryAction={\n canEditInputs ? (\n <Flex width=\"100%\" gap={2} wrap={{ initial: 'wrap', medium: 'nowrap' }}>\n {canRegenerate && token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )}\n <Flex width=\"100%\" gap={2}>\n {token?.id && toggleToken && canShowToken === true && (\n <tours.apiTokens.ViewAPIToken>\n <Tooltip\n label={\n !canShowToken &&\n formatMessage({\n id: 'Settings.tokens.encryptionKeyMissing',\n defaultMessage:\n 'In order to view the token, you need a valid encryption key in the admin configuration',\n })\n }\n >\n <ActionButton\n type=\"button\"\n startIcon={showToken ? <EyeStriked /> : <Eye />}\n variant=\"secondary\"\n onClick={() => toggleToken?.()}\n disabled={!canShowToken}\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.viewToken',\n defaultMessage: 'View token',\n })}\n </ActionButton>\n </Tooltip>\n </tours.apiTokens.ViewAPIToken>\n )}\n <ActionButton\n disabled={isSubmitting}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </ActionButton>\n </Flex>\n </Flex>\n ) : (\n canRegenerate &&\n token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )\n )\n }\n navigationAction={\n // The back link for mobile works differently; it is placed higher up in the DOM.\n <Box display={{ initial: 'none', medium: 'block' }}>\n <BackButton />\n </Box>\n }\n ellipsis\n />\n );\n};\n"],"names":["ActionButton","styled","Button","Regenerate","onRegenerate","url","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","isLoadingConfirmation","setIsLoadingConfirmation","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","regenerateToken","useRegenerateTokenMutation","regenerateData","res","type","message","error","data","accessKey","id","defaultMessage","handleConfirmRegeneration","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Trigger","startIcon","ArrowClockwise","size","variant","onClick","name","fullWidth","ConfirmDialog","title","endAction","loading","FormHead","token","setToken","toggleToken","showToken","canShowToken","canEditInputs","canRegenerate","isSubmitting","regenerateUrl","handleRegenerate","newKey","Layouts","Header","primaryAction","Flex","width","gap","wrap","initial","medium","tours","apiTokens","ViewAPIToken","Tooltip","label","EyeStriked","Eye","disabled","Check","navigationAction","Box","display","BackButton","ellipsis"],"mappings":"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"}
@@ -119,7 +119,7 @@ const FormHead = ({ title, token, setToken, toggleToken, showToken, canShowToken
119
119
  width: "100%",
120
120
  gap: 2,
121
121
  children: [
122
- token?.id && toggleToken && /*#__PURE__*/ jsx(tours.apiTokens.ViewAPIToken, {
122
+ token?.id && toggleToken && canShowToken === true && /*#__PURE__*/ jsx(tours.apiTokens.ViewAPIToken, {
123
123
  children: /*#__PURE__*/ jsx(Tooltip, {
124
124
  label: !canShowToken && formatMessage({
125
125
  id: 'Settings.tokens.encryptionKeyMissing',