diff --git a/src/webui/app.js b/src/webui/app.js index 6ddfd142d..19b10e01b 100644 --- a/src/webui/app.js +++ b/src/webui/app.js @@ -151,10 +151,14 @@ export default class App extends Component { const { isUserLoggedIn } = this.state; return (
- {this.renderHeader()} + {this.renderLoginModal()} -
); } diff --git a/src/webui/components/Header/index.js b/src/webui/components/Header/index.js index df453806f..2f8044359 100644 --- a/src/webui/components/Header/index.js +++ b/src/webui/components/Header/index.js @@ -16,12 +16,13 @@ import AccountCircle from '@material-ui/icons/AccountCircle'; import { getRegistryURL } from '../../utils/url'; import Link from '../Link'; import Logo from '../Logo'; +import Label from '../Label'; import CopyToClipBoard from '../CopyToClipBoard/index'; import RegistryInfoDialog from '../RegistryInfoDialog'; import type { Node } from 'react'; import { IProps, IState } from './interfaces'; -import { Wrapper, InnerWrapper } from './styles'; +import { Wrapper, InnerWrapper, Greetings } from './styles'; class Header extends Component { handleLoggedInMenu: Function; @@ -138,7 +139,7 @@ class Header extends Component { * render popover menu */ renderMenu(): Node { - const { handleLogout } = this.props; + const { handleLogout, username = '' } = this.props; const { anchorEl } = this.state; const open = Boolean(anchorEl); return ( @@ -160,6 +161,10 @@ class Header extends Component { open={open} onClose={this.handleLoggedInMenuClose} > + + {`Hi,`} + Logout diff --git a/src/webui/components/Header/styles.js b/src/webui/components/Header/styles.js index 2372e564d..de2d25559 100644 --- a/src/webui/components/Header/styles.js +++ b/src/webui/components/Header/styles.js @@ -32,3 +32,7 @@ export const InnerWrapper = styled(Toolbar)` `)}; } `; + +export const Greetings = styled.span` + margin: 0 5px 0 0; +`; diff --git a/src/webui/components/Label/index.js b/src/webui/components/Label/index.js new file mode 100644 index 000000000..947a6cd35 --- /dev/null +++ b/src/webui/components/Label/index.js @@ -0,0 +1,26 @@ +/** + * @prettier + * @flow + */ + +import React from 'react'; +import styled from 'react-emotion'; +import { fontWeight } from '../../utils/styles/sizes'; +import ellipsis from '../../utils/styles/ellipsis'; + +import type { Node } from 'react'; +import { IProps } from './interfaces'; + +const Wrapper = styled.span` + font-weight: ${({ weight }) => fontWeight[weight]}; + text-transform: ${({ capitalize }) => (capitalize ? 'capitalize' : 'none')}; + ${props => props.limit && ellipsis(props.limit)}; +`; + +const Label = ({ text = '', capitalize = false, weight = 'regular', ...props }: IProps): Node => ( + + {text} + +); + +export default Label; diff --git a/src/webui/components/Label/interfaces.js b/src/webui/components/Label/interfaces.js new file mode 100644 index 000000000..8d08900de --- /dev/null +++ b/src/webui/components/Label/interfaces.js @@ -0,0 +1,11 @@ +/** + * @prettier + * @flow + */ + +export interface IProps { + text: string; + capitalize?: boolean; + weight?: string; + limit?: number; +} diff --git a/src/webui/utils/styles/ellipsis.js b/src/webui/utils/styles/ellipsis.js new file mode 100644 index 000000000..55b089216 --- /dev/null +++ b/src/webui/utils/styles/ellipsis.js @@ -0,0 +1,15 @@ +/** + * @prettier + * @flow + */ + +import { css } from 'react-emotion'; + +const ellipsis = (maxWidth: number) => css` + white-space: nowrap; + max-width: ${maxWidth}px; + text-overflow: ellipsis; + overflow: hidden; +`; + +export default ellipsis; diff --git a/src/webui/utils/styles/spacings.js b/src/webui/utils/styles/spacings.js index cd70a7d36..86e10c156 100644 --- a/src/webui/utils/styles/spacings.js +++ b/src/webui/utils/styles/spacings.js @@ -1,8 +1,6 @@ // Spacings // ------------------------- -const spacings = { +export const spacings = { lg: '30px' }; - -export default spacings; diff --git a/test/e2e/e2e.spec.js b/test/e2e/e2e.spec.js index 5bacd06fb..43d1d482c 100644 --- a/test/e2e/e2e.spec.js +++ b/test/e2e/e2e.spec.js @@ -100,8 +100,9 @@ describe('/ (Verdaccio Page)', () => { it('should logout an user', async () => { // we assume the user is logged already - await clickElement('#header--button-account', { clickCount: 1, delay: 2000 }); - await clickElement('#header--button-logout', { clickCount: 1, delay: 200 }); + await clickElement('#header--button-account', { clickCount: 1, delay: 500 }); + await page.waitFor(1000); + await clickElement('#header--button-logout > span', { clickCount: 1, delay: 500 }); await page.waitFor(1000); await evaluateSignIn(); });