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}
>
+
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();
});