diff --git a/frontend/src/component/admin/api/index.tsx b/frontend/src/component/admin/api/index.tsx index fa2a0c16f9..f735e39662 100644 --- a/frontend/src/component/admin/api/index.tsx +++ b/frontend/src/component/admin/api/index.tsx @@ -1,16 +1,19 @@ -import { ApiTokenList } from '../apiToken/ApiTokenList/ApiTokenList'; import AdminMenu from '../menu/AdminMenu'; import ConditionallyRender from 'component/common/ConditionallyRender'; -import AccessContext from 'contexts/AccessContext'; -import { useContext } from 'react'; +import { ApiTokenPage } from 'component/admin/apiToken/ApiTokenPage/ApiTokenPage'; +import { useLocation } from 'react-router-dom'; const ApiPage = () => { - const { isAdmin } = useContext(AccessContext); + const { pathname } = useLocation(); + const showAdminMenu = pathname.includes('/admin/'); return (
- } /> - + } + /> +
); }; diff --git a/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.styles.ts b/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.styles.ts index ebcdb37afd..d89dda8837 100644 --- a/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.styles.ts +++ b/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.styles.ts @@ -13,10 +13,6 @@ export const useStyles = makeStyles(theme => ({ justifyContent: 'center', }, }, - apiError: { - maxWidth: '400px', - marginBottom: '1rem', - }, center: { textAlign: 'center', }, @@ -25,9 +21,6 @@ export const useStyles = makeStyles(theme => ({ display: 'flex-inline', flexWrap: 'nowrap', }, - infoBoxContainer: { - marginBottom: 40, - }, hideSM: { [theme.breakpoints.down('sm')]: { display: 'none', diff --git a/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.tsx b/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.tsx index fe236a90a5..e78146020e 100644 --- a/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.tsx +++ b/frontend/src/component/admin/apiToken/ApiTokenList/ApiTokenList.tsx @@ -1,7 +1,5 @@ -import { Fragment, useContext, useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useContext, useState } from 'react'; import { - Button, IconButton, Table, TableBody, @@ -17,19 +15,12 @@ import useApiTokens from 'hooks/api/getters/useApiTokens/useApiTokens'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import useApiTokensApi from 'hooks/api/actions/useApiTokensApi/useApiTokensApi'; import ApiError from 'component/common/ApiError/ApiError'; -import PageContent from 'component/common/PageContent'; -import HeaderTitle from 'component/common/HeaderTitle'; import ConditionallyRender from 'component/common/ConditionallyRender'; -import { - CREATE_API_TOKEN, - DELETE_API_TOKEN, -} from 'component/providers/AccessProvider/permissions'; +import { DELETE_API_TOKEN } from 'component/providers/AccessProvider/permissions'; import { useStyles } from './ApiTokenList.styles'; import Secret from './secret'; import { Delete, FileCopy } from '@material-ui/icons'; import Dialogue from 'component/common/Dialogue'; -import { CREATE_API_TOKEN_BUTTON } from 'utils/testIds'; -import { Alert } from '@material-ui/lab'; import copy from 'copy-to-clipboard'; import { useLocationSettings } from 'hooks/useLocationSettings'; import { formatDateYMD } from 'utils/formatDate'; @@ -56,16 +47,9 @@ export const ApiTokenList = () => { const { tokens, loading, refetch, error } = useApiTokens(); const { deleteToken } = useApiTokensApi(); const ref = useLoading(loading); - const history = useHistory(); const renderError = () => { - return ( - - ); + return ; }; const copyToken = (value: string) => { @@ -236,87 +220,37 @@ export const ApiTokenList = () => { return (
- - history.push( - '/admin/api/create-token' - ) - } - data-testid={CREATE_API_TOKEN_BUTTON} - > - New API token - - } - /> - } - /> - } + +
+ No API tokens available.
} + elseShow={renderApiTokens(tokens)} + /> +
+ { + setShowDelete(false); + setDeleteToken(undefined); + }} + title="Confirm deletion" > - -

- Read the{' '} - - Getting started guide - {' '} - to learn how to connect to the Unleash API from your - application or programmatically. Please note it can take - up to 1 minute before a new API key is activated. -

+
+ Are you sure you want to delete the following API token?
- API URL: {' '} -
-                        {uiConfig.unleashUrl}/api/
-                    
- - - -
- No API tokens available.
} - elseShow={renderApiTokens(tokens)} - /> +
    +
  • + username:{' '} + {delToken?.username} +
  • +
  • + type: {delToken?.type} +
  • +
- - { - setShowDelete(false); - setDeleteToken(undefined); - }} - title="Confirm deletion" - > -
- Are you sure you want to delete the following API token? -
-
    -
  • - username:{' '} - {delToken?.username} -
  • -
  • - type:{' '} - {delToken?.type} -
  • -
-
-
- +
); }; diff --git a/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.styles.ts b/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.styles.ts new file mode 100644 index 0000000000..16dd3dc13e --- /dev/null +++ b/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.styles.ts @@ -0,0 +1,7 @@ +import { makeStyles } from '@material-ui/core/styles'; + +export const useStyles = makeStyles(theme => ({ + infoBoxContainer: { + marginBottom: 40, + }, +})); diff --git a/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx b/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx new file mode 100644 index 0000000000..4d7563ef6c --- /dev/null +++ b/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx @@ -0,0 +1,77 @@ +import { useContext } from 'react'; +import { useHistory } from 'react-router-dom'; +import { Button } from '@material-ui/core'; +import AccessContext from 'contexts/AccessContext'; +import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; +import PageContent from 'component/common/PageContent'; +import HeaderTitle from 'component/common/HeaderTitle'; +import ConditionallyRender from 'component/common/ConditionallyRender'; +import { + CREATE_API_TOKEN, + READ_API_TOKEN, +} from 'component/providers/AccessProvider/permissions'; +import { useStyles } from './ApiTokenPage.styles'; +import { CREATE_API_TOKEN_BUTTON } from 'utils/testIds'; +import { Alert } from '@material-ui/lab'; +import { ApiTokenList } from 'component/admin/apiToken/ApiTokenList/ApiTokenList'; +import { AdminAlert } from 'component/common/AdminAlert/AdminAlert'; + +export const ApiTokenPage = () => { + const styles = useStyles(); + const { hasAccess } = useContext(AccessContext); + const { uiConfig } = useUiConfig(); + const history = useHistory(); + + return ( + + history.push('/admin/api/create-token') + } + data-testid={CREATE_API_TOKEN_BUTTON} + > + New API token + + } + /> + } + /> + } + > + +

