@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.
- package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +6 -14
- package/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +1 -1
- package/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js +2 -0
- package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +39 -9
- package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +9 -15
- package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +4 -12
- package/admin/src/content-manager/pages/EditView/DeleteLink/index.js +6 -8
- package/admin/src/content-manager/pages/ListView/index.js +6 -11
- package/admin/src/hooks/useRegenerate/index.js +2 -2
- package/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js +0 -7
- package/admin/src/index.js +1 -0
- package/admin/src/pages/SettingsPage/components/SettingsNav/index.js +15 -2
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +3 -5
- package/admin/src/pages/SettingsPage/{components/Tokens/TokenBox → pages/ApiTokens/EditView/components/ContentBox}/index.js +17 -17
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +142 -52
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +78 -0
- package/admin/src/pages/SettingsPage/{components/Tokens → pages/ApiTokens/EditView/components}/FormHead/index.js +19 -36
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +1 -5
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +14 -37
- package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/DefaultButton/index.js +1 -1
- package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/DeleteButton/index.js +1 -1
- package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/ReadButton/index.js +0 -0
- package/admin/src/pages/SettingsPage/{components/Tokens/Table → pages/ApiTokens/ListView/DynamicTable}/UpdateButton/index.js +0 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +112 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +13 -5
- package/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper.js +3 -20
- package/admin/src/pages/SettingsPage/utils/defaultRoutes.js +0 -33
- package/admin/src/permissions/defaultPermissions.js +2 -23
- package/admin/src/translations/ar.json +4 -4
- package/admin/src/translations/ca.json +4 -4
- package/admin/src/translations/cs.json +4 -4
- package/admin/src/translations/de.json +4 -4
- package/admin/src/translations/dk.json +4 -4
- package/admin/src/translations/en.json +9 -17
- package/admin/src/translations/es.json +4 -4
- package/admin/src/translations/eu.json +4 -4
- package/admin/src/translations/fr.json +4 -4
- package/admin/src/translations/gu.json +4 -4
- package/admin/src/translations/he.json +4 -4
- package/admin/src/translations/hi.json +4 -4
- package/admin/src/translations/hu.json +4 -4
- package/admin/src/translations/id.json +4 -4
- package/admin/src/translations/it.json +4 -4
- package/admin/src/translations/ja.json +4 -4
- package/admin/src/translations/ko.json +4 -4
- package/admin/src/translations/ml.json +4 -4
- package/admin/src/translations/ms.json +4 -4
- package/admin/src/translations/nl.json +4 -4
- package/admin/src/translations/no.json +4 -4
- package/admin/src/translations/pl.json +4 -4
- package/admin/src/translations/pt-BR.json +4 -4
- package/admin/src/translations/pt.json +4 -4
- package/admin/src/translations/ru.json +785 -789
- package/admin/src/translations/sa.json +4 -4
- package/admin/src/translations/sk.json +4 -4
- package/admin/src/translations/sv.json +4 -4
- package/admin/src/translations/th.json +4 -4
- package/admin/src/translations/tr.json +4 -4
- package/admin/src/translations/uk.json +4 -4
- package/admin/src/translations/vi.json +4 -4
- package/admin/src/translations/zh-Hans.json +4 -4
- package/admin/src/translations/zh.json +4 -4
- package/build/1683.d59d0f23.chunk.js +268 -0
- package/build/{4855.bd092921.chunk.js → 2223.1bfea951.chunk.js} +88 -88
- package/build/2743.646a1015.chunk.js +45 -0
- package/build/3075.3ee481f1.chunk.js +108 -0
- package/build/3632.2e378cf8.chunk.js +138 -0
- package/build/4318.cd55ce02.chunk.js +30 -0
- package/build/8633.00ccd382.chunk.js +1 -0
- package/build/9707.b36ed71e.chunk.js +96 -0
- package/build/{Admin-authenticatedApp.f29f6021.chunk.js → Admin-authenticatedApp.a73577e1.chunk.js} +2 -2
- package/build/{Admin_InternalErrorPage.157152a8.chunk.js → Admin_InternalErrorPage.178ddb90.chunk.js} +1 -1
- package/build/{Admin_homePage.b1730882.chunk.js → Admin_homePage.c2f5f27d.chunk.js} +2 -2
- package/build/{Admin_marketplace.ea0316c2.chunk.js → Admin_marketplace.1df49c42.chunk.js} +1 -1
- package/build/{Admin_pluginsPage.5c24f963.chunk.js → Admin_pluginsPage.8d824408.chunk.js} +2 -2
- package/build/{Admin_profilePage.59af1978.chunk.js → Admin_profilePage.cb667bc5.chunk.js} +2 -2
- package/build/Admin_settingsPage.f90615fb.chunk.js +178 -0
- package/build/{Upload_ConfigureTheView.3f2b6e6a.chunk.js → Upload_ConfigureTheView.d306009d.chunk.js} +1 -1
- package/build/admin-app.06f07029.chunk.js +112 -0
- package/build/admin-edit-roles-page.35199b9d.chunk.js +1 -0
- package/build/admin-edit-users.9e48b00d.chunk.js +10 -0
- package/build/admin-users.cf7b4151.chunk.js +11 -0
- package/build/{api-tokens-create-page.0db3aec1.chunk.js → api-tokens-create-page.a31c7fba.chunk.js} +1 -1
- package/build/{api-tokens-edit-page.671e0e26.chunk.js → api-tokens-edit-page.64fef287.chunk.js} +1 -1
- package/build/api-tokens-list-page.e600ad3e.chunk.js +16 -0
- package/build/ar-json.39e54aba.chunk.js +1 -0
- package/build/{audit-logs-settings-page.c3dce30d.chunk.js → audit-logs-settings-page.d4da4579.chunk.js} +1 -1
- package/build/{ca-json.f6a0f472.chunk.js → ca-json.4d999055.chunk.js} +1 -1
- package/build/content-manager.255c3a59.chunk.js +1139 -0
- package/build/{content-type-builder-list-view.79e84b36.chunk.js → content-type-builder-list-view.8d7a3d68.chunk.js} +5 -5
- package/build/content-type-builder.3c8558a5.chunk.js +126 -0
- package/build/cs-json.4b44411c.chunk.js +1 -0
- package/build/{de-json.30e1f35b.chunk.js → de-json.866f8a28.chunk.js} +1 -1
- package/build/{dk-json.e6d9ffa4.chunk.js → dk-json.10f7b1d1.chunk.js} +1 -1
- package/build/email-settings-page.b19f2eb2.chunk.js +10 -0
- package/build/en-json.1997583c.chunk.js +1 -0
- package/build/es-json.ea15c957.chunk.js +1 -0
- package/build/{eu-json.fceecd8b.chunk.js → eu-json.3bc24d60.chunk.js} +1 -1
- package/build/{fr-json.78545ef8.chunk.js → fr-json.e88fbdfd.chunk.js} +1 -1
- package/build/{gu-json.676518f2.chunk.js → gu-json.94f0d242.chunk.js} +1 -1
- package/build/{he-json.ad22e8cc.chunk.js → he-json.f0de8cdb.chunk.js} +1 -1
- package/build/{hi-json.19b51c09.chunk.js → hi-json.df3a7be2.chunk.js} +1 -1
- package/build/{hu-json.f947088f.chunk.js → hu-json.680e6eef.chunk.js} +1 -1
- package/build/{i18n-settings-page.b8d8753e.chunk.js → i18n-settings-page.a6b49eac.chunk.js} +1 -1
- package/build/{id-json.504daa84.chunk.js → id-json.e0d83d41.chunk.js} +1 -1
- package/build/index.html +1 -1
- package/build/{it-json.2fd90f4d.chunk.js → it-json.8be59205.chunk.js} +1 -1
- package/build/{ja-json.c9f12d0b.chunk.js → ja-json.97ee41ba.chunk.js} +1 -1
- package/build/{ko-json.ef463065.chunk.js → ko-json.4cbbf4f2.chunk.js} +1 -1
- package/build/main.7f308c20.js +4322 -0
- package/build/{ml-json.490f666c.chunk.js → ml-json.e3747091.chunk.js} +1 -1
- package/build/ms-json.0eddffd9.chunk.js +1 -0
- package/build/{nl-json.c416295a.chunk.js → nl-json.371a15ee.chunk.js} +1 -1
- package/build/{no-json.1a2258ba.chunk.js → no-json.9b3cd181.chunk.js} +1 -1
- package/build/{pl-json.8cf0c871.chunk.js → pl-json.e535cbce.chunk.js} +1 -1
- package/build/{pt-BR-json.51fab8d0.chunk.js → pt-BR-json.e5fafa46.chunk.js} +1 -1
- package/build/pt-json.ee554a41.chunk.js +1 -0
- package/build/review-workflows-settings.7b4be1b0.chunk.js +63 -0
- package/build/{ru-json.aa5cd123.chunk.js → ru-json.866f0ff1.chunk.js} +1 -1
- package/build/runtime~main.bf374148.js +2 -0
- package/build/{sa-json.f3fa5407.chunk.js → sa-json.7efeb257.chunk.js} +1 -1
- package/build/{sk-json.9ec60d9f.chunk.js → sk-json.7bbeb0af.chunk.js} +1 -1
- package/build/{sso-settings-page.b85ad080.chunk.js → sso-settings-page.ad2143dd.chunk.js} +1 -1
- package/build/{sv-json.c6b0c237.chunk.js → sv-json.dc40951f.chunk.js} +1 -1
- package/build/{th-json.6e68155c.chunk.js → th-json.f664b96d.chunk.js} +1 -1
- package/build/{tr-json.9f41dc08.chunk.js → tr-json.b79eae31.chunk.js} +1 -1
- package/build/uk-json.b7e38370.chunk.js +1 -0
- package/build/upload-settings.eb1a7908.chunk.js +84 -0
- package/build/upload.700e2c84.chunk.js +33 -0
- package/build/{users-advanced-settings-page.fce9908e.chunk.js → users-advanced-settings-page.aae212f2.chunk.js} +1 -1
- package/build/{users-email-settings-page.343d0ad2.chunk.js → users-email-settings-page.8a9b0da1.chunk.js} +1 -1
- package/build/{users-providers-settings-page.e5a9a3f1.chunk.js → users-providers-settings-page.e6be909d.chunk.js} +10 -10
- package/build/{users-roles-settings-page.66312f31.chunk.js → users-roles-settings-page.97d06a80.chunk.js} +3 -3
- package/build/vi-json.ee4c5537.chunk.js +1 -0
- package/build/webhook-edit-page.9eb0f789.chunk.js +75 -0
- package/build/webhook-list-page.66082323.chunk.js +42 -0
- package/build/{zh-Hans-json.9c0eac99.chunk.js → zh-Hans-json.30a18940.chunk.js} +1 -1
- package/build/{zh-json.f88f563d.chunk.js → zh-json.49d84433.chunk.js} +1 -1
- package/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js +12 -12
- package/ee/admin/hooks/useSettingsMenu/utils/customGlobalLinks.js +21 -13
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js +137 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/index.js +42 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/AddStage.js +87 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/index.js +1 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js +90 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/index.js +1 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stages.js +77 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/index.js +1 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/constants.js +6 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js +63 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/index.js +3 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js +102 -0
- package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/utils/getWorkflowValidationSchema.js +25 -0
- package/ee/admin/pages/SettingsPage/utils/customRoutes.js +16 -2
- package/ee/admin/permissions/customPermissions.js +7 -0
- package/ee/server/bootstrap.js +7 -1
- package/ee/server/config/admin-actions.js +10 -0
- package/ee/server/constants/default-stages.json +14 -0
- package/ee/server/constants/default-workflow.json +1 -0
- package/ee/server/constants/workflows.js +7 -0
- package/ee/server/content-types/index.js +9 -0
- package/ee/server/content-types/workflow/index.js +34 -0
- package/ee/server/content-types/workflow-stage/index.js +36 -0
- package/ee/server/controllers/index.js +2 -0
- package/ee/server/controllers/workflows/index.js +36 -0
- package/ee/server/controllers/workflows/stages/index.js +57 -0
- package/ee/server/index.js +1 -0
- package/ee/server/routes/index.js +87 -0
- package/ee/server/services/index.js +3 -0
- package/ee/server/services/review-workflows/review-workflows.js +54 -0
- package/ee/server/services/review-workflows/stages.js +133 -0
- package/ee/server/services/review-workflows/workflows.js +25 -0
- package/ee/server/utils/index.js +8 -0
- package/ee/server/utils/test.js +11 -0
- package/ee/server/validation/review-workflows.js +17 -0
- package/package.json +13 -13
- package/server/bootstrap.js +0 -2
- package/server/config/admin-actions.js +0 -64
- package/server/content-types/index.js +0 -2
- package/server/controllers/admin.js +0 -55
- package/server/controllers/api-token.js +5 -4
- package/server/controllers/index.js +0 -1
- package/server/register.js +9 -2
- package/server/routes/admin.js +0 -28
- package/server/routes/index.js +0 -2
- package/server/services/api-token.js +3 -2
- package/server/services/constants.js +0 -6
- package/server/services/index.js +0 -1
- package/server/strategies/api-token.js +2 -4
- package/server/strategies/index.js +0 -1
- package/server/utils/index.d.ts +0 -2
- package/server/validation/api-tokens.js +6 -1
- package/webpack.config.js +0 -3
- package/admin/src/pages/SettingsPage/components/Tokens/FormiTokenContainer/LifeSpanInput.js +0 -96
- package/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js +0 -98
- package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +0 -73
- package/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +0 -135
- package/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js +0 -51
- package/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js +0 -46
- package/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +0 -69
- package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +0 -105
- package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js +0 -50
- package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +0 -201
- package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/getDateOfExpiration.js +0 -16
- package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/index.js +0 -4
- package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +0 -10
- package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +0 -182
- package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/utils/tableHeaders.js +0 -48
- package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js +0 -14
- package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js +0 -14
- package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js +0 -12
- package/build/1683.c8aa7b7c.chunk.js +0 -268
- package/build/2743.6d1632f9.chunk.js +0 -45
- package/build/3075.dc3894fe.chunk.js +0 -108
- package/build/3632.0317b618.chunk.js +0 -138
- package/build/4649.15cc0afe.chunk.js +0 -30
- package/build/7259.aa68d808.chunk.js +0 -1
- package/build/7407.883fb1f5.chunk.js +0 -1
- package/build/9707.7290fd92.chunk.js +0 -96
- package/build/Admin_settingsPage.178dc6e3.chunk.js +0 -178
- package/build/admin-app.77a50e1f.chunk.js +0 -112
- package/build/admin-edit-roles-page.446b69dc.chunk.js +0 -1
- package/build/admin-edit-users.2ed69bfd.chunk.js +0 -10
- package/build/admin-users.fc003b10.chunk.js +0 -11
- package/build/api-tokens-list-page.7387102c.chunk.js +0 -16
- package/build/ar-json.932794f7.chunk.js +0 -1
- package/build/content-manager.42b24d46.chunk.js +0 -1139
- package/build/content-type-builder.855db321.chunk.js +0 -126
- package/build/cs-json.79879fb6.chunk.js +0 -1
- package/build/email-settings-page.d1fcc7a3.chunk.js +0 -10
- package/build/en-json.b0748970.chunk.js +0 -1
- package/build/es-json.e275481d.chunk.js +0 -1
- package/build/main.1022ed01.js +0 -4393
- package/build/ms-json.db87d8d3.chunk.js +0 -1
- package/build/pt-json.62927d1e.chunk.js +0 -1
- package/build/runtime~main.84941a97.js +0 -2
- package/build/transfer-tokens-create-page.16e23791.chunk.js +0 -1
- package/build/transfer-tokens-edit-page.3886c973.chunk.js +0 -1
- package/build/transfer-tokens-list-page.e8010a89.chunk.js +0 -16
- package/build/uk-json.b2fcd567.chunk.js +0 -1
- package/build/upload-settings.ef64bbf9.chunk.js +0 -84
- package/build/upload.c5730dfa.chunk.js +0 -33
- package/build/vi-json.f08d7d03.chunk.js +0 -1
- package/build/webhook-edit-page.73e51e64.chunk.js +0 -75
- package/build/webhook-list-page.1134f130.chunk.js +0 -42
- package/server/content-types/transfer-token-permission.js +0 -36
- package/server/content-types/transfer-token.js +0 -66
- package/server/controllers/transfer/index.js +0 -13
- package/server/controllers/transfer/runner.js +0 -24
- package/server/controllers/transfer/token.js +0 -131
- package/server/routes/transfer.js +0 -95
- package/server/services/transfer/index.js +0 -6
- package/server/services/transfer/permission.js +0 -22
- package/server/services/transfer/token.js +0 -409
- package/server/strategies/data-transfer.js +0 -107
- package/server/validation/transfer/index.js +0 -5
- 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
|
|
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
|
-
<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
<
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
<
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
121
|
-
|
|
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
|
-
|
|
25
|
-
...
|
|
15
|
+
setApiToken({
|
|
16
|
+
...apiToken,
|
|
26
17
|
accessKey: newKey,
|
|
27
18
|
});
|
|
28
19
|
};
|
|
29
20
|
|
|
30
21
|
return (
|
|
31
22
|
<HeaderLayout
|
|
32
|
-
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 &&
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
+
apiToken: undefined,
|
|
104
87
|
};
|
|
105
88
|
|
|
106
89
|
export default FormHead;
|
package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js
CHANGED
|
@@ -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
|
-
|
|
288
|
-
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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();
|
|
11
|
+
const { trackUsage } = useTracking();
|
|
12
12
|
|
|
13
13
|
return (
|
|
14
14
|
<Box paddingLeft={1} {...stopPropagation}>
|
|
File without changes
|
|
File without changes
|
|
@@ -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;
|