Offsidebar.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. import React, { Component } from "react";
  2. import PropTypes from "prop-types";
  3. import { connect } from "react-redux";
  4. import { bindActionCreators } from "redux";
  5. import * as actions from "../../store/actions/actions";
  6. import { TabContent, TabPane, Nav, NavItem, NavLink } from "reactstrap";
  7. class Offsidebar extends Component {
  8. state = {
  9. activeTab: "settings",
  10. offsidebarReady: false,
  11. };
  12. componentDidMount() {
  13. // When mounted display the offsidebar
  14. window.requestAnimationFrame(() => this.setState({ offsidebarReady: true }));
  15. }
  16. toggle = (tab) => {
  17. if (this.state.activeTab !== tab) {
  18. this.setState({
  19. activeTab: tab,
  20. });
  21. }
  22. };
  23. handleSettingCheckbox = (event) => {
  24. this.props.actions.changeSetting(event.target.name, event.target.checked);
  25. };
  26. handleThemeRadio = (event) => {
  27. this.props.actions.changeTheme(event.target.value);
  28. };
  29. render() {
  30. return (
  31. this.state.offsidebarReady && (
  32. <aside className="offsidebar">
  33. {/* START Off Sidebar (right) */}
  34. <nav>
  35. <div>
  36. {/* Nav tabs */}
  37. <Nav tabs justified>
  38. <NavItem>
  39. <NavLink
  40. className={this.state.activeTab === "settings" ? "active" : ""}
  41. onClick={() => {
  42. this.toggle("settings");
  43. }}
  44. >
  45. <em className="icon-equalizer fa-lg"></em>
  46. </NavLink>
  47. </NavItem>
  48. {/* <NavItem>
  49. <NavLink className={ this.state.activeTab === 'chat' ? 'active':'' }
  50. onClick={() => { this.toggle('chat'); }}
  51. >
  52. <em className="icon-user fa-lg"></em>
  53. </NavLink>
  54. </NavItem> */}
  55. </Nav>
  56. {/* Tab panes */}
  57. <TabContent activeTab={this.state.activeTab}>
  58. <TabPane tabId="settings">
  59. <h3 className="text-center text-thin mt-4">Settings</h3>
  60. <div className="p-2">
  61. <h4 className="text-muted text-thin">Themes</h4>
  62. <div className="row row-flush mb-2">
  63. <div className="col-3 mb-3">
  64. <div className="setting-color">
  65. <label>
  66. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-a"} value="theme-a" onChange={this.handleThemeRadio} />
  67. <span className="icon-check"></span>
  68. <span className="split">
  69. <span className="color bg-info"></span>
  70. <span className="color bg-info-light"></span>
  71. </span>
  72. <span className="color bg-white"></span>
  73. </label>
  74. </div>
  75. </div>
  76. <div className="col-3 mb-3">
  77. <div className="setting-color">
  78. <label>
  79. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-b"} value="theme-b" onChange={this.handleThemeRadio} />
  80. <span className="icon-check"></span>
  81. <span className="split">
  82. <span className="color bg-green"></span>
  83. <span className="color bg-green-light"></span>
  84. </span>
  85. <span className="color bg-white"></span>
  86. </label>
  87. </div>
  88. </div>
  89. <div className="col-3 mb-3">
  90. <div className="setting-color">
  91. <label>
  92. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-c"} value="theme-c" onChange={this.handleThemeRadio} />
  93. <span className="icon-check"></span>
  94. <span className="split">
  95. <span className="color bg-purple"></span>
  96. <span className="color bg-purple-light"></span>
  97. </span>
  98. <span className="color bg-white"></span>
  99. </label>
  100. </div>
  101. </div>
  102. <div className="col-3 mb-3">
  103. <div className="setting-color">
  104. <label>
  105. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-d"} value="theme-d" onChange={this.handleThemeRadio} />
  106. <span className="icon-check"></span>
  107. <span className="split">
  108. <span className="color bg-danger"></span>
  109. <span className="color bg-danger-light"></span>
  110. </span>
  111. <span className="color bg-white"></span>
  112. </label>
  113. </div>
  114. </div>
  115. <div className="col-3 mb-3">
  116. <div className="setting-color">
  117. <label>
  118. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-e"} value="theme-e" onChange={this.handleThemeRadio} />
  119. <span className="icon-check"></span>
  120. <span className="split">
  121. <span className="color bg-info-dark"></span>
  122. <span className="color bg-info"></span>
  123. </span>
  124. <span className="color bg-gray-dark"></span>
  125. </label>
  126. </div>
  127. </div>
  128. <div className="col-3 mb-3">
  129. <div className="setting-color">
  130. <label>
  131. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-f"} value="theme-f" onChange={this.handleThemeRadio} />
  132. <span className="icon-check"></span>
  133. <span className="split">
  134. <span className="color bg-green-dark"></span>
  135. <span className="color bg-green"></span>
  136. </span>
  137. <span className="color bg-gray-dark"></span>
  138. </label>
  139. </div>
  140. </div>
  141. <div className="col-3 mb-3">
  142. <div className="setting-color">
  143. <label>
  144. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-g"} value="theme-g" onChange={this.handleThemeRadio} />
  145. <span className="icon-check"></span>
  146. <span className="split">
  147. <span className="color bg-purple-dark"></span>
  148. <span className="color bg-purple"></span>
  149. </span>
  150. <span className="color bg-gray-dark"></span>
  151. </label>
  152. </div>
  153. </div>
  154. <div className="col-3 mb-3">
  155. <div className="setting-color">
  156. <label>
  157. <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-h"} value="theme-h" onChange={this.handleThemeRadio} />
  158. <span className="icon-check"></span>
  159. <span className="split">
  160. <span className="color bg-danger-dark"></span>
  161. <span className="color bg-danger"></span>
  162. </span>
  163. <span className="color bg-gray-dark"></span>
  164. </label>
  165. </div>
  166. </div>
  167. </div>
  168. </div>
  169. {/* <div className="p-2">
  170. <h4 className="text-muted text-thin">Layout</h4>
  171. <div className="clearfix">
  172. <p className="float-left">Fixed</p>
  173. <div className="float-right">
  174. <label className="switch">
  175. <input id="chk-fixed" type="checkbox" name="isFixed" checked={this.props.settings.isFixed} onChange={this.handleSettingCheckbox} />
  176. <span></span>
  177. </label>
  178. </div>
  179. </div>
  180. <div className="clearfix">
  181. <p className="float-left">Boxed</p>
  182. <div className="float-right">
  183. <label className="switch">
  184. <input id="chk-boxed" type="checkbox" name="isBoxed" checked={this.props.settings.isBoxed} onChange={this.handleSettingCheckbox} />
  185. <span></span>
  186. </label>
  187. </div>
  188. </div>
  189. </div>
  190. <div className="p-2">
  191. <h4 className="text-muted text-thin">Aside</h4>
  192. <div className="clearfix">
  193. <p className="float-left">Collapsed</p>
  194. <div className="float-right">
  195. <label className="switch">
  196. <input id="chk-collapsed" type="checkbox" name="isCollapsed" checked={this.props.settings.isCollapsed} onChange={this.handleSettingCheckbox} />
  197. <span></span>
  198. </label>
  199. </div>
  200. </div>
  201. <div className="clearfix">
  202. <p className="float-left">Collapsed Text</p>
  203. <div className="float-right">
  204. <label className="switch">
  205. <input id="chk-collapsed-text" type="checkbox" name="isCollapsedText" checked={this.props.settings.isCollapsedText} onChange={this.handleSettingCheckbox} />
  206. <span></span>
  207. </label>
  208. </div>
  209. </div>
  210. <div className="clearfix">
  211. <p className="float-left">Float</p>
  212. <div className="float-right">
  213. <label className="switch">
  214. <input id="chk-float" type="checkbox" name="isFloat" checked={this.props.settings.isFloat} onChange={this.handleSettingCheckbox} />
  215. <span></span>
  216. </label>
  217. </div>
  218. </div>
  219. <div className="clearfix">
  220. <p className="float-left">Hover</p>
  221. <div className="float-right">
  222. <label className="switch">
  223. <input id="chk-hover" type="checkbox" name="asideHover" checked={this.props.settings.asideHover} onChange={this.handleSettingCheckbox} />
  224. <span></span>
  225. </label>
  226. </div>
  227. </div>
  228. <div className="clearfix">
  229. <p className="float-left">Show Scrollbar</p>
  230. <div className="float-right">
  231. <label className="switch">
  232. <input id="chk-scrollbar" type="checkbox" name="asideScrollbar" checked={this.props.settings.asideScrollbar} onChange={this.handleSettingCheckbox} />
  233. <span></span>
  234. </label>
  235. </div>
  236. </div>
  237. </div> */}
  238. </TabPane>
  239. <TabPane tabId="chat">
  240. <h3 className="text-center text-thin mt-4">Connections</h3>
  241. <div className="list-group">
  242. {/* START list title */}
  243. <div className="list-group-item border-0">
  244. <small className="text-muted">ONLINE</small>
  245. </div>
  246. {/* END list title */}
  247. <div className="list-group-item list-group-item-action border-0">
  248. <div className="media">
  249. <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/05.jpg" alt="User avatar" />
  250. <div className="media-body text-truncate">
  251. <a href="">
  252. <strong>Juan Sims</strong>
  253. </a>
  254. <br />
  255. <small className="text-muted">Designeer</small>
  256. </div>
  257. <div className="ml-auto">
  258. <span className="circle bg-success circle-lg"></span>
  259. </div>
  260. </div>
  261. </div>
  262. <div className="list-group-item list-group-item-action border-0">
  263. <div className="media">
  264. <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/06.jpg" alt="User avatar" />
  265. <div className="media-body text-truncate">
  266. <a href="">
  267. <strong>Maureen Jenkins</strong>
  268. </a>
  269. <br />
  270. <small className="text-muted">Designeer</small>
  271. </div>
  272. <div className="ml-auto">
  273. <span className="circle bg-success circle-lg"></span>
  274. </div>
  275. </div>
  276. </div>
  277. <div className="list-group-item list-group-item-action border-0">
  278. <div className="media">
  279. <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/07.jpg" alt="User avatar" />
  280. <div className="media-body text-truncate">
  281. <a href="">
  282. <strong>Billie Dunn</strong>
  283. </a>
  284. <br />
  285. <small className="text-muted">Designeer</small>
  286. </div>
  287. <div className="ml-auto">
  288. <span className="circle bg-danger circle-lg"></span>
  289. </div>
  290. </div>
  291. </div>
  292. <div className="list-group-item list-group-item-action border-0">
  293. <div className="media">
  294. <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/08.jpg" alt="User avatar" />
  295. <div className="media-body text-truncate">
  296. <a href="">
  297. <strong>Tomothy Roberts</strong>
  298. </a>
  299. <br />
  300. <small className="text-muted">Designeer</small>
  301. </div>
  302. <div className="ml-auto">
  303. <span className="circle bg-warning circle-lg"></span>
  304. </div>
  305. </div>
  306. </div>
  307. {/* START list title */}
  308. <div className="list-group-item border-0">
  309. <small className="text-muted">OFFLINE</small>
  310. </div>
  311. {/* END list title */}
  312. <div className="list-group-item list-group-item-action border-0">
  313. <div className="media">
  314. <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/09.jpg" alt="User avatar" />
  315. <div className="media-body text-truncate">
  316. <a href="">
  317. <strong>Lawrence Robinson</strong>
  318. </a>
  319. <br />
  320. <small className="text-muted">Designeer</small>
  321. </div>
  322. <div className="ml-auto">
  323. <span className="circle bg-warning circle-lg"></span>
  324. </div>
  325. </div>
  326. </div>
  327. <div className="list-group-item list-group-item-action border-0">
  328. <div className="media">
  329. <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/10.jpg" alt="User avatar" />
  330. <div className="media-body text-truncate">
  331. <a href="">
  332. <strong>Tyrone Owens</strong>
  333. </a>
  334. <br />
  335. <small className="text-muted">Designeer</small>
  336. </div>
  337. <div className="ml-auto">
  338. <span className="circle bg-warning circle-lg"></span>
  339. </div>
  340. </div>
  341. </div>
  342. </div>
  343. <div className="px-3 py-4 text-center">
  344. {/* Optional link to list more users */}
  345. <a className="btn btn-purple btn-sm" href="" title="See more contacts">
  346. <strong>Load more..</strong>
  347. </a>
  348. </div>
  349. {/* Extra items */}
  350. <div className="px-3 py-2">
  351. <p>
  352. <small className="text-muted">Tasks completion</small>
  353. </p>
  354. <div className="progress progress-xs m-0">
  355. <div className="progress-bar bg-success" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style={{ width: "80%" }}>
  356. <span className="sr-only">80% Complete</span>
  357. </div>
  358. </div>
  359. </div>
  360. <div className="px-3 py-2">
  361. <p>
  362. <small className="text-muted">Upload quota</small>
  363. </p>
  364. <div className="progress progress-xs m-0">
  365. <div className="progress-bar bg-warning" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style={{ width: "40%" }}>
  366. <span className="sr-only">40% Complete</span>
  367. </div>
  368. </div>
  369. </div>
  370. </TabPane>
  371. </TabContent>
  372. </div>
  373. </nav>
  374. {/* END Off Sidebar (right) */}
  375. </aside>
  376. )
  377. );
  378. }
  379. }
  380. Offsidebar.propTypes = {
  381. actions: PropTypes.object,
  382. settings: PropTypes.object,
  383. theme: PropTypes.object,
  384. };
  385. const mapStateToProps = (state) => ({ settings: state.settings, theme: state.theme });
  386. const mapDispatchToProps = (dispatch) => ({ actions: bindActionCreators(actions, dispatch) });
  387. export default connect(mapStateToProps, mapDispatchToProps)(Offsidebar);