@strapi/admin 4.6.2 → 4.7.0-exp.117579f4c13806c2cd518e7d7d2f9d0c8a20107d

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 (97) hide show
  1. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +0 -2
  2. package/admin/src/hooks/useRegenerate/index.js +2 -2
  3. package/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js +7 -0
  4. package/admin/src/pages/HomePage/CloudBox.js +83 -0
  5. package/admin/src/pages/HomePage/ContentBlocks.js +2 -0
  6. package/admin/src/pages/HomePage/assets/strapi-cloud-background.png +0 -0
  7. package/admin/src/pages/HomePage/assets/strapi-cloud-flags.svg +1 -0
  8. package/admin/src/pages/HomePage/assets/strapi-cloud-icon.svg +1 -0
  9. package/admin/src/pages/SettingsPage/{pages/ApiTokens/EditView/components → components/Tokens}/FormHead/index.js +36 -19
  10. package/admin/src/pages/SettingsPage/components/Tokens/FormiTokenContainer/LifeSpanInput.js +95 -0
  11. package/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js +97 -0
  12. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +73 -0
  13. package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/DeleteButton/index.js +19 -6
  14. package/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +145 -0
  15. package/admin/src/pages/SettingsPage/{pages/ApiTokens/EditView/components/ContentBox → components/Tokens/TokenBox}/index.js +19 -16
  16. package/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js +51 -0
  17. package/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js +46 -0
  18. package/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +69 -0
  19. package/admin/src/pages/SettingsPage/components/Tokens/constants.js +2 -0
  20. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +3 -1
  21. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +53 -150
  22. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +5 -1
  23. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +46 -17
  24. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +16 -16
  25. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +101 -0
  26. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js +48 -0
  27. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +219 -0
  28. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/getDateOfExpiration.js +16 -0
  29. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/index.js +4 -0
  30. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +10 -0
  31. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +194 -0
  32. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/utils/tableHeaders.js +48 -0
  33. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js +14 -0
  34. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js +14 -0
  35. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js +12 -0
  36. package/admin/src/pages/SettingsPage/utils/defaultRoutes.js +33 -0
  37. package/admin/src/permissions/defaultPermissions.js +8 -0
  38. package/admin/src/translations/en.json +15 -0
  39. package/build/27d16aefee06412db90a.png +0 -0
  40. package/build/4049.16583eee.chunk.js +1 -0
  41. package/build/4649.b7e84a29.chunk.js +30 -0
  42. package/build/7259.3f04094f.chunk.js +1 -0
  43. package/build/{Admin-authenticatedApp.dd16edad.chunk.js → Admin-authenticatedApp.49265c1c.chunk.js} +6 -6
  44. package/build/Admin_homePage.1f10437f.chunk.js +78 -0
  45. package/build/{Admin_settingsPage.3cd54156.chunk.js → Admin_settingsPage.5a329b58.chunk.js} +25 -25
  46. package/build/{admin-app.3a084127.chunk.js → admin-app.df9adf93.chunk.js} +26 -26
  47. package/build/{api-tokens-create-page.a31c7fba.chunk.js → api-tokens-create-page.4328b852.chunk.js} +1 -1
  48. package/build/{api-tokens-edit-page.64fef287.chunk.js → api-tokens-edit-page.bce5050f.chunk.js} +1 -1
  49. package/build/api-tokens-list-page.149903c8.chunk.js +16 -0
  50. package/build/bb3108f7fd1e6179bde1.svg +1 -0
  51. package/build/bb4d0d527bdfb161bc5a.svg +1 -0
  52. package/build/{content-manager.d04b738f.chunk.js → content-manager.6ed87531.chunk.js} +1 -1
  53. package/build/en-json.8e5451b1.chunk.js +1 -0
  54. package/build/index.html +1 -1
  55. package/build/{main.9c01de7f.js → main.8009bfe8.js} +1 -0
  56. package/build/runtime~main.86cd21d5.js +2 -0
  57. package/build/transfer-tokens-create-page.a1f14bb1.chunk.js +1 -0
  58. package/build/transfer-tokens-edit-page.00ee1c74.chunk.js +1 -0
  59. package/build/transfer-tokens-list-page.1e15926d.chunk.js +16 -0
  60. package/package.json +9 -9
  61. package/server/bootstrap.js +2 -0
  62. package/server/config/admin-actions.js +48 -0
  63. package/server/content-types/index.js +2 -0
  64. package/server/content-types/transfer-token-permission.js +36 -0
  65. package/server/content-types/transfer-token.js +66 -0
  66. package/server/controllers/api-token.js +4 -5
  67. package/server/controllers/index.js +1 -0
  68. package/server/controllers/transfer/index.js +13 -0
  69. package/server/controllers/transfer/runner.js +24 -0
  70. package/server/controllers/transfer/token.js +131 -0
  71. package/server/register.js +2 -9
  72. package/server/routes/index.js +2 -0
  73. package/server/routes/transfer.js +95 -0
  74. package/server/services/api-token.js +2 -3
  75. package/server/services/constants.js +6 -0
  76. package/server/services/index.js +1 -0
  77. package/server/services/transfer/index.js +6 -0
  78. package/server/services/transfer/permission.js +22 -0
  79. package/server/services/transfer/token.js +409 -0
  80. package/server/strategies/api-token.js +4 -2
  81. package/server/strategies/data-transfer.js +107 -0
  82. package/server/strategies/index.js +1 -0
  83. package/server/utils/index.d.ts +2 -0
  84. package/server/validation/api-tokens.js +1 -6
  85. package/server/validation/transfer/index.js +5 -0
  86. package/server/validation/transfer/token.js +34 -0
  87. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +0 -77
  88. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +0 -110
  89. package/build/1341.5d48c79b.chunk.js +0 -1
  90. package/build/4318.9b1ac9bc.chunk.js +0 -30
  91. package/build/Admin_homePage.4b878f04.chunk.js +0 -72
  92. package/build/api-tokens-list-page.370459ba.chunk.js +0 -16
  93. package/build/en-json.9cada7f3.chunk.js +0 -1
  94. package/build/runtime~main.bb1389c9.js +0 -2
  95. package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/DefaultButton/index.js +1 -1
  96. /package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/ReadButton/index.js +0 -0
  97. /package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/UpdateButton/index.js +0 -0
