mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-18 07:01:58 +08:00
166 lines
4.9 KiB
JavaScript
166 lines
4.9 KiB
JavaScript
import React, { Component } from "react";
|
|
import PropTypes from "prop-types";
|
|
import { connect } from "react-redux";
|
|
import { Navbar, Nav, NavItem } from "react-bootstrap";
|
|
import { FormattedMessage } from "react-intl";
|
|
import styled from "styled-components";
|
|
import {
|
|
MAIN_COLOR_BLUE,
|
|
WHITE_COLOR,
|
|
BORDER_GRAY_COLOR
|
|
} from "../../app/constants/colors";
|
|
import { getActivities, destroyActivities } from "../actions/ActivitiesActions";
|
|
import TeamSwitch from "./components/TeamSwitch";
|
|
import GlobalActivitiesModal from "./components/GlobalActivitiesModal";
|
|
import SearchDropdown from "./components/SearchDropdown";
|
|
import NotificationsDropdown from "./components/NotificationsDropdown";
|
|
import InfoDropdown from "./components/InfoDropdown";
|
|
import UserAccountDropdown from "./components/UserAccountDropdown";
|
|
|
|
const StyledNavbar = styled(Navbar)`
|
|
background-color: ${WHITE_COLOR};
|
|
border-color: ${BORDER_GRAY_COLOR};
|
|
`;
|
|
|
|
const StyledBrand = styled.a`
|
|
background-color: ${MAIN_COLOR_BLUE};
|
|
|
|
&:hover,
|
|
&:active,
|
|
&:focus {
|
|
background-color: ${MAIN_COLOR_BLUE} !important;
|
|
}
|
|
|
|
& > img {
|
|
margin-top: -4px;
|
|
max-width: 132px;
|
|
max-height: 26px;
|
|
}
|
|
`;
|
|
|
|
class Navigation extends Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
showActivitesModal: false,
|
|
page: "",
|
|
current_team: { id: 0 }
|
|
};
|
|
this.selectItemCallback = this.selectItemCallback.bind(this);
|
|
this.closeModalCallback = this.closeModalCallback.bind(this);
|
|
}
|
|
|
|
selectItemCallback(key, ev) {
|
|
switch (key) {
|
|
case 1:
|
|
window.location = "/";
|
|
break;
|
|
case 2:
|
|
window.location = "/protocols";
|
|
break;
|
|
case 3:
|
|
window.location = `/teams/${this.props.current_team.id}/repositories`;
|
|
break;
|
|
case 4:
|
|
ev.preventDefault();
|
|
this.setState({ showActivitesModal: !this.state.showActivitesModal });
|
|
// Call action creator to fetch activities from the server
|
|
this.props.fetchActivities();
|
|
break;
|
|
default:
|
|
}
|
|
}
|
|
|
|
closeModalCallback() {
|
|
this.setState({ showActivitesModal: false });
|
|
this.props.destroyActivities();
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div>
|
|
<StyledNavbar onSelect={this.selectItemCallback}>
|
|
<Navbar.Header>
|
|
<Navbar.Brand>
|
|
<StyledBrand href="/" title="sciNote">
|
|
<img src="/images/logo.png" alt="Logo" />
|
|
</StyledBrand>
|
|
</Navbar.Brand>
|
|
</Navbar.Header>
|
|
<Nav>
|
|
<NavItem eventKey={1}>
|
|
<span className="glyphicon glyphicon-home" title="Home" />
|
|
<span className="visible-xs-inline visible-sm-inline">
|
|
<FormattedMessage id="navbar.home_label" />
|
|
</span>
|
|
</NavItem>
|
|
<NavItem eventKey={2}>
|
|
<span
|
|
className="glyphicon glyphicon-list-alt"
|
|
title="Protocol repositories"
|
|
/>
|
|
<span className="visible-xs-inline visible-sm-inline">
|
|
<FormattedMessage id="navbar.protocols_label" />
|
|
</span>
|
|
</NavItem>
|
|
<NavItem eventKey={3}>
|
|
<i
|
|
className="fa fa-cubes"
|
|
aria-hidden="true"
|
|
title="Repositories"
|
|
/>
|
|
<span className="visible-xs-inline visible-sm-inline">
|
|
<FormattedMessage id="navbar.repositories_label" />
|
|
</span>
|
|
</NavItem>
|
|
<NavItem eventKey={4}>
|
|
<span
|
|
className="glyphicon glyphicon-equalizer"
|
|
title="Activities"
|
|
/>
|
|
<span className="visible-xs-inline visible-sm-inline">
|
|
<FormattedMessage id="navbar.activities_label" />
|
|
</span>
|
|
</NavItem>
|
|
</Nav>
|
|
<Nav pullRight>
|
|
<TeamSwitch eventKey={5} />
|
|
<SearchDropdown />
|
|
<NotificationsDropdown />
|
|
<InfoDropdown />
|
|
<UserAccountDropdown />
|
|
</Nav>
|
|
</StyledNavbar>
|
|
<GlobalActivitiesModal
|
|
showModal={this.state.showActivitesModal}
|
|
onCloseModal={this.closeModalCallback}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
Navigation.propTypes = {
|
|
fetchActivities: PropTypes.func.isRequired,
|
|
destroyActivities: PropTypes.func.isRequired,
|
|
current_team: PropTypes.shape({
|
|
id: PropTypes.number.isRequired,
|
|
name: PropTypes.string.isRequired,
|
|
current_team: PropTypes.bool.isRequired
|
|
}).isRequired
|
|
};
|
|
|
|
// Map the states from store to component props
|
|
const mapStateToProps = ({ current_team }) => ({ current_team });
|
|
|
|
// Map the fetch activity action to component props
|
|
const mapDispatchToProps = dispatch => ({
|
|
fetchActivities() {
|
|
dispatch(getActivities());
|
|
},
|
|
destroyActivities() {
|
|
dispatch(destroyActivities());
|
|
}
|
|
});
|
|
|
|
export default connect(mapStateToProps, mapDispatchToProps)(Navigation);
|