@strapi/admin 4.7.0-beta.0 → 4.9.0-alpha.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 (257) hide show
  1. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +6 -14
  2. package/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +1 -1
  3. package/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js +2 -0
  4. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +39 -9
  5. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +9 -15
  6. package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +4 -12
  7. package/admin/src/content-manager/pages/EditView/DeleteLink/index.js +6 -8
  8. package/admin/src/content-manager/pages/ListView/index.js +6 -11
  9. package/admin/src/hooks/useRegenerate/index.js +2 -2
  10. package/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js +0 -7
  11. package/admin/src/index.js +1 -0
  12. package/admin/src/pages/SettingsPage/components/SettingsNav/index.js +15 -2
  13. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +3 -5
  14. package/admin/src/pages/SettingsPage/{components/Tokens/TokenBox → pages/ApiTokens/EditView/components/ContentBox}/index.js +17 -17
  15. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +142 -52
  16. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +78 -0
  17. package/admin/src/pages/SettingsPage/{components/Tokens → pages/ApiTokens/EditView/components}/FormHead/index.js +19 -36
  18. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +1 -5
  19. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +14 -37
  20. package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/DefaultButton/index.js +1 -1
  21. package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/DeleteButton/index.js +1 -1
  22. package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/ReadButton/index.js +0 -0
  23. package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/UpdateButton/index.js +0 -0
  24. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +112 -0
  25. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +13 -5
  26. package/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper.js +3 -20
  27. package/admin/src/pages/SettingsPage/utils/defaultRoutes.js +0 -33
  28. package/admin/src/permissions/defaultPermissions.js +2 -23
  29. package/admin/src/translations/ar.json +4 -4
  30. package/admin/src/translations/ca.json +4 -4
  31. package/admin/src/translations/cs.json +4 -4
  32. package/admin/src/translations/de.json +4 -4
  33. package/admin/src/translations/dk.json +4 -4
  34. package/admin/src/translations/en.json +9 -17
  35. package/admin/src/translations/es.json +4 -4
  36. package/admin/src/translations/eu.json +4 -4
  37. package/admin/src/translations/fr.json +4 -4
  38. package/admin/src/translations/gu.json +4 -4
  39. package/admin/src/translations/he.json +4 -4
  40. package/admin/src/translations/hi.json +4 -4
  41. package/admin/src/translations/hu.json +4 -4
  42. package/admin/src/translations/id.json +4 -4
  43. package/admin/src/translations/it.json +4 -4
  44. package/admin/src/translations/ja.json +4 -4
  45. package/admin/src/translations/ko.json +4 -4
  46. package/admin/src/translations/ml.json +4 -4
  47. package/admin/src/translations/ms.json +4 -4
  48. package/admin/src/translations/nl.json +4 -4
  49. package/admin/src/translations/no.json +4 -4
  50. package/admin/src/translations/pl.json +4 -4
  51. package/admin/src/translations/pt-BR.json +4 -4
  52. package/admin/src/translations/pt.json +4 -4
  53. package/admin/src/translations/ru.json +785 -789
  54. package/admin/src/translations/sa.json +4 -4
  55. package/admin/src/translations/sk.json +4 -4
  56. package/admin/src/translations/sv.json +4 -4
  57. package/admin/src/translations/th.json +4 -4
  58. package/admin/src/translations/tr.json +4 -4
  59. package/admin/src/translations/uk.json +4 -4
  60. package/admin/src/translations/vi.json +4 -4
  61. package/admin/src/translations/zh-Hans.json +4 -4
  62. package/admin/src/translations/zh.json +4 -4
  63. package/build/1683.d59d0f23.chunk.js +268 -0
  64. package/build/{4855.bd092921.chunk.js → 2223.1bfea951.chunk.js} +88 -88
  65. package/build/2743.646a1015.chunk.js +45 -0
  66. package/build/3075.3ee481f1.chunk.js +108 -0
  67. package/build/3632.2e378cf8.chunk.js +138 -0
  68. package/build/4318.cd55ce02.chunk.js +30 -0
  69. package/build/8633.00ccd382.chunk.js +1 -0
  70. package/build/9707.b36ed71e.chunk.js +96 -0
  71. package/build/{Admin-authenticatedApp.f29f6021.chunk.js → Admin-authenticatedApp.a73577e1.chunk.js} +2 -2
  72. package/build/{Admin_InternalErrorPage.157152a8.chunk.js → Admin_InternalErrorPage.178ddb90.chunk.js} +1 -1
  73. package/build/{Admin_homePage.b1730882.chunk.js → Admin_homePage.c2f5f27d.chunk.js} +2 -2
  74. package/build/{Admin_marketplace.ea0316c2.chunk.js → Admin_marketplace.1df49c42.chunk.js} +1 -1
  75. package/build/{Admin_pluginsPage.5c24f963.chunk.js → Admin_pluginsPage.8d824408.chunk.js} +2 -2
  76. package/build/{Admin_profilePage.59af1978.chunk.js → Admin_profilePage.cb667bc5.chunk.js} +2 -2
  77. package/build/Admin_settingsPage.f90615fb.chunk.js +178 -0
  78. package/build/{Upload_ConfigureTheView.3f2b6e6a.chunk.js → Upload_ConfigureTheView.d306009d.chunk.js} +1 -1
  79. package/build/admin-app.06f07029.chunk.js +112 -0
  80. package/build/admin-edit-roles-page.35199b9d.chunk.js +1 -0
  81. package/build/admin-edit-users.9e48b00d.chunk.js +10 -0
  82. package/build/admin-users.cf7b4151.chunk.js +11 -0
  83. package/build/{api-tokens-create-page.0db3aec1.chunk.js → api-tokens-create-page.a31c7fba.chunk.js} +1 -1
  84. package/build/{api-tokens-edit-page.671e0e26.chunk.js → api-tokens-edit-page.64fef287.chunk.js} +1 -1
  85. package/build/api-tokens-list-page.e600ad3e.chunk.js +16 -0
  86. package/build/ar-json.39e54aba.chunk.js +1 -0
  87. package/build/{audit-logs-settings-page.c3dce30d.chunk.js → audit-logs-settings-page.d4da4579.chunk.js} +1 -1
  88. package/build/{ca-json.f6a0f472.chunk.js → ca-json.4d999055.chunk.js} +1 -1
  89. package/build/content-manager.255c3a59.chunk.js +1139 -0
  90. package/build/{content-type-builder-list-view.79e84b36.chunk.js → content-type-builder-list-view.8d7a3d68.chunk.js} +5 -5
  91. package/build/content-type-builder.3c8558a5.chunk.js +126 -0
  92. package/build/cs-json.4b44411c.chunk.js +1 -0
  93. package/build/{de-json.30e1f35b.chunk.js → de-json.866f8a28.chunk.js} +1 -1
  94. package/build/{dk-json.e6d9ffa4.chunk.js → dk-json.10f7b1d1.chunk.js} +1 -1
  95. package/build/email-settings-page.b19f2eb2.chunk.js +10 -0
  96. package/build/en-json.1997583c.chunk.js +1 -0
  97. package/build/es-json.ea15c957.chunk.js +1 -0
  98. package/build/{eu-json.fceecd8b.chunk.js → eu-json.3bc24d60.chunk.js} +1 -1
  99. package/build/{fr-json.78545ef8.chunk.js → fr-json.e88fbdfd.chunk.js} +1 -1
  100. package/build/{gu-json.676518f2.chunk.js → gu-json.94f0d242.chunk.js} +1 -1
  101. package/build/{he-json.ad22e8cc.chunk.js → he-json.f0de8cdb.chunk.js} +1 -1
  102. package/build/{hi-json.19b51c09.chunk.js → hi-json.df3a7be2.chunk.js} +1 -1
  103. package/build/{hu-json.f947088f.chunk.js → hu-json.680e6eef.chunk.js} +1 -1
  104. package/build/{i18n-settings-page.b8d8753e.chunk.js → i18n-settings-page.a6b49eac.chunk.js} +1 -1
  105. package/build/{id-json.504daa84.chunk.js → id-json.e0d83d41.chunk.js} +1 -1
  106. package/build/index.html +1 -1
  107. package/build/{it-json.2fd90f4d.chunk.js → it-json.8be59205.chunk.js} +1 -1
  108. package/build/{ja-json.c9f12d0b.chunk.js → ja-json.97ee41ba.chunk.js} +1 -1
  109. package/build/{ko-json.ef463065.chunk.js → ko-json.4cbbf4f2.chunk.js} +1 -1
  110. package/build/main.7f308c20.js +4322 -0
  111. package/build/{ml-json.490f666c.chunk.js → ml-json.e3747091.chunk.js} +1 -1
  112. package/build/ms-json.0eddffd9.chunk.js +1 -0
  113. package/build/{nl-json.c416295a.chunk.js → nl-json.371a15ee.chunk.js} +1 -1
  114. package/build/{no-json.1a2258ba.chunk.js → no-json.9b3cd181.chunk.js} +1 -1
  115. package/build/{pl-json.8cf0c871.chunk.js → pl-json.e535cbce.chunk.js} +1 -1
  116. package/build/{pt-BR-json.51fab8d0.chunk.js → pt-BR-json.e5fafa46.chunk.js} +1 -1
  117. package/build/pt-json.ee554a41.chunk.js +1 -0
  118. package/build/review-workflows-settings.7b4be1b0.chunk.js +63 -0
  119. package/build/{ru-json.aa5cd123.chunk.js → ru-json.866f0ff1.chunk.js} +1 -1
  120. package/build/runtime~main.bf374148.js +2 -0
  121. package/build/{sa-json.f3fa5407.chunk.js → sa-json.7efeb257.chunk.js} +1 -1
  122. package/build/{sk-json.9ec60d9f.chunk.js → sk-json.7bbeb0af.chunk.js} +1 -1
  123. package/build/{sso-settings-page.b85ad080.chunk.js → sso-settings-page.ad2143dd.chunk.js} +1 -1
  124. package/build/{sv-json.c6b0c237.chunk.js → sv-json.dc40951f.chunk.js} +1 -1
  125. package/build/{th-json.6e68155c.chunk.js → th-json.f664b96d.chunk.js} +1 -1
  126. package/build/{tr-json.9f41dc08.chunk.js → tr-json.b79eae31.chunk.js} +1 -1
  127. package/build/uk-json.b7e38370.chunk.js +1 -0
  128. package/build/upload-settings.eb1a7908.chunk.js +84 -0
  129. package/build/upload.700e2c84.chunk.js +33 -0
  130. package/build/{users-advanced-settings-page.fce9908e.chunk.js → users-advanced-settings-page.aae212f2.chunk.js} +1 -1
  131. package/build/{users-email-settings-page.343d0ad2.chunk.js → users-email-settings-page.8a9b0da1.chunk.js} +1 -1
  132. package/build/{users-providers-settings-page.e5a9a3f1.chunk.js → users-providers-settings-page.e6be909d.chunk.js} +10 -10
  133. package/build/{users-roles-settings-page.66312f31.chunk.js → users-roles-settings-page.97d06a80.chunk.js} +3 -3
  134. package/build/vi-json.ee4c5537.chunk.js +1 -0
  135. package/build/webhook-edit-page.9eb0f789.chunk.js +75 -0
  136. package/build/webhook-list-page.66082323.chunk.js +42 -0
  137. package/build/{zh-Hans-json.9c0eac99.chunk.js → zh-Hans-json.30a18940.chunk.js} +1 -1
  138. package/build/{zh-json.f88f563d.chunk.js → zh-json.49d84433.chunk.js} +1 -1
  139. package/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js +12 -12
  140. package/ee/admin/hooks/useSettingsMenu/utils/customGlobalLinks.js +21 -13
  141. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js +137 -0
  142. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/index.js +42 -0
  143. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/AddStage.js +87 -0
  144. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/index.js +1 -0
  145. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js +90 -0
  146. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/index.js +1 -0
  147. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stages.js +77 -0
  148. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/index.js +1 -0
  149. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/constants.js +6 -0
  150. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js +63 -0
  151. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/index.js +3 -0
  152. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js +102 -0
  153. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/utils/getWorkflowValidationSchema.js +25 -0
  154. package/ee/admin/pages/SettingsPage/utils/customRoutes.js +16 -2
  155. package/ee/admin/permissions/customPermissions.js +7 -0
  156. package/ee/server/bootstrap.js +7 -1
  157. package/ee/server/config/admin-actions.js +10 -0
  158. package/ee/server/constants/default-stages.json +14 -0
  159. package/ee/server/constants/default-workflow.json +1 -0
  160. package/ee/server/constants/workflows.js +7 -0
  161. package/ee/server/content-types/index.js +9 -0
  162. package/ee/server/content-types/workflow/index.js +34 -0
  163. package/ee/server/content-types/workflow-stage/index.js +36 -0
  164. package/ee/server/controllers/index.js +2 -0
  165. package/ee/server/controllers/workflows/index.js +36 -0
  166. package/ee/server/controllers/workflows/stages/index.js +57 -0
  167. package/ee/server/index.js +1 -0
  168. package/ee/server/routes/index.js +87 -0
  169. package/ee/server/services/index.js +3 -0
  170. package/ee/server/services/review-workflows/review-workflows.js +54 -0
  171. package/ee/server/services/review-workflows/stages.js +133 -0
  172. package/ee/server/services/review-workflows/workflows.js +25 -0
  173. package/ee/server/utils/index.js +8 -0
  174. package/ee/server/utils/test.js +11 -0
  175. package/ee/server/validation/review-workflows.js +17 -0
  176. package/package.json +13 -13
  177. package/server/bootstrap.js +0 -2
  178. package/server/config/admin-actions.js +0 -64
  179. package/server/content-types/index.js +0 -2
  180. package/server/controllers/admin.js +0 -55
  181. package/server/controllers/api-token.js +5 -4
  182. package/server/controllers/index.js +0 -1
  183. package/server/register.js +9 -2
  184. package/server/routes/admin.js +0 -28
  185. package/server/routes/index.js +0 -2
  186. package/server/services/api-token.js +3 -2
  187. package/server/services/constants.js +0 -6
  188. package/server/services/index.js +0 -1
  189. package/server/strategies/api-token.js +2 -4
  190. package/server/strategies/index.js +0 -1
  191. package/server/utils/index.d.ts +0 -2
  192. package/server/validation/api-tokens.js +6 -1
  193. package/webpack.config.js +0 -3
  194. package/admin/src/pages/SettingsPage/components/Tokens/FormiTokenContainer/LifeSpanInput.js +0 -96
  195. package/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js +0 -98
  196. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +0 -73
  197. package/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +0 -135
  198. package/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js +0 -51
  199. package/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js +0 -46
  200. package/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +0 -69
  201. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +0 -105
  202. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js +0 -50
  203. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +0 -201
  204. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/getDateOfExpiration.js +0 -16
  205. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/index.js +0 -4
  206. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +0 -10
  207. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +0 -182
  208. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/utils/tableHeaders.js +0 -48
  209. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js +0 -14
  210. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js +0 -14
  211. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js +0 -12
  212. package/build/1683.c8aa7b7c.chunk.js +0 -268
  213. package/build/2743.6d1632f9.chunk.js +0 -45
  214. package/build/3075.dc3894fe.chunk.js +0 -108
  215. package/build/3632.0317b618.chunk.js +0 -138
  216. package/build/4649.15cc0afe.chunk.js +0 -30
  217. package/build/7259.aa68d808.chunk.js +0 -1
  218. package/build/7407.883fb1f5.chunk.js +0 -1
  219. package/build/9707.7290fd92.chunk.js +0 -96
  220. package/build/Admin_settingsPage.178dc6e3.chunk.js +0 -178
  221. package/build/admin-app.77a50e1f.chunk.js +0 -112
  222. package/build/admin-edit-roles-page.446b69dc.chunk.js +0 -1
  223. package/build/admin-edit-users.2ed69bfd.chunk.js +0 -10
  224. package/build/admin-users.fc003b10.chunk.js +0 -11
  225. package/build/api-tokens-list-page.7387102c.chunk.js +0 -16
  226. package/build/ar-json.932794f7.chunk.js +0 -1
  227. package/build/content-manager.42b24d46.chunk.js +0 -1139
  228. package/build/content-type-builder.855db321.chunk.js +0 -126
  229. package/build/cs-json.79879fb6.chunk.js +0 -1
  230. package/build/email-settings-page.d1fcc7a3.chunk.js +0 -10
  231. package/build/en-json.b0748970.chunk.js +0 -1
  232. package/build/es-json.e275481d.chunk.js +0 -1
  233. package/build/main.1022ed01.js +0 -4393
  234. package/build/ms-json.db87d8d3.chunk.js +0 -1
  235. package/build/pt-json.62927d1e.chunk.js +0 -1
  236. package/build/runtime~main.84941a97.js +0 -2
  237. package/build/transfer-tokens-create-page.16e23791.chunk.js +0 -1
  238. package/build/transfer-tokens-edit-page.3886c973.chunk.js +0 -1
  239. package/build/transfer-tokens-list-page.e8010a89.chunk.js +0 -16
  240. package/build/uk-json.b2fcd567.chunk.js +0 -1
  241. package/build/upload-settings.ef64bbf9.chunk.js +0 -84
  242. package/build/upload.c5730dfa.chunk.js +0 -33
  243. package/build/vi-json.f08d7d03.chunk.js +0 -1
  244. package/build/webhook-edit-page.73e51e64.chunk.js +0 -75
  245. package/build/webhook-list-page.1134f130.chunk.js +0 -42
  246. package/server/content-types/transfer-token-permission.js +0 -36
  247. package/server/content-types/transfer-token.js +0 -66
  248. package/server/controllers/transfer/index.js +0 -13
  249. package/server/controllers/transfer/runner.js +0 -24
  250. package/server/controllers/transfer/token.js +0 -131
  251. package/server/routes/transfer.js +0 -95
  252. package/server/services/transfer/index.js +0 -6
  253. package/server/services/transfer/permission.js +0 -22
  254. package/server/services/transfer/token.js +0 -409
  255. package/server/strategies/data-transfer.js +0 -107
  256. package/server/validation/transfer/index.js +0 -5
  257. package/server/validation/transfer/token.js +0 -34