@@ -0,0 +1,194 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { useQuery, useMutation, useQueryClient } from 'react-query';
4
+ import { useHistory } from 'react-router-dom';
5
+ import qs from 'qs';
6
+
7
+ import {
8
+ SettingsPageTitle,
9
+ useFocusWhenNavigate,
10
+ useNotification,
11
+ NoPermissions,
12
+ useRBAC,
13
+ NoContent,
14
+ useTracking,
15
+ useGuidedTour,
16
+ LinkButton,
17
+ useFetchClient,
18
+ } from '@strapi/helper-plugin';
19
+ import { HeaderLayout, ContentLayout, Main, Button } from '@strapi/design-system';
20
+ import { Plus } from '@strapi/icons';
21
+
22
+ import adminPermissions from '../../../../../permissions';
23
+ import tableHeaders from './utils/tableHeaders';
24
+ import Table from '../../../components/Tokens/Table';
25
+ import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants';
26
+
27
+ const TransferTokenListView = () => {
28
+ useFocusWhenNavigate();
29
+ const queryClient = useQueryClient();
30
+ const { formatMessage } = useIntl();
31
+ const toggleNotification = useNotification();
32
+ const {
33
+ allowedActions: { canCreate, canDelete, canUpdate, canRead },
34
+ } = useRBAC(adminPermissions.settings['transfer-tokens']);
35
+ const { push } = useHistory();
36
+ const { trackUsage } = useTracking();
37
+
38
+ const { startSection } = useGuidedTour();
39
+ const startSectionRef = useRef(startSection);
40
+ const { get, del } = useFetchClient();
41
+
42
+ useEffect(() => {
43
+ if (startSectionRef.current) {
44
+ startSectionRef.current('transferTokens');
45
+ }
46
+ }, []);
47
+
48
+ useEffect(() => {
49
+ push({ search: qs.stringify({ sort: 'name:ASC' }, { encode: false }) });
50
+ }, [push]);
51
+
52
+ const headers = tableHeaders.map((header) => ({
53
+ ...header,
54
+ metadatas: {
55
+ ...header.metadatas,
56
+ label: formatMessage(header.metadatas.label),
57
+ },
58
+ }));
59
+
60
+ const {
61
+ data: transferTokens,
62
+ status,
63
+ isFetching,
64
+ } = useQuery(
65
+ ['transfer-tokens'],
66
+ async () => {
67
+ trackUsage('willAccessTokenList', {
68
+ tokenType: TRANSFER_TOKEN_TYPE,
69
+ });
70
+ const {
71
+ data: { data },
72
+ } = await get(`/admin/transfer/tokens`);
73
+
74
+ trackUsage('didAccessTokenList', { number: data.length, tokenType: TRANSFER_TOKEN_TYPE });
75
+
76
+ return data;
77
+ },
78
+ {
79
+ enabled: canRead,
80
+ onError() {
81
+ toggleNotification({
82
+ type: 'warning',
83
+ message: { id: 'notification.error', defaultMessage: 'An error occured' },
84
+ });
85
+ },
86
+ }
87
+ );
88
+
89
+ const isLoading =
90
+ canRead &&
91
+ ((status !== 'success' && status !== 'error') || (status === 'success' && isFetching));
92
+
93
+ const deleteMutation = useMutation(
94
+ async (id) => {
95
+ await del(`/admin/transfer/tokens/${id}`);
96
+ },
97
+ {
98
+ async onSuccess() {
99
+ await queryClient.invalidateQueries(['transfer-tokens']);
100
+ },
101
+ onError(err) {
102
+ if (err?.response?.data?.data) {
103
+ toggleNotification({ type: 'warning', message: err.response.data.data });
104
+ } else {
105
+ toggleNotification({
106
+ type: 'warning',
107
+ message: { id: 'notification.error', defaultMessage: 'An error occured' },
108
+ });
109
+ }
110
+ },
111
+ }
112
+ );
113
+
114
+ const shouldDisplayDynamicTable = canRead && transferTokens;
115
+ const shouldDisplayNoContent = canRead && !transferTokens && !canCreate;
116
+ const shouldDisplayNoContentWithCreationButton = canRead && !transferTokens && canCreate;
117
+
118
+ return (
119
+ <Main aria-busy={isLoading}>
120
+ <SettingsPageTitle name="Transfer Tokens" />
121
+ <HeaderLayout
122
+ title={formatMessage({
123
+ id: 'Settings.transferTokens.title',
124
+ defaultMessage: 'Transfer Tokens',
125
+ })}
126
+ subtitle={formatMessage({
127
+ id: 'Settings.transferTokens.description',
128
+ defaultMessage: '"List of generated transfer tokens"', // TODO change this message
129
+ })}
130
+ primaryAction={
131
+ canCreate ? (
132
+ <LinkButton
133
+ data-testid="create-transfer-token-button"
134
+ startIcon={<Plus />}
135
+ size="S"
136
+ onClick={() =>
137
+ trackUsage('willAddTokenFromList', {
138
+ tokenType: TRANSFER_TOKEN_TYPE,
139
+ })
140
+ }
141
+ to="/settings/transfer-tokens/create"
142
+ >
143
+ {formatMessage({
144
+ id: 'Settings.transferTokens.create',
145
+ defaultMessage: 'Create new Transfer Token',
146
+ })}
147
+ </LinkButton>
148
+ ) : undefined
149
+ }
150
+ />
151
+ <ContentLayout>
152
+ {!canRead && <NoPermissions />}
153
+ {shouldDisplayDynamicTable && (
154
+ <Table
155
+ permissions={{ canRead, canDelete, canUpdate }}
156
+ headers={headers}
157
+ contentType="trasfer-tokens"
158
+ rows={transferTokens}
159
+ isLoading={isLoading}
160
+ onConfirmDelete={(id) => deleteMutation.mutateAsync(id)}
161
+ tokens={transferTokens}
162
+ tokenType={TRANSFER_TOKEN_TYPE}
163
+ />
164
+ )}
165
+ {shouldDisplayNoContentWithCreationButton && (
166
+ <NoContent
167
+ content={{
168
+ id: 'Settings.transferTokens.addFirstToken',
169
+ defaultMessage: 'Add your first Transfer Token',
170
+ }}
171
+ action={
172
+ <Button variant="secondary" startIcon={<Plus />}>
173
+ {formatMessage({
174
+ id: 'Settings.transferTokens.addNewToken',
175
+ defaultMessage: 'Add new Transfer Token',
176
+ })}
177
+ </Button>
178
+ }
179
+ />
180
+ )}
181
+ {shouldDisplayNoContent && (
182
+ <NoContent
183
+ content={{
184
+ id: 'Settings.transferTokens.emptyStateLayout',
185
+ defaultMessage: 'You don’t have any content yet...',
186
+ }}
187
+ />
188
+ )}
189
+ </ContentLayout>
190
+ </Main>
191
+ );
192
+ };
193
+
194
+ export default TransferTokenListView;
@@ -0,0 +1,48 @@
1
+ const tableHeaders = [
2
+ {
3
+ name: 'name',
4
+ key: 'name',
5
+ metadatas: {
6
+ label: {
7
+ id: 'Settings.transferTokens.ListView.headers.name',
8
+ defaultMessage: 'Name',
9
+ },
10
+ sortable: true,
11
+ },
12
+ },
13
+ {
14
+ name: 'description',
15
+ key: 'description',
16
+ metadatas: {
17
+ label: {
18
+ id: 'Settings.transferTokens.ListView.headers.description',
19
+ defaultMessage: 'Description',
20
+ },
21
+ sortable: false,
22
+ },
23
+ },
24
+ {
25
+ name: 'createdAt',
26
+ key: 'createdAt',
27
+ metadatas: {
28
+ label: {
29
+ id: 'Settings.transferTokens.ListView.headers.createdAt',
30
+ defaultMessage: 'Created at',
31
+ },
32
+ sortable: false,
33
+ },
34
+ },
35
+ {
36
+ name: 'lastUsedAt',
37
+ key: 'lastUsedAt',
38
+ metadatas: {
39
+ label: {
40
+ id: 'Settings.transferTokens.ListView.headers.lastUsedAt',
41
+ defaultMessage: 'Last used',
42
+ },
43
+ sortable: false,
44
+ },
45
+ },
46
+ ];
47
+
48
+ export default tableHeaders;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { CheckPagePermissions } from '@strapi/helper-plugin';
3
+ import adminPermissions from '../../../../../permissions';
4
+ import EditView from '../EditView';
5
+
6
+ const ProtectedTransferTokenCreateView = () => {
7
+ return (
8
+ <CheckPagePermissions permissions={adminPermissions.settings['transfer-tokens'].create}>
9
+ <EditView />
10
+ </CheckPagePermissions>
11
+ );
12
+ };
13
+
14
+ export default ProtectedTransferTokenCreateView;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { CheckPagePermissions } from '@strapi/helper-plugin';
3
+ import adminPermissions from '../../../../../permissions';
4
+ import EditView from '../EditView';
5
+
6
+ const ProtectedTransferTokenCreateView = () => {
7
+ return (
8
+ <CheckPagePermissions permissions={adminPermissions.settings['transfer-tokens'].read}>
9
+ <EditView />
10
+ </CheckPagePermissions>
11
+ );
12
+ };
13
+
14
+ export default ProtectedTransferTokenCreateView;
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { CheckPagePermissions } from '@strapi/helper-plugin';
3
+ import adminPermissions from '../../../../../permissions';
4
+ import ListView from '../ListView';
5
+
6
+ const ProtectedTransferTokenListView = () => (
7
+ <CheckPagePermissions permissions={adminPermissions.settings['transfer-tokens'].main}>
8
+ <ListView />
9
+ </CheckPagePermissions>
10
+ );
11
+
12
+ export default ProtectedTransferTokenListView;
@@ -123,6 +123,39 @@ const defaultRoutes = [
123
123
  to: '/settings/api-tokens/:id',
124
124
  exact: true,
125
125
  },