+ Read the{' '} + + Getting started guide + {' '} + to learn how to connect to the Unleash API from your + application or programmatically. Please note it can take up + to 1 minute before a new API key is activated. +

+
+ API URL: {' '} +
+                    {uiConfig.unleashUrl}/api/
+                
+
+ } + elseShow={() => } + /> +
+ ); +}; diff --git a/frontend/src/component/admin/projectRoles/ProjectRoles/ProjectRoles.tsx b/frontend/src/component/admin/projectRoles/ProjectRoles/ProjectRoles.tsx index 5739af8999..3fef9d2e62 100644 --- a/frontend/src/component/admin/projectRoles/ProjectRoles/ProjectRoles.tsx +++ b/frontend/src/component/admin/projectRoles/ProjectRoles/ProjectRoles.tsx @@ -1,5 +1,4 @@ import { Button } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; import { useContext } from 'react'; import { useHistory } from 'react-router-dom'; import AccessContext from 'contexts/AccessContext'; @@ -10,6 +9,7 @@ import { ADMIN } from 'component/providers/AccessProvider/permissions'; import AdminMenu from 'component/admin/menu/AdminMenu'; import { useStyles } from './ProjectRoles.styles'; import ProjectRoleList from './ProjectRoleList/ProjectRoleList'; +import { AdminAlert } from 'component/common/AdminAlert/AdminAlert'; const ProjectRoles = () => { const { hasAccess } = useContext(AccessContext); @@ -53,11 +53,7 @@ const ProjectRoles = () => { } - elseShow={ - - You need instance admin to access this section. - - } + elseShow={} /> diff --git a/frontend/src/component/admin/users/UsersAdmin.tsx b/frontend/src/component/admin/users/UsersAdmin.tsx index 9b18a1c2e5..03e8210500 100644 --- a/frontend/src/component/admin/users/UsersAdmin.tsx +++ b/frontend/src/component/admin/users/UsersAdmin.tsx @@ -5,12 +5,12 @@ import PageContent from 'component/common/PageContent/PageContent'; import AccessContext from 'contexts/AccessContext'; import ConditionallyRender from 'component/common/ConditionallyRender'; import { ADMIN } from 'component/providers/AccessProvider/permissions'; -import { Alert } from '@material-ui/lab'; import HeaderTitle from 'component/common/HeaderTitle'; import { TableActions } from 'component/common/Table/TableActions/TableActions'; import { Button } from '@material-ui/core'; import { useStyles } from './UserAdmin.styles'; import { useHistory } from 'react-router-dom'; +import { AdminAlert } from 'component/common/AdminAlert/AdminAlert'; const UsersAdmin = () => { const [search, setSearch] = useState(''); @@ -63,11 +63,7 @@ const UsersAdmin = () => { } - elseShow={ - - You need instance admin to access this section. - - } + elseShow={} /> diff --git a/frontend/src/component/common/AdminAlert/AdminAlert.tsx b/frontend/src/component/common/AdminAlert/AdminAlert.tsx new file mode 100644 index 0000000000..3352482cc7 --- /dev/null +++ b/frontend/src/component/common/AdminAlert/AdminAlert.tsx @@ -0,0 +1,9 @@ +import { Alert } from '@material-ui/lab'; + +export const AdminAlert = () => { + return ( + + You need instance admin to access this section. + + ); +}; diff --git a/frontend/src/component/history/EventHistoryPage/EventHistoryPage.tsx b/frontend/src/component/history/EventHistoryPage/EventHistoryPage.tsx index ff2b4b2b86..f48d77e13f 100644 --- a/frontend/src/component/history/EventHistoryPage/EventHistoryPage.tsx +++ b/frontend/src/component/history/EventHistoryPage/EventHistoryPage.tsx @@ -1,9 +1,9 @@ -import { Alert } from '@material-ui/lab'; import React, { useContext } from 'react'; import { ADMIN } from 'component/providers/AccessProvider/permissions'; import ConditionallyRender from 'component/common/ConditionallyRender'; import AccessContext from 'contexts/AccessContext'; import { EventHistory } from '../EventHistory/EventHistory'; +import { AdminAlert } from 'component/common/AdminAlert/AdminAlert'; export const EventHistoryPage = () => { const { hasAccess } = useContext(AccessContext); @@ -12,11 +12,7 @@ export const EventHistoryPage = () => { } - elseShow={ - - You need instance admin to access this section. - - } + elseShow={} /> ); }; diff --git a/frontend/src/component/providers/AccessProvider/permissions.ts b/frontend/src/component/providers/AccessProvider/permissions.ts index 2b69a2b1ee..b96a67c12e 100644 --- a/frontend/src/component/providers/AccessProvider/permissions.ts +++ b/frontend/src/component/providers/AccessProvider/permissions.ts @@ -18,6 +18,7 @@ export const UPDATE_ADDON = 'UPDATE_ADDON'; export const DELETE_ADDON = 'DELETE_ADDON'; export const CREATE_API_TOKEN = 'CREATE_API_TOKEN'; export const DELETE_API_TOKEN = 'DELETE_API_TOKEN'; +export const READ_API_TOKEN = 'READ_API_TOKEN'; export const DELETE_ENVIRONMENT = 'DELETE_ENVIRONMENT'; export const UPDATE_ENVIRONMENT = 'UPDATE_ENVIRONMENT'; export const CREATE_FEATURE_STRATEGY = 'CREATE_FEATURE_STRATEGY';