HeaderHorizontal.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import Link from 'next/link';
  4. import {
  5. UncontrolledDropdown,
  6. DropdownToggle,
  7. DropdownMenu,
  8. DropdownItem,
  9. ListGroup,
  10. ListGroupItem,
  11. Nav,
  12. Collapse,
  13. NavItem,
  14. NavLink,
  15. NavbarToggler
  16. } from 'reactstrap';
  17. import { connect } from 'react-redux';
  18. import { bindActionCreators } from 'redux';
  19. import * as actions from '../../store/actions/actions';
  20. import ToggleFullscreen from '../Common/ToggleFullscreen';
  21. import HeaderSearch from './HeaderSearch';
  22. import Menu from './Menu.js';
  23. class HeaderHorizontal extends Component {
  24. state = {
  25. navSearchOpen: false,
  26. isOpen: false
  27. };
  28. toggleNavSearch = e => {
  29. e.preventDefault();
  30. this.setState({
  31. navSearchOpen: !this.state.navSearchOpen
  32. });
  33. };
  34. closeNavSearch = e => {
  35. e.preventDefault();
  36. this.setState({
  37. navSearchOpen: false
  38. });
  39. };
  40. toggle = () => {
  41. this.setState({
  42. isOpen: !this.state.isOpen
  43. });
  44. };
  45. toggleOffsidebar = e => {
  46. e.preventDefault();
  47. this.props.actions.toggleSetting('offsidebarOpen');
  48. };
  49. /** map menu config to string to determine which element to render */
  50. itemType = item => {
  51. if (item.heading) return 'heading';
  52. if (!item.submenu) return 'menu';
  53. if (item.submenu) return 'submenu';
  54. };
  55. render() {
  56. return (
  57. <header className="topnavbar-wrapper">
  58. {/* START Top Navbar */}
  59. <nav className="navbar topnavbar navbar-expand-lg navbar-light">
  60. {/* START navbar header */}
  61. <div className="navbar-header">
  62. <a className="navbar-brand" href="#/">
  63. <div className="brand-logo">
  64. {/* <img
  65. className="img-fluid"
  66. src="/static/img/logo-inner.png"
  67. alt="App Logo"
  68. /> */}
  69. </div>
  70. <div className="brand-logo-collapsed">
  71. <img
  72. className="img-fluid"
  73. src="/static/img/logo-single.png"
  74. alt="App Logo"
  75. />
  76. </div>
  77. </a>
  78. <NavbarToggler onClick={this.toggle} />
  79. </div>
  80. {/* END navbar header */}
  81. {/* START Nav wrapper */}
  82. <Collapse isOpen={this.state.isOpen} navbar>
  83. <Nav navbar className="mr-auto flex-column flex-lg-row">
  84. {Menu.map((item, i) => {
  85. if (this.itemType(item) === 'menu') {
  86. return (
  87. <NavItem key={i}>
  88. <Link href={item.path}>
  89. <NavLink>{item.name}</NavLink>
  90. </Link>
  91. </NavItem>
  92. );
  93. }
  94. if (this.itemType(item) === 'submenu') {
  95. return (
  96. <UncontrolledDropdown nav inNavbar key={i}>
  97. <DropdownToggle nav>{item.name}</DropdownToggle>
  98. <DropdownMenu className="animated fadeIn">
  99. {item.submenu.map((sitem, si) => {
  100. return (
  101. <Link href={sitem.path} key={si}>
  102. <DropdownItem>
  103. {sitem.name}
  104. </DropdownItem>
  105. </Link>
  106. );
  107. })}
  108. </DropdownMenu>
  109. </UncontrolledDropdown>
  110. );
  111. }
  112. })}
  113. {/* END Left navbar */}
  114. </Nav>
  115. <Nav className="flex-row" navbar>
  116. {/* Search icon */}
  117. <NavItem>
  118. <NavLink onClick={this.toggleNavSearch}>
  119. <em className="icon-magnifier" />
  120. </NavLink>
  121. </NavItem>
  122. {/* Fullscreen (only desktops) */}
  123. <NavItem className="d-none d-md-block">
  124. <ToggleFullscreen className="nav-link" />
  125. </NavItem>
  126. {/* START Alert menu */}
  127. <UncontrolledDropdown nav inNavbar className="dropdown-list">
  128. <DropdownToggle nav className="dropdown-toggle-nocaret">
  129. <em className="icon-bell" />
  130. <span className="badge badge-danger">11</span>
  131. </DropdownToggle>
  132. {/* START Dropdown menu */}
  133. <DropdownMenu
  134. right
  135. className="dropdown-menu-right animated flipInX"
  136. >
  137. <DropdownItem>
  138. {/* START list group */}
  139. <ListGroup>
  140. <ListGroupItem
  141. action
  142. tag="a"
  143. href=""
  144. onClick={e => e.preventDefault()}
  145. >
  146. <div className="media">
  147. <div className="align-self-start mr-2">
  148. <em className="fab fa-twitter fa-2x text-info" />
  149. </div>
  150. <div className="media-body">
  151. <p className="m-0">New followers</p>
  152. <p className="m-0 text-muted text-sm">
  153. 1 new follower
  154. </p>
  155. </div>
  156. </div>
  157. </ListGroupItem>
  158. <ListGroupItem
  159. action
  160. tag="a"
  161. href=""
  162. onClick={e => e.preventDefault()}
  163. >
  164. <div className="media">
  165. <div className="align-self-start mr-2">
  166. <em className="fa fa-envelope fa-2x text-warning" />
  167. </div>
  168. <div className="media-body">
  169. <p className="m-0">New e-mails</p>
  170. <p className="m-0 text-muted text-sm">
  171. You have 10 new emails
  172. </p>
  173. </div>
  174. </div>
  175. </ListGroupItem>
  176. <ListGroupItem
  177. action
  178. tag="a"
  179. href=""
  180. onClick={e => e.preventDefault()}
  181. >
  182. <div className="media">
  183. <div className="align-self-start mr-2">
  184. <em className="fa fa-tasks fa-2x text-success" />
  185. </div>
  186. <div className="media-body">
  187. <p className="m-0">Pending Tasks</p>
  188. <p className="m-0 text-muted text-sm">
  189. 11 pending task
  190. </p>
  191. </div>
  192. </div>
  193. </ListGroupItem>
  194. <ListGroupItem
  195. action
  196. tag="a"
  197. href=""
  198. onClick={e => e.preventDefault()}
  199. >
  200. <span className="d-flex align-items-center">
  201. <span className="text-sm">
  202. More notifications
  203. </span>
  204. <span className="badge badge-danger ml-auto">
  205. 14
  206. </span>
  207. </span>
  208. </ListGroupItem>
  209. </ListGroup>
  210. {/* END list group */}
  211. </DropdownItem>
  212. </DropdownMenu>
  213. {/* END Dropdown menu */}
  214. </UncontrolledDropdown>
  215. {/* END Alert menu */}
  216. {/* START Offsidebar button */}
  217. <NavItem>
  218. <NavLink href="" onClick={this.toggleOffsidebar}>
  219. <em className="icon-notebook" />
  220. </NavLink>
  221. </NavItem>
  222. {/* END Offsidebar menu */}
  223. </Nav>
  224. </Collapse>
  225. {/* END Nav wrapper */}
  226. {/* START Search form */}
  227. <HeaderSearch isOpen={this.state.navSearchOpen} onClose={this.closeNavSearch} />
  228. {/* END Search form */}
  229. </nav>
  230. {/* END Top Navbar */}
  231. </header>
  232. );
  233. }
  234. }
  235. HeaderHorizontal.propTypes = {
  236. actions: PropTypes.object,
  237. settings: PropTypes.object
  238. };
  239. const mapStateToProps = state => ({ settings: state.settings });
  240. const mapDispatchToProps = dispatch => ({
  241. actions: bindActionCreators(actions, dispatch)
  242. });
  243. export default connect(
  244. mapStateToProps,
  245. mapDispatchToProps
  246. )(HeaderHorizontal);