@@ -1,14 +1,15 @@
1
1
  import React from 'react';
2
2
  import { useIntl } from 'react-intl';
3
+ import { usePersistentState } from '@strapi/helper-plugin';
3
4
  import PropTypes from 'prop-types';
4
5
  import { Box } from '@strapi/design-system/Box';
5
6
  import { Grid, GridItem } from '@strapi/design-system/Grid';
7
+ import { Select, Option } from '@strapi/design-system/Select';
6
8
  import { Stack } from '@strapi/design-system/Stack';
9
+ import { Textarea } from '@strapi/design-system/Textarea';
10
+ import { TextInput } from '@strapi/design-system/TextInput';
7
11
  import { Typography } from '@strapi/design-system/Typography';
8
- import LifeSpanInput from '../../../../../components/Tokens/LifeSpanInput';
9
- import TokenName from '../../../../../components/Tokens/TokenName';
10
- import TokenDescription from '../../../../../components/Tokens/TokenDescription';
11
- import TokenTypeSelect from '../../../../../components/Tokens/TokenTypeSelect';
12
+ import { getDateOfExpiration } from '../../utils';
12
13
 
13
14
  const FormApiTokenContainer = ({
14
15
  errors,
@@ -21,6 +22,7 @@ const FormApiTokenContainer = ({
21
22
  setHasChangedPermissions,
22
23
  }) => {
23
24
  const { formatMessage } = useIntl();
25
+ const [lang] = usePersistentState('strapi-admin-language', 'en');
24
26
 
25
27
  const handleChangeSelectApiTokenType = ({ target: { value } }) => {
26
28
  setHasChangedPermissions(false);
@@ -37,30 +39,6 @@ const FormApiTokenContainer = ({
37
39
  }
38
40
  };
39
41
 
40
- const typeOptions = [
41
- {
42
- value: 'read-only',
43
- label: {
44
- id: 'Settings.apiTokens.types.read-only',
45
- defaultMessage: 'Read-only',
46
- },
47
- },
48
- {
49
- value: 'full-access',
50
- label: {
51
- id: 'Settings.apiTokens.types.full-access',
52
- defaultMessage: 'Full access',
53
- },
54
- },
55
- {
56
- value: 'custom',
57
- label: {
58
- id: 'Settings.apiTokens.types.custom',
59
- defaultMessage: 'Custom',
60
- },
61
- },
62
- ];
63
-
64
42
  return (
65
43
  <Box
66
44
  background="neutral0"
@@ -80,46 +58,158 @@ const FormApiTokenContainer = ({
80
58
  </Typography>
81
59
  <Grid gap={5}>
82
60
  <GridItem key="name" col={6} xs={12}>
83
- <TokenName
84
- errors={errors}
85
- values={values}
86
- canEditInputs={canEditInputs}
61
+ <TextInput
62
+ name="name"
63
+ error={
64
+ errors.name
65
+ ? formatMessage(
66
+ errors.name?.id
67
+ ? errors.name
68
+ : { id: errors.name, defaultMessage: errors.name }
69
+ )
70
+ : null
71
+ }
72
+ label={formatMessage({
73
+ id: 'Settings.apiTokens.form.name',
74
+ defaultMessage: 'Name',
75
+ })}
87
76
  onChange={onChange}
77
+ value={values.name}
78
+ disabled={!canEditInputs}
79
+ required
88
80
  />
89
81
  </GridItem>
90
82
  <GridItem key="description" col={6} xs={12}>
91
- <TokenDescription
92
- errors={errors}
93
- values={values}
94
- canEditInputs={canEditInputs}
83
+ <Textarea
84
+ label={formatMessage({
85
+ id: 'Settings.apiTokens.form.description',
86
+ defaultMessage: 'Description',
87
+ })}
88
+ name="description"
89
+ error={
90
+ errors.description
91
+ ? formatMessage(
92
+ errors.description?.id
93
+ ? errors.description
94
+ : {
95
+ id: errors.description,
96
+ defaultMessage: errors.description,
97
+ }
98
+ )
99
+ : null
100
+ }
95
101
  onChange={onChange}
96
- />
102
+ disabled={!canEditInputs}
103
+ >
104
+ {values.description}
105
+ </Textarea>
97
106
  </GridItem>
98
107
  <GridItem key="lifespan" col={6} xs={12}>
99
- <LifeSpanInput
100
- isCreating={isCreating}
101
- errors={errors}
102
- values={values}
103
- onChange={onChange}
104
- token={apiToken}
105
- />
108
+ <Select
109
+ name="lifespan"
110
+ label={formatMessage({
111
+ id: 'Settings.apiTokens.form.duration',
112
+ defaultMessage: 'Token duration',
113
+ })}
114
+ value={values.lifespan !== null ? values.lifespan : '0'}
115
+ error={
116
+ errors.lifespan
117
+ ? formatMessage(
118
+ errors.lifespan?.id
119
+ ? errors.lifespan
120
+ : { id: errors.lifespan, defaultMessage: errors.lifespan }
121
+ )
122
+ : null
123
+ }
124
+ onChange={(value) => {
125
+ onChange({ target: { name: 'lifespan', value } });
126
+ }}
127
+ required
128
+ disabled={!isCreating}
129
+ placeholder="Select"
130
+ >
131
+ <Option value="604800000">
132
+ {formatMessage({
133
+ id: 'Settings.apiTokens.duration.7-days',
134
+ defaultMessage: '7 days',
135
+ })}
136
+ </Option>
137
+ <Option value="2592000000">
138
+ {formatMessage({
139
+ id: 'Settings.apiTokens.duration.30-days',
140
+ defaultMessage: '30 days',
141
+ })}
142
+ </Option>
143
+ <Option value="7776000000">
144
+ {formatMessage({
145
+ id: 'Settings.apiTokens.duration.90-days',
146
+ defaultMessage: '90 days',
147
+ })}
148
+ </Option>
149
+ <Option value="0">
150
+ {formatMessage({
151
+ id: 'Settings.apiTokens.duration.unlimited',
152
+ defaultMessage: 'Unlimited',
153
+ })}
154
+ </Option>
155
+ </Select>
156
+ <Typography variant="pi" textColor="neutral600">
157
+ {!isCreating &&
158
+ `${formatMessage({
159
+ id: 'Settings.apiTokens.duration.expiration-date',
160
+ defaultMessage: 'Expiration date',
161
+ })}: ${getDateOfExpiration(
162
+ apiToken?.createdAt,
163
+ parseInt(values.lifespan, 10),
164
+ lang
165
+ )}`}
166
+ </Typography>
106
167
  </GridItem>
107
168
 
108
169
  <GridItem key="type" col={6} xs={12}>
109
- <TokenTypeSelect
110
- values={values}
111
- errors={errors}
112
- label={{
170
+ <Select
171
+ name="type"
172
+ label={formatMessage({
113
173
  id: 'Settings.apiTokens.form.type',
114
174
  defaultMessage: 'Token type',
115
- }}
175
+ })}
176
+ value={values?.type}
177
+ error={
178
+ errors.type
179
+ ? formatMessage(
180
+ errors.type?.id
181
+ ? errors.type
182
+ : { id: errors.type, defaultMessage: errors.type }
183
+ )
184
+ : null
185
+ }
116
186
  onChange={(value) => {
117
187
  handleChangeSelectApiTokenType({ target: { value } });
118
188
  onChange({ target: { name: 'type', value } });
119
189
  }}
120
- options={typeOptions}
121
- canEditInputs={canEditInputs}
122
- />
190
+ placeholder="Select"
191
+ required
192
+ disabled={!canEditInputs}
193
+ >
194
+ <Option value="read-only">
195
+ {formatMessage({
196
+ id: 'Settings.apiTokens.types.read-only',
197
+ defaultMessage: 'Read-only',
198
+ })}
199
+ </Option>
200
+ <Option value="full-access">
201
+ {formatMessage({
202
+ id: 'Settings.apiTokens.types.full-access',
203
+ defaultMessage: 'Full access',
204
+ })}
205
+ </Option>
206
+ <Option value="custom">
207
+ {formatMessage({
208
+ id: 'Settings.apiTokens.types.custom',
209
+ defaultMessage: 'Custom',
210
+ })}
211
+ </Option>
212
+ </Select>
123
213
  </GridItem>
124
214
  </Grid>
125
215
  </Stack>
@@ -0,0 +1,78 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { ContentLayout } from '@strapi/design-system/Layout';
4
+ import { Stack } from '@strapi/design-system/Stack';
5
+ import HeaderContentBox from '../ContentBox';
6
+ import FormApiTokenContainer from '../FormApiTokenContainer';
7
+ import Permissions from '../Permissions';
8
+
9
+ const FormBody = ({
10
+ apiToken,
11
+ errors,
12
+ onChange,
13
+ canEditInputs,
14
+ isCreating,
15
+ values,
16
+ onDispatch,
17
+ setHasChangedPermissions,
18
+ }) => {
19
+ return (
20
+ <ContentLayout>
21
+ <Stack spacing={6}>
22
+ {Boolean(apiToken?.name) && <HeaderContentBox apiToken={apiToken?.accessKey} />}
23
+ <FormApiTokenContainer
24
+ errors={errors}
25
+ onChange={onChange}
26
+ canEditInputs={canEditInputs}
27
+ isCreating={isCreating}
28
+ values={values}
29
+ apiToken={apiToken}
30
+ onDispatch={onDispatch}
31
+ setHasChangedPermissions={setHasChangedPermissions}
32
+ />
33
+ <Permissions
34
+ disabled={
35
+ !canEditInputs || values?.type === 'read-only' || values?.type === 'full-access'
36
+ }
37
+ />
38
+ </Stack>
39
+ </ContentLayout>
40
+ );
41
+ };
42
+
43
+ FormBody.propTypes = {
44
+ errors: PropTypes.shape({
45
+ name: PropTypes.string,
46
+ description: PropTypes.string,
47
+ lifespan: PropTypes.string,
48
+ type: PropTypes.string,
49
+ }),
50
+ apiToken: PropTypes.shape({
51
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
52
+ type: PropTypes.string,
53
+ lifespan: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
54
+ name: PropTypes.string,
55
+ accessKey: PropTypes.string,
56
+ permissions: PropTypes.array,
57
+ description: PropTypes.string,
58
+ createdAt: PropTypes.string,
59
+ }),
60
+ onChange: PropTypes.func.isRequired,
61
+ canEditInputs: PropTypes.bool.isRequired,
62
+ isCreating: PropTypes.bool.isRequired,
63
+ values: PropTypes.shape({
64
+ name: PropTypes.string,
65
+ description: PropTypes.string,
66
+ lifespan: PropTypes.string,
67
+ type: PropTypes.string,
68
+ }).isRequired,
69
+ onDispatch: PropTypes.func.isRequired,
70
+ setHasChangedPermissions: PropTypes.func.isRequired,
71
+ };
72
+
73
+ FormBody.defaultProps = {
74
+ errors: {},
75
+ apiToken: {},
76
+ };
77
+
78
+ export default FormBody;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { useIntl } from 'react-intl';
3
- import PropTypes from 'prop-types';
4
3
  import { Link } from '@strapi/helper-plugin';
4
+ import PropTypes from 'prop-types';
5
5
  import ArrowLeft from '@strapi/icons/ArrowLeft';
6
6
  import Check from '@strapi/icons/Check';
7
7
  import { Button } from '@strapi/design-system/Button';
@@ -9,36 +9,29 @@ import { HeaderLayout } from '@strapi/design-system/Layout';
9
9
  import { Stack } from '@strapi/design-system/Stack';
10
10
  import Regenerate from '../Regenerate';
11
11
 
12
- const FormHead = ({
13
- title,
14
- token,
15
- setToken,
16
- canEditInputs,
17
- canRegenerate,
18
- isSubmitting,
19
- backUrl,
20
- regenerateUrl,
21
- }) => {
12
+ const FormHead = ({ apiToken, setApiToken, canEditInputs, canRegenerate, isSubmitting }) => {
22
13
  const { formatMessage } = useIntl();
23
14
  const handleRegenerate = (newKey) => {
24
- setToken({
25
- ...token,
15
+ setApiToken({
16
+ ...apiToken,
26
17
  accessKey: newKey,
27
18
  });
28
19
  };
29
20
 
30
21
  return (
31
22
  <HeaderLayout
32
- title={token?.name || formatMessage(title)}
23
+ title={
24
+ apiToken?.name ||
25
+ formatMessage({
26
+ id: 'Settings.apiTokens.createPage.title',
27
+ defaultMessage: 'Create API Token',
28
+ })
29
+ }
33
30
  primaryAction={
34
31
  canEditInputs ? (
35
32
  <Stack horizontal spacing={2}>
36
- {canRegenerate && token?.id && (
37
- <Regenerate
38
- backUrl={regenerateUrl}
39
- onRegenerate={handleRegenerate}
40
- idToRegenerate={token?.id}
41
- />
33
+ {canRegenerate && apiToken?.id && (
34
+ <Regenerate onRegenerate={handleRegenerate} idToRegenerate={apiToken?.id} />
42
35
  )}
43
36
  <Button
44
37
  disabled={isSubmitting}
@@ -55,17 +48,13 @@ const FormHead = ({
55
48
  </Stack>
56
49
  ) : (
57
50
  canRegenerate &&
58
- token?.id && (
59
- <Regenerate
60
- onRegenerate={handleRegenerate}
61
- idToRegenerate={token?.id}
62
- backUrl={regenerateUrl}
63
- />
51
+ apiToken?.id && (
52
+ <Regenerate onRegenerate={handleRegenerate} idToRegenerate={apiToken?.id} />
64
53
  )
65
54
  )
66
55
  }
67
56
  navigationAction={
68
- <Link startIcon={<ArrowLeft />} to={backUrl}>
57
+ <Link startIcon={<ArrowLeft />} to="/settings/api-tokens">
69
58
  {formatMessage({
70
59
  id: 'global.back',
71
60
  defaultMessage: 'Back',
@@ -77,7 +66,7 @@ const FormHead = ({
77
66
  };
78
67
 
79
68
  FormHead.propTypes = {
80
- token: PropTypes.shape({
69
+ apiToken: PropTypes.shape({
81
70
  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
82
71
  type: PropTypes.string,
83
72
  lifespan: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
@@ -89,18 +78,12 @@ FormHead.propTypes = {
89
78
  }),
90
79
  canEditInputs: PropTypes.bool.isRequired,
91
80
  canRegenerate: PropTypes.bool.isRequired,
92
- setToken: PropTypes.func.isRequired,
81
+ setApiToken: PropTypes.func.isRequired,
93
82
  isSubmitting: PropTypes.bool.isRequired,
94
- backUrl: PropTypes.string.isRequired,
95
- title: PropTypes.shape({
96
- id: PropTypes.string,
97
- label: PropTypes.string,
98
- }).isRequired,
99
- regenerateUrl: PropTypes.string.isRequired,
100
83
  };
101
84
 
102
85
  FormHead.defaultProps = {
103
- token: undefined,
86
+ apiToken: undefined,
104
87
  };
105
88
 
106
89
  export default FormHead;
@@ -9,11 +9,7 @@ import { useRegenerate } from '../../../../../../../hooks';
9
9
  export const Regenerate = ({ onRegenerate, idToRegenerate }) => {
10
10
  const { formatMessage } = useIntl();
11
11
  const [showConfirmDialog, setShowConfirmDialog] = useState(false);
12
- const { regenerateData, isLoadingConfirmation } = useRegenerate(
13
- '/admin/api-tokens/',
14
- idToRegenerate,
15
- onRegenerate
16
- );
12
+ const { regenerateData, isLoadingConfirmation } = useRegenerate(idToRegenerate, onRegenerate);
17
13
  const handleConfirmRegeneration = async () => {
18
14
  regenerateData();
19
15
  setShowConfirmDialog(false);
@@ -15,19 +15,15 @@ import { Main } from '@strapi/design-system/Main';
15
15
  import { Formik } from 'formik';
16
16
  import { useRouteMatch, useHistory } from 'react-router-dom';
17
17
  import { useQuery } from 'react-query';
18
- import { ContentLayout } from '@strapi/design-system/Layout';
19
- import { Stack } from '@strapi/design-system/Stack';
20
18
  import { formatAPIErrors } from '../../../../../utils';
21
19
  import { schema } from './utils';
22
20
  import LoadingView from './components/LoadingView';
21
+ import FormHead from './components/FormHead';
22
+ import FormBody from './components/FormBody';
23
23
  import adminPermissions from '../../../../../permissions';
24
24
  import { ApiTokenPermissionsContextProvider } from '../../../../../contexts/ApiTokenPermissions';
25
25
  import init from './init';
26
26
  import reducer, { initialState } from './reducer';
27
- import Permissions from './components/Permissions';
28
- import FormApiTokenContainer from './components/FormApiTokenContainer';
29
- import TokenBox from '../../../components/Tokens/TokenBox';
30
- import FormHead from '../../../components/Tokens/FormHead';
31
27
 
32
28
  const MSG_ERROR_NAME_TAKEN = 'Name already taken';
33
29
 
@@ -284,41 +280,22 @@ const ApiTokenCreateView = () => {
284
280
  return (
285
281
  <Form>
286
282
  <FormHead
287
- backUrl="/settings/api-tokens"
288
- title={{
289
- id: 'Settings.apiTokens.createPage.title',
290
- defaultMessage: 'Create API Token',
291
- }}
292
- token={apiToken}
293
- setToken={setApiToken}
283
+ apiToken={apiToken}
284
+ setApiToken={setApiToken}
294
285
  canEditInputs={canEditInputs}
295
286
  canRegenerate={canRegenerate}
296
287
  isSubmitting={isSubmitting}
297
- regenerateUrl="/admin/api-tokens/"
298
288
  />
299
-
300
- <ContentLayout>
301
- <Stack spacing={6}>
302
- {Boolean(apiToken?.name) && <TokenBox token={apiToken?.accessKey} />}
303
- <FormApiTokenContainer
304
- errors={errors}
305
- onChange={handleChange}
306
- canEditInputs={canEditInputs}
307
- isCreating={isCreating}
308
- values={values}
309
- apiToken={apiToken}
310
- onDispatch={dispatch}
311
- setHasChangedPermissions={setHasChangedPermissions}
312
- />
313
- <Permissions
314
- disabled={
315
- !canEditInputs ||
316
- values?.type === 'read-only' ||
317
- values?.type === 'full-access'
318
- }
319
- />
320
- </Stack>
321
- </ContentLayout>
289
+ <FormBody
290
+ apiToken={apiToken}
291
+ errors={errors}
292
+ onChange={handleChange}
293
+ canEditInputs={canEditInputs}
294
+ isCreating={isCreating}
295
+ values={values}
296
+ onDispatch={dispatch}
297
+ setHasChangedPermissions={setHasChangedPermissions}
298
+ />
322
299
  </Form>
323
300
  );
324
301
  }}
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { useIntl } from 'react-intl';
3
3
  import PropTypes from 'prop-types';
4
+ import { Link } from '@strapi/helper-plugin';
4
5
  import { useHistory } from 'react-router-dom';
5
6
  import styled from 'styled-components';
6
- import { Link } from '@strapi/helper-plugin';
7
7
 
8
8
  const MESSAGES_MAP = {
9
9
  edit: {
@@ -8,7 +8,7 @@ import PropTypes from 'prop-types';
8
8
 
9
9
  const DeleteButton = ({ tokenName, onClickDelete }) => {
10
10
  const { formatMessage } = useIntl();
11
- const { trackUsage } = useTracking(); // TODO: Track different types of tokens
11
+ const { trackUsage } = useTracking();
12
12
 
13
13
  return (
14
14
  <Box paddingLeft={1} {...stopPropagation}>
@@ -0,0 +1,112 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useHistory } from 'react-router-dom';
4
+
5
+ import { Typography } from '@strapi/design-system/Typography';
6
+ import { Tbody, Tr, Td } from '@strapi/design-system/Table';
7
+ import { Flex } from '@strapi/design-system/Flex';
8
+ import {
9
+ RelativeTime,
10
+ useQueryParams,
11
+ onRowClick,
12
+ pxToRem,
13
+ useTracking,
14
+ } from '@strapi/helper-plugin';
15
+ import DeleteButton from './DeleteButton';
16
+ import UpdateButton from './UpdateButton';
17
+ import ReadButton from './ReadButton';
18
+
19
+ const TableRows = ({ canDelete, canUpdate, canRead, onClickDelete, withBulkActions, rows }) => {
20
+ const [{ query }] = useQueryParams();
21
+ const [, sortOrder] = query.sort.split(':');
22
+ const {
23
+ push,
24
+ location: { pathname },
25
+ } = useHistory();
26
+ const { trackUsage } = useTracking();
27
+
28
+ const apiTokens = rows.sort((a, b) => {
29
+ const comparaison = a.name.localeCompare(b.name);
30
+
31
+ return sortOrder === 'DESC' ? -comparaison : comparaison;
32
+ });
33
+
34
+ return (
35
+ <Tbody>
36
+ {apiTokens.map((apiToken) => {
37
+ return (
38
+ <Tr
39
+ key={apiToken.id}
40
+ {...onRowClick({
41
+ fn() {
42
+ trackUsage('willEditTokenFromList');
43
+ push(`${pathname}/${apiToken.id}`);
44
+ },
45
+ condition: canUpdate,
46
+ })}
47
+ >
48
+ <Td>
49
+ <Typography textColor="neutral800" fontWeight="bold">
50
+ {apiToken.name}
51
+ </Typography>
52
+ </Td>
53
+ <Td maxWidth={pxToRem(250)}>
54
+ <Typography textColor="neutral800" ellipsis>
55
+ {apiToken.description}
56
+ </Typography>
57
+ </Td>
58
+ <Td>
59
+ <Typography textColor="neutral800">
60
+ <RelativeTime timestamp={new Date(apiToken.createdAt)} />
61
+ </Typography>
62
+ </Td>
63
+ <Td>
64
+ {apiToken.lastUsedAt && (
65
+ <Typography textColor="neutral800">
66
+ <RelativeTime timestamp={new Date(apiToken.lastUsedAt)} />
67
+ </Typography>
68
+ )}
69
+ </Td>
70
+
71
+ {withBulkActions && (
72
+ <Td>
73
+ <Flex justifyContent="end">
74
+ {canUpdate && <UpdateButton tokenName={apiToken.name} tokenId={apiToken.id} />}
75
+ {!canUpdate && canRead && (
76
+ <ReadButton tokenName={apiToken.name} tokenId={apiToken.id} />
77
+ )}
78
+ {canDelete && (
79
+ <DeleteButton
80
+ tokenName={apiToken.name}
81
+ onClickDelete={() => onClickDelete(apiToken.id)}
82
+ />
83
+ )}
84
+ </Flex>
85
+ </Td>
86
+ )}
87
+ </Tr>
88
+ );
89
+ })}
90
+ </Tbody>
91
+ );
92
+ };
93
+
94
+ TableRows.defaultProps = {
95
+ canDelete: false,
96
+ canUpdate: false,
97
+ canRead: false,
98
+ onClickDelete() {},
99
+ rows: [],
100
+ withBulkActions: false,
101
+ };
102
+
103
+ TableRows.propTypes = {
104
+ canDelete: PropTypes.bool,
105
+ canUpdate: PropTypes.bool,
106
+ canRead: PropTypes.bool,
107
+ onClickDelete: PropTypes.func,
108
+ rows: PropTypes.array,
109
+ withBulkActions: PropTypes.bool,
110
+ };
111
+
112
+ export default TableRows;