126
+ {
127
+ async Component() {
128
+ const component = await import(
129
+ /* webpackChunkName: "transfer-tokens-create-page" */ '../pages/TransferTokens/ProtectedCreateView'
130
+ );
131
+
132
+ return component;
133
+ },
134
+ to: '/settings/transfer-tokens/create',
135
+ exact: true,
136
+ },
137
+ {
138
+ async Component() {
139
+ const component = await import(
140
+ /* webpackChunkName: "transfer-tokens-list-page" */ '../pages/TransferTokens/ProtectedListView'
141
+ );
142
+
143
+ return component;
144
+ },
145
+ to: '/settings/transfer-tokens',
146
+ exact: true,
147
+ },
148
+ {
149
+ async Component() {
150
+ const component = await import(
151
+ /* webpackChunkName: "transfer-tokens-edit-page" */ '../pages/TransferTokens/ProtectedEditView'
152
+ );
153
+
154
+ return component;
155
+ },
156
+ to: '/settings/transfer-tokens/:id',
157
+ exact: true,
158
+ },
126
159
  ];
127
160
 
128
161
  export default defaultRoutes;
@@ -74,6 +74,14 @@ const permissions = {
74
74
  update: [{ action: 'admin::api-tokens.update', subject: null }],
75
75
  regenerate: [{ action: 'admin::api-tokens.regenerate', subject: null }],
76
76
  },
