@strapi/admin 5.43.0 → 5.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/StrapiApp.js +17 -4
- package/dist/admin/admin/src/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs +18 -5
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/Form.js +18 -8
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +18 -8
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/Layout.js +1 -0
- package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/Layout.mjs +1 -0
- package/dist/admin/admin/src/components/Layouts/Layout.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/Widgets.js +52 -0
- package/dist/admin/admin/src/components/Widgets.js.map +1 -1
- package/dist/admin/admin/src/components/Widgets.mjs +54 -3
- package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/constants.js +49 -0
- package/dist/admin/admin/src/constants.js.map +1 -1
- package/dist/admin/admin/src/constants.mjs +49 -0
- package/dist/admin/admin/src/constants.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/router.js +4 -4
- package/dist/admin/admin/src/core/apis/router.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.mjs +4 -4
- package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView/components → components/Tokens}/FormApiTokenContainer.js +48 -11
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView/components → components/Tokens}/FormApiTokenContainer.mjs +49 -12
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +21 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +21 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js +33 -0
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.mjs +14 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.js +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.mjs +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/constants.js +182 -151
- package/dist/admin/admin/src/pages/Settings/constants.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/constants.mjs +182 -151
- package/dist/admin/admin/src/pages/Settings/constants.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.js +17 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.mjs +15 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js +314 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.mjs +292 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js +70 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.mjs +49 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js +254 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.mjs +231 -0
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +42 -33
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +43 -34
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +23 -12
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +23 -12
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +124 -35
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs +126 -37
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +24 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +24 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +5 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs +5 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +171 -36
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +172 -37
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +5 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs +5 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js +59 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs +40 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.js +89 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.mjs +86 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.js +35 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.mjs +35 -10
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.mjs.map +1 -1
- package/dist/admin/admin/src/render.js +6 -3
- package/dist/admin/admin/src/render.js.map +1 -1
- package/dist/admin/admin/src/render.mjs +6 -3
- package/dist/admin/admin/src/render.mjs.map +1 -1
- package/dist/admin/admin/src/router.js +4 -4
- package/dist/admin/admin/src/router.js.map +1 -1
- package/dist/admin/admin/src/router.mjs +1 -1
- package/dist/admin/admin/src/router.mjs.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.js +85 -2
- package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.mjs +80 -3
- package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ar.json.js +4 -1
- package/dist/admin/admin/src/translations/ar.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ar.json.mjs +4 -1
- package/dist/admin/admin/src/translations/ar.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/cs.json.js +736 -13
- package/dist/admin/admin/src/translations/cs.json.js.map +1 -1
- package/dist/admin/admin/src/translations/cs.json.mjs +728 -14
- package/dist/admin/admin/src/translations/cs.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/de.json.js +4 -1
- package/dist/admin/admin/src/translations/de.json.js.map +1 -1
- package/dist/admin/admin/src/translations/de.json.mjs +4 -1
- package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +20 -2
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +20 -2
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/es.json.js +4 -1
- package/dist/admin/admin/src/translations/es.json.js.map +1 -1
- package/dist/admin/admin/src/translations/es.json.mjs +4 -1
- package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/fr.json.js +4 -1
- package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
- package/dist/admin/admin/src/translations/fr.json.mjs +4 -1
- package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/it.json.js +4 -1
- package/dist/admin/admin/src/translations/it.json.js.map +1 -1
- package/dist/admin/admin/src/translations/it.json.mjs +4 -1
- package/dist/admin/admin/src/translations/it.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ru.json.js +32 -19
- package/dist/admin/admin/src/translations/ru.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ru.json.mjs +32 -19
- package/dist/admin/admin/src/translations/ru.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/zh-Hans.json.js +4 -1
- package/dist/admin/admin/src/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/admin/src/translations/zh-Hans.json.mjs +4 -1
- package/dist/admin/admin/src/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +33 -4
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +33 -4
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/tests/server.js +99 -21
- package/dist/admin/admin/tests/server.js.map +1 -1
- package/dist/admin/admin/tests/server.mjs +99 -21
- package/dist/admin/admin/tests/server.mjs.map +1 -1
- package/dist/admin/src/components/Widgets.d.ts +2 -1
- package/dist/admin/src/constants.d.ts +26 -0
- package/dist/admin/src/core/apis/router.d.ts +1 -1
- package/dist/admin/src/features/Tracking.d.ts +2 -1
- package/dist/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.d.ts +24 -0
- package/dist/admin/src/pages/Settings/components/Tokens/Table.d.ts +2 -1
- package/dist/admin/src/pages/Settings/components/Tokens/constants.d.ts +17 -0
- package/dist/admin/src/pages/Settings/constants.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/AdminTokens/CreateView.d.ts +1 -0
- package/dist/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.d.ts +2 -0
- package/dist/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.d.ts +13 -0
- package/dist/admin/src/pages/Settings/pages/AdminTokens/ListView.d.ts +2 -0
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.d.ts +4 -3
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +3 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.d.ts +1 -0
- package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +5 -0
- package/dist/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.d.ts +8 -7
- package/dist/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.d.ts +27 -0
- package/dist/admin/src/pages/Settings/pages/Roles/utils/updateValues.d.ts +8 -2
- package/dist/admin/src/services/apiTokens.d.ts +5 -2
- package/dist/admin/src/types/permissions.d.ts +1 -1
- package/dist/admin/src/utils/getFetchClient.d.ts +14 -1
- package/dist/server/server/src/bootstrap.js +37 -5
- package/dist/server/server/src/bootstrap.js.map +1 -1
- package/dist/server/server/src/bootstrap.mjs +37 -5
- package/dist/server/server/src/bootstrap.mjs.map +1 -1
- package/dist/server/server/src/config/admin-actions.js +48 -0
- package/dist/server/server/src/config/admin-actions.js.map +1 -1
- package/dist/server/server/src/config/admin-actions.mjs +48 -0
- package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
- package/dist/server/server/src/content-types/Permission.js +10 -1
- package/dist/server/server/src/content-types/Permission.js.map +1 -1
- package/dist/server/server/src/content-types/Permission.mjs +10 -1
- package/dist/server/server/src/content-types/Permission.mjs.map +1 -1
- package/dist/server/server/src/content-types/User.js +8 -0
- package/dist/server/server/src/content-types/User.js.map +1 -1
- package/dist/server/server/src/content-types/User.mjs +8 -0
- package/dist/server/server/src/content-types/User.mjs.map +1 -1
- package/dist/server/server/src/content-types/api-token.js +27 -1
- package/dist/server/server/src/content-types/api-token.js.map +1 -1
- package/dist/server/server/src/content-types/api-token.mjs +27 -1
- package/dist/server/server/src/content-types/api-token.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin-token.js +194 -0
- package/dist/server/server/src/controllers/admin-token.js.map +1 -0
- package/dist/server/server/src/controllers/admin-token.mjs +192 -0
- package/dist/server/server/src/controllers/admin-token.mjs.map +1 -0
- package/dist/server/server/src/controllers/api-token.js +48 -47
- package/dist/server/server/src/controllers/api-token.js.map +1 -1
- package/dist/server/server/src/controllers/api-token.mjs +48 -47
- package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
- package/dist/server/server/src/controllers/index.js +2 -0
- package/dist/server/server/src/controllers/index.js.map +1 -1
- package/dist/server/server/src/controllers/index.mjs +2 -0
- package/dist/server/server/src/controllers/index.mjs.map +1 -1
- package/dist/server/server/src/domain/permission/index.js +2 -1
- package/dist/server/server/src/domain/permission/index.js.map +1 -1
- package/dist/server/server/src/domain/permission/index.mjs +2 -1
- package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
- package/dist/server/server/src/policies/index.js +2 -0
- package/dist/server/server/src/policies/index.js.map +1 -1
- package/dist/server/server/src/policies/index.mjs +2 -0
- package/dist/server/server/src/policies/index.mjs.map +1 -1
- package/dist/server/server/src/policies/isAdminTokensEnabled.js +16 -0
- package/dist/server/server/src/policies/isAdminTokensEnabled.js.map +1 -0
- package/dist/server/server/src/policies/isAdminTokensEnabled.mjs +14 -0
- package/dist/server/server/src/policies/isAdminTokensEnabled.mjs.map +1 -0
- package/dist/server/server/src/register.js +4 -2
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +4 -2
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/routes/admin-tokens.js +140 -0
- package/dist/server/server/src/routes/admin-tokens.js.map +1 -0
- package/dist/server/server/src/routes/admin-tokens.mjs +138 -0
- package/dist/server/server/src/routes/admin-tokens.mjs.map +1 -0
- package/dist/server/server/src/routes/index.js +2 -0
- package/dist/server/server/src/routes/index.js.map +1 -1
- package/dist/server/server/src/routes/index.mjs +2 -0
- package/dist/server/server/src/routes/index.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +805 -101
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +800 -101
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/constants.js +2 -0
- package/dist/server/server/src/services/constants.js.map +1 -1
- package/dist/server/server/src/services/constants.mjs +2 -0
- package/dist/server/server/src/services/constants.mjs.map +1 -1
- package/dist/server/server/src/services/homepage.js +1 -1
- package/dist/server/server/src/services/homepage.js.map +1 -1
- package/dist/server/server/src/services/homepage.mjs +1 -1
- package/dist/server/server/src/services/homepage.mjs.map +1 -1
- package/dist/server/server/src/services/index.js +2 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +3 -2
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/server/src/services/permission/engine.js +6 -0
- package/dist/server/server/src/services/permission/engine.js.map +1 -1
- package/dist/server/server/src/services/permission/engine.mjs +6 -0
- package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
- package/dist/server/server/src/services/permission/queries.js +11 -2
- package/dist/server/server/src/services/permission/queries.js.map +1 -1
- package/dist/server/server/src/services/permission/queries.mjs +12 -3
- package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +3 -0
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +3 -0
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/strategies/admin-token.js +110 -0
- package/dist/server/server/src/strategies/admin-token.js.map +1 -0
- package/dist/server/server/src/strategies/admin-token.mjs +104 -0
- package/dist/server/server/src/strategies/admin-token.mjs.map +1 -0
- package/dist/server/server/src/strategies/api-token-utils.js +56 -0
- package/dist/server/server/src/strategies/api-token-utils.js.map +1 -0
- package/dist/server/server/src/strategies/api-token-utils.mjs +52 -0
- package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -0
- package/dist/server/server/src/strategies/content-api-token.js +104 -0
- package/dist/server/server/src/strategies/content-api-token.js.map +1 -0
- package/dist/server/server/src/strategies/content-api-token.mjs +98 -0
- package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -0
- package/dist/server/server/src/validation/admin-tokens.js +28 -0
- package/dist/server/server/src/validation/admin-tokens.js.map +1 -0
- package/dist/server/server/src/validation/admin-tokens.mjs +25 -0
- package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -0
- package/dist/server/server/src/validation/api-tokens.js +5 -2
- package/dist/server/server/src/validation/api-tokens.js.map +1 -1
- package/dist/server/server/src/validation/api-tokens.mjs +5 -2
- package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
- package/dist/server/server/src/validation/project-settings.js +15 -16
- package/dist/server/server/src/validation/project-settings.js.map +1 -1
- package/dist/server/server/src/validation/project-settings.mjs +4 -5
- package/dist/server/server/src/validation/project-settings.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/config/admin-actions.d.ts.map +1 -1
- package/dist/server/src/content-types/Permission.d.ts +9 -0
- package/dist/server/src/content-types/Permission.d.ts.map +1 -1
- package/dist/server/src/content-types/User.d.ts +8 -0
- package/dist/server/src/content-types/User.d.ts.map +1 -1
- package/dist/server/src/content-types/api-token.d.ts +23 -0
- package/dist/server/src/content-types/api-token.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +40 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-token.d.ts +12 -0
- package/dist/server/src/controllers/admin-token.d.ts.map +1 -0
- package/dist/server/src/controllers/api-token.d.ts +0 -1
- package/dist/server/src/controllers/api-token.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +9 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/domain/permission/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +56 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/policies/index.d.ts +5 -0
- package/dist/server/src/policies/index.d.ts.map +1 -1
- package/dist/server/src/policies/isAdminTokensEnabled.d.ts +7 -0
- package/dist/server/src/policies/isAdminTokensEnabled.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/admin-tokens.d.ts +15 -0
- package/dist/server/src/routes/admin-tokens.d.ts.map +1 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts +136 -12
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/constants.d.ts +13 -11
- package/dist/server/src/services/constants.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +2 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission/engine.d.ts +5 -0
- package/dist/server/src/services/permission/engine.d.ts.map +1 -1
- package/dist/server/src/services/permission/queries.d.ts.map +1 -1
- package/dist/server/src/services/permission.d.ts +1 -0
- package/dist/server/src/services/permission.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/strategies/admin-token.d.ts +51 -0
- package/dist/server/src/strategies/admin-token.d.ts.map +1 -0
- package/dist/server/src/strategies/api-token-utils.d.ts +13 -0
- package/dist/server/src/strategies/api-token-utils.d.ts.map +1 -0
- package/dist/server/src/strategies/{api-token.d.ts → content-api-token.d.ts} +10 -11
- package/dist/server/src/strategies/content-api-token.d.ts.map +1 -0
- package/dist/server/src/strategies/index.d.ts +2 -1
- package/dist/server/src/strategies/index.d.ts.map +1 -1
- package/dist/server/src/validation/admin-tokens.d.ts +75 -0
- package/dist/server/src/validation/admin-tokens.d.ts.map +1 -0
- package/dist/server/src/validation/api-tokens.d.ts +4 -2
- package/dist/server/src/validation/api-tokens.d.ts.map +1 -1
- package/dist/server/src/validation/project-settings.d.ts +10 -10
- package/dist/server/src/validation/project-settings.d.ts.map +1 -1
- package/dist/shared/contracts/admin-token.d.ts +122 -0
- package/dist/shared/contracts/admin-token.d.ts.map +1 -0
- package/dist/shared/contracts/api-token.d.ts +6 -95
- package/dist/shared/contracts/api-token.d.ts.map +1 -1
- package/dist/shared/contracts/content-api-token.d.ts +97 -0
- package/dist/shared/contracts/content-api-token.d.ts.map +1 -0
- package/dist/shared/contracts/shared.d.ts +1 -0
- package/dist/shared/contracts/shared.d.ts.map +1 -1
- package/package.json +10 -10
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.js.map +0 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.mjs.map +0 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.js +0 -37
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.js.map +0 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.mjs +0 -16
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.mjs.map +0 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.js.map +0 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.mjs.map +0 -1
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.d.ts +0 -20
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.d.ts +0 -17
- package/dist/server/server/src/strategies/api-token.js +0 -144
- package/dist/server/server/src/strategies/api-token.js.map +0 -1
- package/dist/server/server/src/strategies/api-token.mjs +0 -138
- package/dist/server/server/src/strategies/api-token.mjs.map +0 -1
- package/dist/server/src/strategies/api-token.d.ts.map +0 -1
- /package/dist/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tracking.js","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n kind?: 'admin' | 'content-api';\n type?: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tracking.mjs","sources":["../../../../../admin/src/features/Tracking.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { Tours } from '../components/GuidedTour/Tours';\nimport { useDeviceType } from '../hooks/useDeviceType';\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\nimport { useStrapiApp } from './StrapiApp';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: {\n ...data,\n projectId: uuid,\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid, getAllWidgets]);\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\nexport interface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didLaunchGuidedtour'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditReleaseFromHome'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willOpenAuditLogDetailsFromHome'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease'\n | 'didStartNewChat'\n | 'didLaunchGuidedtour'\n | 'didEditAICaption'\n | 'didEditAIAlternativeText'\n | 'didGenerateMetadataRetroactively';\n\n properties?: never;\n}\n\ninterface DidAccessAuthenticatedAdministrationEvent {\n name: 'didAccessAuthenticatedAdministration';\n properties: {\n registeredWidgets: string[];\n projectId: string;\n };\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n kind?: 'admin' | 'content-api';\n type?: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface PublishEntryEvents {\n name: 'willPublishEntry' | 'didPublishEntry';\n properties: {\n documentId?: string;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n documentId?: string;\n status?: string;\n error?: unknown;\n fromPreview?: boolean;\n fromRelationModal?: boolean;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ninterface DidUsePresetPromptEvent {\n name: 'didUsePresetPrompt';\n properties: {\n promptType:\n | 'generate-product-schema'\n | 'tell-me-about-the-content-type-builder'\n | 'tell-me-about-strapi';\n };\n}\n\ninterface DidAnswerMessageEvent {\n name: 'didAnswerMessage';\n properties: {\n successful: boolean;\n };\n}\n\ninterface DidVoteAnswerEvent {\n name: 'didVoteAnswer';\n properties: {\n value: 'positive' | 'negative';\n };\n}\n\ninterface DidUpdateCTBSchema {\n name: 'didUpdateCTBSchema';\n properties: {\n success: boolean;\n newContentTypes: number;\n editedContentTypes: number;\n deletedContentTypes: number;\n newComponents: number;\n editedComponents: number;\n deletedComponents: number;\n newFields: number;\n editedFields: number;\n deletedFields: number;\n };\n}\n\ninterface DidSkipGuidedTour {\n name: 'didSkipGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidCompleteGuidedTour {\n name: 'didCompleteGuidedTour';\n properties: {\n name: keyof Tours | 'all';\n };\n}\n\ninterface DidStartGuidedTour {\n name: 'didStartGuidedTour';\n properties: {\n name: keyof Tours;\n fromHomepage?: boolean;\n };\n}\n\ninterface WillEditEntryFromHome {\n name: 'willEditEntryFromHome';\n properties: {\n entryType: 'edited' | 'published' | 'assigned';\n };\n}\n\ninterface DidOpenHomeWidgetLink {\n name: 'didOpenHomeWidgetLink';\n properties: {\n widgetUID: string;\n };\n}\n\ninterface DidOpenKeyStatisticsWidgetLink {\n name: 'didOpenKeyStatisticsWidgetLink';\n properties: {\n itemKey: string;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | PublishEntryEvents\n | DidAccessAuthenticatedAdministrationEvent\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | DidUsePresetPromptEvent\n | DidAnswerMessageEvent\n | DidVoteAnswerEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents\n | DidUpdateCTBSchema\n | DidSkipGuidedTour\n | DidCompleteGuidedTour\n | DidStartGuidedTour\n | DidOpenHomeWidgetLink\n | DidOpenKeyStatisticsWidgetLink\n | WillEditEntryFromHome;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const deviceType = useDeviceType();\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/api/v2/track`,\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {\n deviceType,\n },\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n"],"names":["TrackingContext","React","createContext","uuid","TrackingProvider","children","token","useAuth","state","data","initData","useInitQuery","getAllWidgets","useStrapiApp","widgets","getAll","useTelemetryPropertiesQuery","undefined","skip","useEffect","event","fetch","process","env","STRAPI_ANALYTICS_URL","method","body","JSON","stringify","userId","eventPropeties","groupProperties","projectId","registeredWidgets","map","widget","uid","headers","value","useMemo","telemetryProperties","_jsx","Provider","useTracking","deviceType","useDeviceType","useContext","useAppInfo","trackUsage","useCallback","properties","window","strapi","telemetryDisabled","res","axios","post","eventProperties","userProperties","projectType","err"],"mappings":";;;;;;;;;AA0BA;;AAEkG,qGAElG,MAAMA,eAAAA,iBAAkBC,KAAAA,CAAMC,aAAa,CAAuB;IAChEC,IAAAA,EAAM;AACR,CAAA,CAAA;AAUA,MAAMC,gBAAAA,GAAmB,CAAC,EAAEC,QAAQ,EAAyB,GAAA;AAC3D,IAAA,MAAMC,QAAQC,OAAAA,CAAQ,KAAA,EAAO,CAACC,KAAAA,GAAUA,MAAMF,KAAK,CAAA;AACnD,IAAA,MAAM,EAAEG,IAAAA,EAAMC,QAAQ,EAAE,GAAGC,YAAAA,EAAAA;AAC3B,IAAA,MAAM,EAAER,IAAI,EAAE,GAAGO,YAAY,EAAC;IAC9B,MAAME,aAAAA,GAAgBC,aAAa,kBAAA,EAAoB,CAACL,QAAUA,KAAAA,CAAMM,OAAO,CAACC,MAAM,CAAA;AAEtF,IAAA,MAAM,EAAEN,IAAI,EAAE,GAAGO,4BAA4BC,SAAAA,EAAW;QACtDC,IAAAA,EAAM,CAACR,QAAAA,EAAUP,IAAAA,IAAQ,CAACG;AAC5B,KAAA,CAAA;AACAL,IAAAA,KAAAA,CAAMkB,SAAS,CAAC,IAAA;AACd,QAAA,IAAIhB,QAAQM,IAAAA,EAAM;AAChB,YAAA,MAAMW,KAAAA,GAAQ,6BAAA;YACd,IAAI;gBACFC,KAAAA,CAAM,CAAA,EAAGC,QAAQC,GAAG,CAACC,oBAAoB,IAAI,6BAAA,CAA8B,aAAa,CAAC,EAAE;oBACzFC,MAAAA,EAAQ,MAAA;oBACRC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAAC;;AAEnBR,wBAAAA,KAAAA;wBACAS,MAAAA,EAAQ,EAAA;AACRC,wBAAAA,cAAAA,EAAgB,EAAC;wBACjBC,eAAAA,EAAiB;AACf,4BAAA,GAAGtB,IAAI;4BACPuB,SAAAA,EAAW7B,IAAAA;AACX8B,4BAAAA,iBAAAA,EAAmBrB,gBAAgBsB,GAAG,CAAC,CAACC,MAAAA,GAAWA,OAAOC,GAAG;AAC/D;AACF,qBAAA,CAAA;oBACAC,OAAAA,EAAS;wBACP,cAAA,EAAgB,kBAAA;wBAChB,gBAAA,EAAkBjB;AACpB;AACF,iBAAA,CAAA;AACF,YAAA,CAAA,CAAE,OAAM;;AAER,YAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACX,QAAAA,IAAAA;AAAMN,QAAAA,IAAAA;AAAMS,QAAAA;AAAc,KAAA,CAAA;AAC9B,IAAA,MAAM0B,KAAAA,GAAQrC,KAAAA,CAAMsC,OAAO,CACzB,KAAO;AACLpC,YAAAA,IAAAA;YACAqC,mBAAAA,EAAqB/B;AACvB,SAAA,CAAA,EACA;AAACN,QAAAA,IAAAA;AAAMM,QAAAA;AAAK,KAAA,CAAA;IAGd,qBAAOgC,GAAA,CAACzC,gBAAgB0C,QAAQ,EAAA;QAACJ,KAAAA,EAAOA,KAAAA;AAAQjC,QAAAA,QAAAA,EAAAA;;AAClD;AA8aA;;;;;;;;;;;;;;;;;AAiBC,UACKsC,WAAAA,GAAc,IAAA;AAClB,IAAA,MAAMC,UAAAA,GAAaC,aAAAA,EAAAA;IACnB,MAAM,EAAE1C,IAAI,EAAEqC,mBAAmB,EAAE,GAAGvC,KAAAA,CAAM6C,UAAU,CAAC9C,eAAAA,CAAAA;AACvD,IAAA,MAAM6B,SAASkB,UAAAA,CAAW,aAAA,EAAe,CAACvC,KAAAA,GAAUA,MAAMqB,MAAM,CAAA;AAChE,IAAA,MAAMmB,UAAAA,GAAa/C,KAAAA,CAAMgD,WAAW,CAClC,OACE7B,KAAAA,EACA8B,UAAAA,GAAAA;QAEA,IAAI;AACF,YAAA,IAAI/C,QAAQ,CAACgD,MAAAA,CAAOC,MAAM,CAACC,iBAAiB,EAAE;AAC5C,gBAAA,MAAMC,GAAAA,GAAM,MAAMC,KAAAA,CAAMC,IAAI,CAC1B,CAAA,EAAGlC,OAAAA,CAAQC,GAAG,CAACC,oBAAoB,IAAI,6BAAA,CAA8B,aAAa,CAAC,EACnF;AACEJ,oBAAAA,KAAAA;AACAS,oBAAAA,MAAAA;oBACA4B,eAAAA,EAAiB;AAAE,wBAAA,GAAGP;AAAW,qBAAA;oBACjCQ,cAAAA,EAAgB;AACdd,wBAAAA;AACF,qBAAA;oBACAb,eAAAA,EAAiB;AACf,wBAAA,GAAGS,mBAAmB;wBACtBR,SAAAA,EAAW7B,IAAAA;wBACXwD,WAAAA,EAAaR,MAAAA,CAAOC,MAAM,CAACO;AAC7B;iBACF,EACA;oBACEtB,OAAAA,EAAS;wBACP,cAAA,EAAgB,kBAAA;wBAChB,gBAAA,EAAkBjB;AACpB;AACF,iBAAA,CAAA;gBAGF,OAAOkC,GAAAA;AACT,YAAA;AACF,QAAA,CAAA,CAAE,OAAOM,GAAAA,EAAK;;AAEd,QAAA;QAEA,OAAO,IAAA;IACT,CAAA,EACA;AAACpB,QAAAA,mBAAAA;AAAqBX,QAAAA,MAAAA;AAAQ1B,QAAAA;AAAK,KAAA,CAAA;IAGrC,OAAO;AAAE6C,QAAAA;AAAW,KAAA;AACtB;;;;"}
|
|
@@ -4,13 +4,29 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
require('react');
|
|
5
5
|
var designSystem = require('@strapi/design-system');
|
|
6
6
|
var reactIntl = require('react-intl');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
7
|
+
var Auth = require('../../../../features/Auth.js');
|
|
8
|
+
var LifeSpanInput = require('./LifeSpanInput.js');
|
|
9
|
+
var TokenDescription = require('./TokenDescription.js');
|
|
10
|
+
var TokenName = require('./TokenName.js');
|
|
11
|
+
var TokenTypeSelect = require('./TokenTypeSelect.js');
|
|
11
12
|
|
|
12
|
-
const
|
|
13
|
+
const formatAdminUserName = (owner)=>{
|
|
14
|
+
const full = [
|
|
15
|
+
owner.firstname,
|
|
16
|
+
owner.lastname
|
|
17
|
+
].filter(Boolean).join(' ');
|
|
18
|
+
return full || owner.username || owner.email || '';
|
|
19
|
+
};
|
|
20
|
+
const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreating, values = {}, apiToken = {}, kind, onDispatch, setHasChangedPermissions })=>{
|
|
13
21
|
const { formatMessage } = reactIntl.useIntl();
|
|
22
|
+
const currentUser = Auth.useAuth('FormApiTokenContainer', (state)=>state.user);
|
|
23
|
+
const ownerToDisplay = (()=>{
|
|
24
|
+
const owner = kind === 'admin' ? apiToken?.adminUserOwner : undefined;
|
|
25
|
+
if (owner === undefined || owner === null) return null;
|
|
26
|
+
if (typeof owner !== 'object') return null;
|
|
27
|
+
if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;
|
|
28
|
+
return owner;
|
|
29
|
+
})();
|
|
14
30
|
const handleChangeSelectApiTokenType = ({ target: { value } })=>{
|
|
15
31
|
setHasChangedPermissions(false);
|
|
16
32
|
if (value === 'full-access') {
|
|
@@ -108,7 +124,7 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
|
|
|
108
124
|
token: apiToken
|
|
109
125
|
})
|
|
110
126
|
}, "lifespan"),
|
|
111
|
-
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
127
|
+
kind === 'content-api' && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
112
128
|
m: 6,
|
|
113
129
|
xs: 12,
|
|
114
130
|
direction: "column",
|
|
@@ -121,24 +137,45 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
|
|
|
121
137
|
defaultMessage: 'Token type'
|
|
122
138
|
},
|
|
123
139
|
onChange: (value)=>{
|
|
124
|
-
// @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
|
|
125
140
|
handleChangeSelectApiTokenType({
|
|
126
141
|
target: {
|
|
127
|
-
value
|
|
142
|
+
value: String(value)
|
|
128
143
|
}
|
|
129
144
|
});
|
|
130
|
-
// @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
|
|
131
145
|
onChange({
|
|
132
146
|
target: {
|
|
133
147
|
name: 'type',
|
|
134
|
-
value
|
|
148
|
+
value: String(value)
|
|
135
149
|
}
|
|
136
150
|
});
|
|
137
151
|
},
|
|
138
152
|
options: typeOptions,
|
|
139
153
|
canEditInputs: canEditInputs
|
|
140
154
|
})
|
|
141
|
-
}, "type")
|
|
155
|
+
}, "type"),
|
|
156
|
+
ownerToDisplay !== null && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
157
|
+
m: 6,
|
|
158
|
+
xs: 12,
|
|
159
|
+
direction: "column",
|
|
160
|
+
alignItems: "stretch",
|
|
161
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
|
|
162
|
+
name: "adminUserOwner",
|
|
163
|
+
children: [
|
|
164
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
|
|
165
|
+
children: formatMessage({
|
|
166
|
+
id: 'Settings.tokens.form.owner',
|
|
167
|
+
defaultMessage: 'Owner'
|
|
168
|
+
})
|
|
169
|
+
}),
|
|
170
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.TextInput, {
|
|
171
|
+
type: "text",
|
|
172
|
+
value: formatAdminUserName(ownerToDisplay),
|
|
173
|
+
disabled: true,
|
|
174
|
+
onChange: ()=>{}
|
|
175
|
+
})
|
|
176
|
+
]
|
|
177
|
+
})
|
|
178
|
+
}, "owner")
|
|
142
179
|
]
|
|
143
180
|
})
|
|
144
181
|
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormApiTokenContainer.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Field, Flex, Grid, TextInput, Typography } from '@strapi/design-system';\nimport { FormikErrors } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth } from '../../../../features/Auth';\n\nimport { LifeSpanInput } from './LifeSpanInput';\nimport { TokenDescription } from './TokenDescription';\nimport { TokenName } from './TokenName';\nimport { TokenTypeSelect } from './TokenTypeSelect';\n\nimport type { AdminApiToken } from '../../../../../../shared/contracts/admin-token';\nimport type { ApiToken, ContentApiApiToken } from '../../../../../../shared/contracts/api-token';\nimport type { AdminTokenOwner } from '../../../../../../shared/contracts/shared';\nimport type { AuthContextValue } from '../../../../features/Auth';\n\ninterface FormApiTokenContainerProps {\n errors?: FormikErrors<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n onChange: ({ target: { name, value } }: { target: { name: string; value: string } }) => void;\n canEditInputs: boolean;\n values?: Partial<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n isCreating: boolean;\n apiToken?: null | Partial<ApiToken>;\n kind: 'admin' | 'content-api';\n onDispatch: React.Dispatch<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: any;\n value?: unknown;\n }>;\n setHasChangedPermissions: (hasChanged: boolean) => void;\n}\n\nconst formatAdminUserName = (\n owner: Pick<AdminTokenOwner, 'firstname' | 'lastname' | 'email' | 'username'>\n): string => {\n const full = [owner.firstname, owner.lastname].filter(Boolean).join(' ');\n return full || owner.username || owner.email || '';\n};\n\nexport const FormApiTokenContainer = ({\n errors = {},\n onChange,\n canEditInputs,\n isCreating,\n values = {},\n apiToken = {},\n kind,\n onDispatch,\n setHasChangedPermissions,\n}: FormApiTokenContainerProps) => {\n const { formatMessage } = useIntl();\n const currentUser = useAuth('FormApiTokenContainer', (state: AuthContextValue) => state.user);\n\n const ownerToDisplay = (() => {\n const owner =\n kind === 'admin'\n ? (apiToken as Partial<AdminApiToken> | null | undefined)?.adminUserOwner\n : undefined;\n if (owner === undefined || owner === null) return null;\n if (typeof owner !== 'object') return null;\n if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;\n return owner;\n })();\n\n const handleChangeSelectApiTokenType = ({ target: { value } }: { target: { value: string } }) => {\n setHasChangedPermissions(false);\n\n if (value === 'full-access') {\n onDispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (value === 'read-only') {\n onDispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n };\n\n const typeOptions = [\n {\n value: 'read-only',\n label: {\n id: 'Settings.tokens.types.read-only',\n defaultMessage: 'Read-only',\n },\n },\n {\n value: 'full-access',\n label: {\n id: 'Settings.tokens.types.full-access',\n defaultMessage: 'Full access',\n },\n },\n {\n value: 'custom',\n label: {\n id: 'Settings.tokens.types.custom',\n defaultMessage: 'Custom',\n },\n },\n ];\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n </Typography>\n <Grid.Root gap={5}>\n <Grid.Item key=\"name\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenName\n error={errors['name']}\n value={values['name']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"description\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenDescription\n error={errors['description']}\n value={values['description']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"lifespan\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <LifeSpanInput\n isCreating={isCreating}\n error={errors['lifespan']}\n value={values['lifespan']}\n onChange={onChange}\n token={apiToken}\n />\n </Grid.Item>\n\n {kind === 'content-api' && (\n <Grid.Item key=\"type\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenTypeSelect\n value={values['type']}\n error={errors['type']}\n label={{\n id: 'Settings.tokens.form.type',\n defaultMessage: 'Token type',\n }}\n onChange={(value) => {\n handleChangeSelectApiTokenType({ target: { value: String(value) } });\n\n onChange({ target: { name: 'type', value: String(value) } });\n }}\n options={typeOptions}\n canEditInputs={canEditInputs}\n />\n </Grid.Item>\n )}\n {ownerToDisplay !== null && (\n <Grid.Item key=\"owner\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"adminUserOwner\">\n <Field.Label>\n {formatMessage({\n id: 'Settings.tokens.form.owner',\n defaultMessage: 'Owner',\n })}\n </Field.Label>\n <TextInput\n type=\"text\"\n value={formatAdminUserName(ownerToDisplay)}\n disabled\n onChange={() => {}}\n />\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n );\n};\n"],"names":["formatAdminUserName","owner","full","firstname","lastname","filter","Boolean","join","username","email","FormApiTokenContainer","errors","onChange","canEditInputs","isCreating","values","apiToken","kind","onDispatch","setHasChangedPermissions","formatMessage","useIntl","currentUser","useAuth","state","user","ownerToDisplay","adminUserOwner","undefined","id","handleChangeSelectApiTokenType","target","value","type","typeOptions","label","defaultMessage","_jsx","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","_jsxs","Flex","direction","alignItems","gap","Typography","variant","tag","Grid","Root","Item","m","xs","TokenName","error","TokenDescription","LifeSpanInput","token","TokenTypeSelect","String","name","options","Field","Label","TextInput","disabled"],"mappings":"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"}
|
|
@@ -1,14 +1,30 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import 'react';
|
|
3
|
-
import { Box, Flex, Typography, Grid } from '@strapi/design-system';
|
|
3
|
+
import { Box, Flex, Typography, Grid, Field, TextInput } from '@strapi/design-system';
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { useAuth } from '../../../../features/Auth.mjs';
|
|
6
|
+
import { LifeSpanInput } from './LifeSpanInput.mjs';
|
|
7
|
+
import { TokenDescription } from './TokenDescription.mjs';
|
|
8
|
+
import { TokenName } from './TokenName.mjs';
|
|
9
|
+
import { TokenTypeSelect } from './TokenTypeSelect.mjs';
|
|
9
10
|
|
|
10
|
-
const
|
|
11
|
+
const formatAdminUserName = (owner)=>{
|
|
12
|
+
const full = [
|
|
13
|
+
owner.firstname,
|
|
14
|
+
owner.lastname
|
|
15
|
+
].filter(Boolean).join(' ');
|
|
16
|
+
return full || owner.username || owner.email || '';
|
|
17
|
+
};
|
|
18
|
+
const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreating, values = {}, apiToken = {}, kind, onDispatch, setHasChangedPermissions })=>{
|
|
11
19
|
const { formatMessage } = useIntl();
|
|
20
|
+
const currentUser = useAuth('FormApiTokenContainer', (state)=>state.user);
|
|
21
|
+
const ownerToDisplay = (()=>{
|
|
22
|
+
const owner = kind === 'admin' ? apiToken?.adminUserOwner : undefined;
|
|
23
|
+
if (owner === undefined || owner === null) return null;
|
|
24
|
+
if (typeof owner !== 'object') return null;
|
|
25
|
+
if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;
|
|
26
|
+
return owner;
|
|
27
|
+
})();
|
|
12
28
|
const handleChangeSelectApiTokenType = ({ target: { value } })=>{
|
|
13
29
|
setHasChangedPermissions(false);
|
|
14
30
|
if (value === 'full-access') {
|
|
@@ -106,7 +122,7 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
|
|
|
106
122
|
token: apiToken
|
|
107
123
|
})
|
|
108
124
|
}, "lifespan"),
|
|
109
|
-
/*#__PURE__*/ jsx(Grid.Item, {
|
|
125
|
+
kind === 'content-api' && /*#__PURE__*/ jsx(Grid.Item, {
|
|
110
126
|
m: 6,
|
|
111
127
|
xs: 12,
|
|
112
128
|
direction: "column",
|
|
@@ -119,24 +135,45 @@ const FormApiTokenContainer = ({ errors = {}, onChange, canEditInputs, isCreatin
|
|
|
119
135
|
defaultMessage: 'Token type'
|
|
120
136
|
},
|
|
121
137
|
onChange: (value)=>{
|
|
122
|
-
// @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
|
|
123
138
|
handleChangeSelectApiTokenType({
|
|
124
139
|
target: {
|
|
125
|
-
value
|
|
140
|
+
value: String(value)
|
|
126
141
|
}
|
|
127
142
|
});
|
|
128
|
-
// @ts-expect-error – DS Select supports numbers & strings, will be removed in V2
|
|
129
143
|
onChange({
|
|
130
144
|
target: {
|
|
131
145
|
name: 'type',
|
|
132
|
-
value
|
|
146
|
+
value: String(value)
|
|
133
147
|
}
|
|
134
148
|
});
|
|
135
149
|
},
|
|
136
150
|
options: typeOptions,
|
|
137
151
|
canEditInputs: canEditInputs
|
|
138
152
|
})
|
|
139
|
-
}, "type")
|
|
153
|
+
}, "type"),
|
|
154
|
+
ownerToDisplay !== null && /*#__PURE__*/ jsx(Grid.Item, {
|
|
155
|
+
m: 6,
|
|
156
|
+
xs: 12,
|
|
157
|
+
direction: "column",
|
|
158
|
+
alignItems: "stretch",
|
|
159
|
+
children: /*#__PURE__*/ jsxs(Field.Root, {
|
|
160
|
+
name: "adminUserOwner",
|
|
161
|
+
children: [
|
|
162
|
+
/*#__PURE__*/ jsx(Field.Label, {
|
|
163
|
+
children: formatMessage({
|
|
164
|
+
id: 'Settings.tokens.form.owner',
|
|
165
|
+
defaultMessage: 'Owner'
|
|
166
|
+
})
|
|
167
|
+
}),
|
|
168
|
+
/*#__PURE__*/ jsx(TextInput, {
|
|
169
|
+
type: "text",
|
|
170
|
+
value: formatAdminUserName(ownerToDisplay),
|
|
171
|
+
disabled: true,
|
|
172
|
+
onChange: ()=>{}
|
|
173
|
+
})
|
|
174
|
+
]
|
|
175
|
+
})
|
|
176
|
+
}, "owner")
|
|
140
177
|
]
|
|
141
178
|
})
|
|
142
179
|
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormApiTokenContainer.mjs","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Field, Flex, Grid, TextInput, Typography } from '@strapi/design-system';\nimport { FormikErrors } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth } from '../../../../features/Auth';\n\nimport { LifeSpanInput } from './LifeSpanInput';\nimport { TokenDescription } from './TokenDescription';\nimport { TokenName } from './TokenName';\nimport { TokenTypeSelect } from './TokenTypeSelect';\n\nimport type { AdminApiToken } from '../../../../../../shared/contracts/admin-token';\nimport type { ApiToken, ContentApiApiToken } from '../../../../../../shared/contracts/api-token';\nimport type { AdminTokenOwner } from '../../../../../../shared/contracts/shared';\nimport type { AuthContextValue } from '../../../../features/Auth';\n\ninterface FormApiTokenContainerProps {\n errors?: FormikErrors<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n onChange: ({ target: { name, value } }: { target: { name: string; value: string } }) => void;\n canEditInputs: boolean;\n values?: Partial<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;\n isCreating: boolean;\n apiToken?: null | Partial<ApiToken>;\n kind: 'admin' | 'content-api';\n onDispatch: React.Dispatch<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type: any;\n value?: unknown;\n }>;\n setHasChangedPermissions: (hasChanged: boolean) => void;\n}\n\nconst formatAdminUserName = (\n owner: Pick<AdminTokenOwner, 'firstname' | 'lastname' | 'email' | 'username'>\n): string => {\n const full = [owner.firstname, owner.lastname].filter(Boolean).join(' ');\n return full || owner.username || owner.email || '';\n};\n\nexport const FormApiTokenContainer = ({\n errors = {},\n onChange,\n canEditInputs,\n isCreating,\n values = {},\n apiToken = {},\n kind,\n onDispatch,\n setHasChangedPermissions,\n}: FormApiTokenContainerProps) => {\n const { formatMessage } = useIntl();\n const currentUser = useAuth('FormApiTokenContainer', (state: AuthContextValue) => state.user);\n\n const ownerToDisplay = (() => {\n const owner =\n kind === 'admin'\n ? (apiToken as Partial<AdminApiToken> | null | undefined)?.adminUserOwner\n : undefined;\n if (owner === undefined || owner === null) return null;\n if (typeof owner !== 'object') return null;\n if (currentUser?.id !== undefined && owner.id === currentUser.id) return null;\n return owner;\n })();\n\n const handleChangeSelectApiTokenType = ({ target: { value } }: { target: { value: string } }) => {\n setHasChangedPermissions(false);\n\n if (value === 'full-access') {\n onDispatch({\n type: 'SELECT_ALL_ACTIONS',\n });\n }\n if (value === 'read-only') {\n onDispatch({\n type: 'ON_CHANGE_READ_ONLY',\n });\n }\n };\n\n const typeOptions = [\n {\n value: 'read-only',\n label: {\n id: 'Settings.tokens.types.read-only',\n defaultMessage: 'Read-only',\n },\n },\n {\n value: 'full-access',\n label: {\n id: 'Settings.tokens.types.full-access',\n defaultMessage: 'Full access',\n },\n },\n {\n value: 'custom',\n label: {\n id: 'Settings.tokens.types.custom',\n defaultMessage: 'Custom',\n },\n },\n ];\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n </Typography>\n <Grid.Root gap={5}>\n <Grid.Item key=\"name\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenName\n error={errors['name']}\n value={values['name']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"description\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenDescription\n error={errors['description']}\n value={values['description']}\n canEditInputs={canEditInputs}\n onChange={onChange}\n />\n </Grid.Item>\n <Grid.Item key=\"lifespan\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <LifeSpanInput\n isCreating={isCreating}\n error={errors['lifespan']}\n value={values['lifespan']}\n onChange={onChange}\n token={apiToken}\n />\n </Grid.Item>\n\n {kind === 'content-api' && (\n <Grid.Item key=\"type\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <TokenTypeSelect\n value={values['type']}\n error={errors['type']}\n label={{\n id: 'Settings.tokens.form.type',\n defaultMessage: 'Token type',\n }}\n onChange={(value) => {\n handleChangeSelectApiTokenType({ target: { value: String(value) } });\n\n onChange({ target: { name: 'type', value: String(value) } });\n }}\n options={typeOptions}\n canEditInputs={canEditInputs}\n />\n </Grid.Item>\n )}\n {ownerToDisplay !== null && (\n <Grid.Item key=\"owner\" m={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root name=\"adminUserOwner\">\n <Field.Label>\n {formatMessage({\n id: 'Settings.tokens.form.owner',\n defaultMessage: 'Owner',\n })}\n </Field.Label>\n <TextInput\n type=\"text\"\n value={formatAdminUserName(ownerToDisplay)}\n disabled\n onChange={() => {}}\n />\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n );\n};\n"],"names":["formatAdminUserName","owner","full","firstname","lastname","filter","Boolean","join","username","email","FormApiTokenContainer","errors","onChange","canEditInputs","isCreating","values","apiToken","kind","onDispatch","setHasChangedPermissions","formatMessage","useIntl","currentUser","useAuth","state","user","ownerToDisplay","adminUserOwner","undefined","id","handleChangeSelectApiTokenType","target","value","type","typeOptions","label","defaultMessage","_jsx","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","_jsxs","Flex","direction","alignItems","gap","Typography","variant","tag","Grid","Root","Item","m","xs","TokenName","error","TokenDescription","LifeSpanInput","token","TokenTypeSelect","String","name","options","Field","Label","TextInput","disabled"],"mappings":"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"}
|
|
@@ -140,7 +140,7 @@ const FormHead = ({ title, token, setToken, toggleToken, showToken, canShowToken
|
|
|
140
140
|
width: "100%",
|
|
141
141
|
gap: 2,
|
|
142
142
|
children: [
|
|
143
|
-
token?.id && toggleToken && /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.apiTokens.ViewAPIToken, {
|
|
143
|
+
token?.id && toggleToken && canShowToken === true && /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.apiTokens.ViewAPIToken, {
|
|
144
144
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
|
|
145
145
|
label: !canShowToken && formatMessage({
|
|
146
146
|
id: 'Settings.tokens.encryptionKeyMissing',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormHead.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormHead.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Tooltip } from '@strapi/design-system';\nimport { Check, ArrowClockwise, Eye, EyeStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ConfirmDialog } from '../../../../components/ConfirmDialog';\nimport { tours } from '../../../../components/GuidedTour/Tours';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useRegenerateTokenMutation } from '../../../../services/transferTokens';\n\nimport type { Data } from '@strapi/types';\n\ninterface RegenerateProps {\n onRegenerate?: (newKey: string) => void;\n url: string;\n}\n\nconst ActionButton = styled(Button)`\n white-space: nowrap;\n`;\n\nconst Regenerate = ({ onRegenerate, url }: RegenerateProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const [isLoadingConfirmation, setIsLoadingConfirmation] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [regenerateToken] = useRegenerateTokenMutation();\n\n const regenerateData = async () => {\n try {\n const res = await regenerateToken(url);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n if (onRegenerate) {\n onRegenerate(res.data.accessKey);\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n } finally {\n setIsLoadingConfirmation(false);\n }\n };\n\n const handleConfirmRegeneration = async () => {\n regenerateData();\n setShowConfirmDialog(false);\n };\n\n return (\n <Dialog.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Dialog.Trigger>\n <ActionButton\n startIcon={<ArrowClockwise />}\n type=\"button\"\n size=\"S\"\n variant=\"tertiary\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"regenerate\"\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </ActionButton>\n </Dialog.Trigger>\n\n <ConfirmDialog\n title={formatMessage({\n id: 'Settings.tokens.RegenerateDialog.title',\n defaultMessage: 'Regenerate token',\n })}\n endAction={\n <Button\n startIcon={<ArrowClockwise />}\n loading={isLoadingConfirmation}\n onClick={handleConfirmRegeneration}\n >\n {formatMessage({\n id: 'Settings.tokens.Button.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n }\n >\n {formatMessage({\n id: 'Settings.tokens.popUpWarning.message',\n defaultMessage: 'Are you sure you want to regenerate this token?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\ninterface Token {\n id: Data.ID;\n name: string;\n}\n\ninterface FormHeadProps<TToken extends Token | null> {\n title: MessageDescriptor;\n token: TToken;\n canEditInputs: boolean;\n canRegenerate: boolean;\n canShowToken?: boolean;\n setToken: (token: TToken) => void;\n toggleToken?: () => void;\n showToken?: boolean;\n isSubmitting: boolean;\n regenerateUrl: string;\n}\n\nexport const FormHead = <TToken extends Token | null>({\n title,\n token,\n setToken,\n toggleToken,\n showToken,\n canShowToken,\n canEditInputs,\n canRegenerate,\n isSubmitting,\n regenerateUrl,\n}: FormHeadProps<TToken>) => {\n const { formatMessage } = useIntl();\n const handleRegenerate = (newKey: string) => {\n setToken({\n ...token,\n accessKey: newKey,\n });\n toggleToken?.();\n };\n\n return (\n <Layouts.Header\n title={token?.name || formatMessage(title)}\n primaryAction={\n canEditInputs ? (\n <Flex width=\"100%\" gap={2} wrap={{ initial: 'wrap', medium: 'nowrap' }}>\n {canRegenerate && token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )}\n <Flex width=\"100%\" gap={2}>\n {token?.id && toggleToken && (\n <tours.apiTokens.ViewAPIToken>\n <Tooltip\n label={\n !canShowToken &&\n formatMessage({\n id: 'Settings.tokens.encryptionKeyMissing',\n defaultMessage:\n 'In order to view the token, you need a valid encryption key in the admin configuration',\n })\n }\n >\n <ActionButton\n type=\"button\"\n startIcon={showToken ? <EyeStriked /> : <Eye />}\n variant=\"secondary\"\n onClick={() => toggleToken?.()}\n disabled={!canShowToken}\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.viewToken',\n defaultMessage: 'View token',\n })}\n </ActionButton>\n </Tooltip>\n </tours.apiTokens.ViewAPIToken>\n )}\n <ActionButton\n disabled={isSubmitting}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </ActionButton>\n </Flex>\n </Flex>\n ) : (\n canRegenerate &&\n token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )\n )\n }\n navigationAction={\n // The back link for mobile works differently; it is placed higher up in the DOM.\n <Box display={{ initial: 'none', medium: 'block' }}>\n <BackButton />\n </Box>\n }\n ellipsis\n />\n );\n};\n"],"names":["ActionButton","styled","Button","Regenerate","onRegenerate","url","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","isLoadingConfirmation","setIsLoadingConfirmation","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","regenerateToken","useRegenerateTokenMutation","regenerateData","res","type","message","error","data","accessKey","id","defaultMessage","handleConfirmRegeneration","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Trigger","startIcon","ArrowClockwise","size","variant","onClick","name","fullWidth","ConfirmDialog","title","endAction","loading","FormHead","token","setToken","toggleToken","showToken","canShowToken","canEditInputs","canRegenerate","isSubmitting","regenerateUrl","handleRegenerate","newKey","Layouts","Header","primaryAction","Flex","width","gap","wrap","initial","medium","tours","apiTokens","ViewAPIToken","Tooltip","label","EyeStriked","Eye","disabled","Check","navigationAction","Box","display","BackButton","ellipsis"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormHead.js","sources":["../../../../../../../../admin/src/pages/Settings/components/Tokens/FormHead.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Dialog, Flex, Tooltip } from '@strapi/design-system';\nimport { Check, ArrowClockwise, Eye, EyeStriked } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ConfirmDialog } from '../../../../components/ConfirmDialog';\nimport { tours } from '../../../../components/GuidedTour/Tours';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useRegenerateTokenMutation } from '../../../../services/transferTokens';\n\nimport type { Data } from '@strapi/types';\n\ninterface RegenerateProps {\n onRegenerate?: (newKey: string) => void;\n url: string;\n}\n\nconst ActionButton = styled(Button)`\n white-space: nowrap;\n`;\n\nconst Regenerate = ({ onRegenerate, url }: RegenerateProps) => {\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n\n const [isLoadingConfirmation, setIsLoadingConfirmation] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [regenerateToken] = useRegenerateTokenMutation();\n\n const regenerateData = async () => {\n try {\n const res = await regenerateToken(url);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n if (onRegenerate) {\n onRegenerate(res.data.accessKey);\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n } finally {\n setIsLoadingConfirmation(false);\n }\n };\n\n const handleConfirmRegeneration = async () => {\n regenerateData();\n setShowConfirmDialog(false);\n };\n\n return (\n <Dialog.Root open={showConfirmDialog} onOpenChange={setShowConfirmDialog}>\n <Dialog.Trigger>\n <ActionButton\n startIcon={<ArrowClockwise />}\n type=\"button\"\n size=\"S\"\n variant=\"tertiary\"\n onClick={() => setShowConfirmDialog(true)}\n name=\"regenerate\"\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </ActionButton>\n </Dialog.Trigger>\n\n <ConfirmDialog\n title={formatMessage({\n id: 'Settings.tokens.RegenerateDialog.title',\n defaultMessage: 'Regenerate token',\n })}\n endAction={\n <Button\n startIcon={<ArrowClockwise />}\n loading={isLoadingConfirmation}\n onClick={handleConfirmRegeneration}\n >\n {formatMessage({\n id: 'Settings.tokens.Button.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Button>\n }\n >\n {formatMessage({\n id: 'Settings.tokens.popUpWarning.message',\n defaultMessage: 'Are you sure you want to regenerate this token?',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\ninterface Token {\n id: Data.ID;\n name: string;\n}\n\ninterface FormHeadProps<TToken extends Token | null> {\n title: MessageDescriptor;\n token: TToken;\n canEditInputs: boolean;\n canRegenerate: boolean;\n canShowToken?: boolean;\n setToken: (token: TToken) => void;\n toggleToken?: () => void;\n showToken?: boolean;\n isSubmitting: boolean;\n regenerateUrl: string;\n}\n\nexport const FormHead = <TToken extends Token | null>({\n title,\n token,\n setToken,\n toggleToken,\n showToken,\n canShowToken,\n canEditInputs,\n canRegenerate,\n isSubmitting,\n regenerateUrl,\n}: FormHeadProps<TToken>) => {\n const { formatMessage } = useIntl();\n const handleRegenerate = (newKey: string) => {\n setToken({\n ...token,\n accessKey: newKey,\n });\n toggleToken?.();\n };\n\n return (\n <Layouts.Header\n title={token?.name || formatMessage(title)}\n primaryAction={\n canEditInputs ? (\n <Flex width=\"100%\" gap={2} wrap={{ initial: 'wrap', medium: 'nowrap' }}>\n {canRegenerate && token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )}\n <Flex width=\"100%\" gap={2}>\n {token?.id && toggleToken && canShowToken === true && (\n <tours.apiTokens.ViewAPIToken>\n <Tooltip\n label={\n !canShowToken &&\n formatMessage({\n id: 'Settings.tokens.encryptionKeyMissing',\n defaultMessage:\n 'In order to view the token, you need a valid encryption key in the admin configuration',\n })\n }\n >\n <ActionButton\n type=\"button\"\n startIcon={showToken ? <EyeStriked /> : <Eye />}\n variant=\"secondary\"\n onClick={() => toggleToken?.()}\n disabled={!canShowToken}\n fullWidth\n >\n {formatMessage({\n id: 'Settings.tokens.viewToken',\n defaultMessage: 'View token',\n })}\n </ActionButton>\n </Tooltip>\n </tours.apiTokens.ViewAPIToken>\n )}\n <ActionButton\n disabled={isSubmitting}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </ActionButton>\n </Flex>\n </Flex>\n ) : (\n canRegenerate &&\n token?.id && (\n <Regenerate\n onRegenerate={handleRegenerate}\n url={`${regenerateUrl}${token?.id ?? ''}`}\n />\n )\n )\n }\n navigationAction={\n // The back link for mobile works differently; it is placed higher up in the DOM.\n <Box display={{ initial: 'none', medium: 'block' }}>\n <BackButton />\n </Box>\n }\n ellipsis\n />\n );\n};\n"],"names":["ActionButton","styled","Button","Regenerate","onRegenerate","url","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","React","useState","isLoadingConfirmation","setIsLoadingConfirmation","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","regenerateToken","useRegenerateTokenMutation","regenerateData","res","type","message","error","data","accessKey","id","defaultMessage","handleConfirmRegeneration","_jsxs","Dialog","Root","open","onOpenChange","_jsx","Trigger","startIcon","ArrowClockwise","size","variant","onClick","name","fullWidth","ConfirmDialog","title","endAction","loading","FormHead","token","setToken","toggleToken","showToken","canShowToken","canEditInputs","canRegenerate","isSubmitting","regenerateUrl","handleRegenerate","newKey","Layouts","Header","primaryAction","Flex","width","gap","wrap","initial","medium","tours","apiTokens","ViewAPIToken","Tooltip","label","EyeStriked","Eye","disabled","Check","navigationAction","Box","display","BackButton","ellipsis"],"mappings":"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"}
|
|
@@ -119,7 +119,7 @@ const FormHead = ({ title, token, setToken, toggleToken, showToken, canShowToken
|
|
|
119
119
|
width: "100%",
|
|
120
120
|
gap: 2,
|
|
121
121
|
children: [
|
|
122
|
-
token?.id && toggleToken && /*#__PURE__*/ jsx(tours.apiTokens.ViewAPIToken, {
|
|
122
|
+
token?.id && toggleToken && canShowToken === true && /*#__PURE__*/ jsx(tours.apiTokens.ViewAPIToken, {
|
|
123
123
|
children: /*#__PURE__*/ jsx(Tooltip, {
|
|
124
124
|
label: !canShowToken && formatMessage({
|
|
125
125
|
id: 'Settings.tokens.encryptionKeyMissing',
|