1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/frontend/src/component/app.jsx

207 lines
8.5 KiB
React
Raw Normal View History

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {
Layout,
Drawer,
Header,
Navigation,
Content,
Footer,
FooterSection,
FooterDropDownSection,
FooterLinkList,
Grid,
Cell,
Icon,
2016-12-04 11:56:41 +01:00
} from 'react-mdl';
2016-12-05 17:04:00 +01:00
import { Link } from 'react-router';
import styles from './styles.scss';
2016-11-10 14:26:24 +01:00
import ErrorContainer from './error/error-container';
import AuthenticationContainer from './user/authentication-container';
2016-11-25 15:37:06 +01:00
import ShowUserContainer from './user/show-user-container';
2017-11-24 08:41:36 +01:00
import ShowApiDetailsContainer from './api/show-api-details-container';
2016-12-29 11:55:25 +01:00
import { ScrollContainer } from 'react-router-scroll';
function replace(input, params) {
2016-12-05 17:04:00 +01:00
if (!params) {
return input;
}
Object.keys(params).forEach(key => {
input = input.replace(`:${key}`, params[key]);
});
return input;
}
2016-11-10 14:26:24 +01:00
export default class App extends Component {
static propTypes = {
location: PropTypes.object.isRequired,
params: PropTypes.object.isRequired,
routes: PropTypes.array.isRequired,
};
2016-11-10 14:26:24 +01:00
2016-12-04 11:56:41 +01:00
static contextTypes = {
router: PropTypes.object,
};
2016-11-10 14:26:24 +01:00
componentWillReceiveProps(nextProps) {
2016-12-05 17:10:32 +01:00
if (this.props.location.pathname !== nextProps.location.pathname) {
2016-12-11 19:30:56 +01:00
clearTimeout(this.timer);
this.timer = setTimeout(() => {
const layout = document.querySelector('.mdl-js-layout');
const drawer = document.querySelector('.mdl-layout__drawer');
// hack, might get a built in alternative later
if (drawer.classList.contains('is-visible')) {
layout.MaterialLayout.toggleDrawer();
}
}, 10);
2016-12-05 17:10:32 +01:00
}
}
getSections() {
2016-12-05 17:04:00 +01:00
const { routes, params } = this.props;
const unique = {};
const result = routes
.splice(1)
.map(routeEntry => ({
name: replace(routeEntry.pageTitle, params),
link: replace(routeEntry.link || routeEntry.path, params),
}))
.filter(entry => {
if (!unique[entry.link]) {
unique[entry.link] = true;
return true;
}
return false;
});
2016-12-05 17:04:00 +01:00
2016-12-05 17:15:55 +01:00
// mutate document.title:
document.title = result
.map(e => e.name)
2016-12-05 17:16:51 +01:00
.reverse()
.concat('Unleash')
.join(' ');
2016-12-05 17:15:55 +01:00
return result;
}
getTitleWithLinks() {
2016-12-05 17:15:55 +01:00
const result = this.getSections();
2016-12-05 17:04:00 +01:00
return (
<span>
{result.map((entry, index) => (
2017-08-28 21:40:44 +02:00
<span key={entry.link + index} className={index > 0 ? 'mdl-layout--large-screen-only' : ''}>
{index > 0 ? ' ' : null}
<Link
2017-08-28 21:40:44 +02:00
className={[styles.headerTitleLink, 'mdl-color-text--primary-contrast'].join(' ')}
to={entry.link}
>
{entry.name}
</Link>
</span>
2016-12-05 17:04:00 +01:00
))}
</span>
);
}
render() {
const shouldUpdateScroll = (prevRouterProps, { location }) => {
2017-08-28 21:40:44 +02:00
if (prevRouterProps && location.pathname !== prevRouterProps.location.pathname) {
return location.action === 'POP';
} else {
return [0, 0];
}
};
2017-08-28 21:40:44 +02:00
const createListItem = (path, caption, icon, isDrawerNavigation = false) => {
const linkColor =
isDrawerNavigation && this.context.router.isActive(path)
? 'mdl-color-text--black'
: 'mdl-color-text--grey-900';
const iconColor =
isDrawerNavigation && this.context.router.isActive(path)
? 'mdl-color-text--black'
: 'mdl-color-text--grey-600';
return (
2017-08-28 21:40:44 +02:00
<Link to={path} className={isDrawerNavigation && [styles.navigationLink, linkColor].join(' ')}>
{icon && (
<Icon
name={icon}
2017-08-28 21:40:44 +02:00
className={isDrawerNavigation && [styles.navigationIcon, iconColor].join(' ')}
/>
)}
{caption}
</Link>
);
};
2016-12-04 11:56:41 +01:00
return (
2017-03-01 21:53:25 +01:00
<div className={styles.container}>
<AuthenticationContainer />
2016-12-04 11:56:41 +01:00
<Layout fixedHeader>
2016-12-05 17:04:00 +01:00
<Header title={this.getTitleWithLinks()}>
2016-12-04 11:56:41 +01:00
<Navigation>
<ShowUserContainer />
</Navigation>
</Header>
<Drawer className="mdl-color--white">
2017-08-28 21:40:44 +02:00
<span className={[styles.drawerTitle, 'mdl-layout-title'].join(' ')}>
<img src="public/logo.png" width="32" height="32" className={styles.drawerTitleLogo} />
<span className={styles.drawerTitleText}>Unleash</span>
</span>
<hr />
<Navigation className={styles.navigation}>
2017-08-28 21:40:44 +02:00
{createListItem('/features', 'Feature Toggles', 'list', true)}
{createListItem('/strategies', 'Strategies', 'extension', true)}
{createListItem('/history', 'Event History', 'history', true)}
{createListItem('/archive', 'Archived Toggles', 'archive', true)}
{createListItem('/applications', 'Applications', 'apps', true)}
</Navigation>
<hr />
<Navigation className={styles.navigation}>
<a
href="https://github.com/Unleash"
target="_blank"
2017-08-28 21:40:44 +02:00
className={[styles.navigationLink, 'mdl-color-text--grey-900'].join(' ')}
>
2017-11-11 09:12:39 +01:00
<i className={['material-icons', styles.navigationIcon, styles.iconGitHub].join(' ')} />GitHub
</a>
2016-12-04 11:56:41 +01:00
</Navigation>
</Drawer>
2017-08-28 21:40:44 +02:00
<ScrollContainer scrollKey="container" shouldUpdateScroll={shouldUpdateScroll}>
2017-06-29 08:36:10 +02:00
<Content className="mdl-color--grey-50">
<Grid noSpacing className={styles.content}>
<Cell col={12}>
{this.props.children}
<ErrorContainer />
</Cell>
</Grid>
<Footer size="mega">
<FooterSection type="middle">
<FooterDropDownSection title="Menu">
<FooterLinkList>
2017-08-28 21:40:44 +02:00
{createListItem('/features', 'Feature Toggles')}
{createListItem('/strategies', 'Strategies')}
{createListItem('/history', 'Event History')}
{createListItem('/archive', 'Archived Toggles')}
{createListItem('/applications', 'Applications')}
2018-01-17 09:45:38 +01:00
<a href="/api/admin/user/logout">Sign out</a>
2017-06-29 08:36:10 +02:00
</FooterLinkList>
</FooterDropDownSection>
<FooterDropDownSection title="Clients">
<FooterLinkList>
2017-08-28 21:40:44 +02:00
<a href="https://github.com/Unleash/unleash-client-node/">Node.js</a>
<a href="https://github.com/Unleash/unleash-client-java/">Java</a>
<a href="https://github.com/Unleash/unleash-client-go/">Go</a>
2017-06-29 08:36:10 +02:00
</FooterLinkList>
</FooterDropDownSection>
</FooterSection>
2017-11-24 08:41:36 +01:00
<ShowApiDetailsContainer />
2017-06-29 08:36:10 +02:00
</Footer>
</Content>
2016-12-29 11:55:25 +01:00
</ScrollContainer>
2016-12-04 11:56:41 +01:00
</Layout>
</div>
);
2016-11-10 14:26:24 +01:00
}
}