77
+ 'transfer-tokens': {
78
+ main: [{ action: 'admin::transfer.tokens.access', subject: null }],
79
+ create: [{ action: 'admin::transfer.tokens.create', subject: null }],
80
+ delete: [{ action: 'admin::transfer.tokens.delete', subject: null }],
81
+ read: [{ action: 'admin::transfer.tokens.read', subject: null }],
82
+ update: [{ action: 'admin::transfer.tokens.update', subject: null }],
83
+ regenerate: [{ action: 'admin::transfer.tokens.regenerate', subject: null }],
84
+ },
77
85
  'project-settings': {
78
86
  read: [{ action: 'admin::project-settings.read', subject: null }],
79
87
  update: [{ action: 'admin::project-settings.update', subject: null }],
@@ -109,6 +109,17 @@
109
109
  "Settings.apiTokens.popUpWarning.message": "Are you sure you want to regenerate this token?",
110
110
  "Settings.apiTokens.Button.cancel": "Cancel",
111
111
  "Settings.apiTokens.Button.regenerate": "Regenerate",
112
+ "Settings.transferTokens.title": "Transfer Tokens",
113
+ "Settings.transferTokens.description": "List of generated transfer tokens",
114
+ "Settings.transferTokens.create": "Create new Transfer Token",
115
+ "Settings.transferTokens.addFirstToken": "Add your first Transfer Token",
116
+ "Settings.transferTokens.addNewToken": "Add new Transfer Token",
117
+ "Settings.transferTokens.emptyStateLayout": "You don’t have any content yet...",
118
+ "Settings.transferTokens.ListView.headers.name": "Name",
119
+ "Settings.transferTokens.ListView.headers.description": "Description",
120
+ "Settings.transferTokens.ListView.headers.type": "Token type",
121
+ "Settings.transferTokens.ListView.headers.createdAt": "Created at",
122
+ "Settings.transferTokens.ListView.headers.lastUsedAt": "Last used",
112
123
  "Settings.application.description": "Administration panel’s global information",
113
124
  "Settings.application.edition-title": "current plan",
114
125
  "Settings.application.get-help": "Get help",
@@ -350,6 +361,8 @@
350
361
  "app.components.BlockLink.documentation.content": "Discover the essential concepts, guides and instructions.",
351
362
  "app.components.BlockLink.tutorial": "Tutorials",
352
363
  "app.components.BlockLink.tutorial.content": "Follow step-by-step instructions to use and customize Strapi.",
364
+ "app.components.BlockLink.cloud": "Strapi Cloud",
365
+ "app.components.BlockLink.cloud.content": "A fully composable, and collaborative platform to boost your team velocity.",
353
366
  "app.components.Button.cancel": "Cancel",
354
367
  "app.components.Button.confirm": "Confirm",
355
368
  "app.components.Button.reset": "Reset",
@@ -846,6 +859,8 @@
846
859
  "notification.success.title": "Success:",
847
860
  "notification.success.tokencreated": "API Token successfully created",
848
861
  "notification.success.tokenedited": "API Token successfully edited",
862
+ "notification.success.transfertokencreated": "Transfer Token successfully created",
863
+ "notification.success.transfertokenedited": "Transfer Token successfully edited",
849
864
  "notification.error.tokennamenotunique": "Name already assigned to another token",
850
865
  "notification.version.update.message": "A new version of Strapi is available!",
851
866
  "notification.warning.title": "Warning:",
Binary file