|
|
@@ -0,0 +1,398 @@
|
|
|
+import React, { Component } from "react";
|
|
|
+import PropTypes from "prop-types";
|
|
|
+
|
|
|
+import { connect } from "react-redux";
|
|
|
+import { bindActionCreators } from "redux";
|
|
|
+import * as actions from "../../store/actions/actions";
|
|
|
+
|
|
|
+import { TabContent, TabPane, Nav, NavItem, NavLink } from "reactstrap";
|
|
|
+
|
|
|
+class Offsidebar extends Component {
|
|
|
+ state = {
|
|
|
+ activeTab: "settings",
|
|
|
+ offsidebarReady: false,
|
|
|
+ };
|
|
|
+
|
|
|
+ componentDidMount() {
|
|
|
+ // When mounted display the offsidebar
|
|
|
+ window.requestAnimationFrame(() => this.setState({ offsidebarReady: true }));
|
|
|
+ }
|
|
|
+
|
|
|
+ toggle = (tab) => {
|
|
|
+ if (this.state.activeTab !== tab) {
|
|
|
+ this.setState({
|
|
|
+ activeTab: tab,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ handleSettingCheckbox = (event) => {
|
|
|
+ this.props.actions.changeSetting(event.target.name, event.target.checked);
|
|
|
+ };
|
|
|
+
|
|
|
+ handleThemeRadio = (event) => {
|
|
|
+ this.props.actions.changeTheme(event.target.value);
|
|
|
+ };
|
|
|
+
|
|
|
+ render() {
|
|
|
+ return (
|
|
|
+ this.state.offsidebarReady && (
|
|
|
+ <aside className="offsidebar">
|
|
|
+ {/* START Off Sidebar (right) */}
|
|
|
+ <nav>
|
|
|
+ <div>
|
|
|
+ {/* Nav tabs */}
|
|
|
+ <Nav tabs justified>
|
|
|
+ <NavItem>
|
|
|
+ <NavLink
|
|
|
+ className={this.state.activeTab === "settings" ? "active" : ""}
|
|
|
+ onClick={() => {
|
|
|
+ this.toggle("settings");
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <em className="icon-equalizer fa-lg"></em>
|
|
|
+ </NavLink>
|
|
|
+ </NavItem>
|
|
|
+ {/* <NavItem>
|
|
|
+ <NavLink className={ this.state.activeTab === 'chat' ? 'active':'' }
|
|
|
+ onClick={() => { this.toggle('chat'); }}
|
|
|
+ >
|
|
|
+ <em className="icon-user fa-lg"></em>
|
|
|
+ </NavLink>
|
|
|
+ </NavItem> */}
|
|
|
+ </Nav>
|
|
|
+ {/* Tab panes */}
|
|
|
+ <TabContent activeTab={this.state.activeTab}>
|
|
|
+ <TabPane tabId="settings">
|
|
|
+ <h3 className="text-center text-thin mt-4">Settings</h3>
|
|
|
+ <div className="p-2">
|
|
|
+ <h4 className="text-muted text-thin">Themes</h4>
|
|
|
+ <div className="row row-flush mb-2">
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-a"} value="theme-a" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-info"></span>
|
|
|
+ <span className="color bg-info-light"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-white"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-b"} value="theme-b" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-green"></span>
|
|
|
+ <span className="color bg-green-light"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-white"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-c"} value="theme-c" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-purple"></span>
|
|
|
+ <span className="color bg-purple-light"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-white"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-d"} value="theme-d" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-danger"></span>
|
|
|
+ <span className="color bg-danger-light"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-white"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-e"} value="theme-e" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-info-dark"></span>
|
|
|
+ <span className="color bg-info"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-gray-dark"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-f"} value="theme-f" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-green-dark"></span>
|
|
|
+ <span className="color bg-green"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-gray-dark"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-g"} value="theme-g" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-purple-dark"></span>
|
|
|
+ <span className="color bg-purple"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-gray-dark"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="col-3 mb-3">
|
|
|
+ <div className="setting-color">
|
|
|
+ <label>
|
|
|
+ <input type="radio" name="setting-theme" checked={this.props.theme.name === "theme-h"} value="theme-h" onChange={this.handleThemeRadio} />
|
|
|
+ <span className="icon-check"></span>
|
|
|
+ <span className="split">
|
|
|
+ <span className="color bg-danger-dark"></span>
|
|
|
+ <span className="color bg-danger"></span>
|
|
|
+ </span>
|
|
|
+ <span className="color bg-gray-dark"></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {/* <div className="p-2">
|
|
|
+ <h4 className="text-muted text-thin">Layout</h4>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Fixed</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-fixed" type="checkbox" name="isFixed" checked={this.props.settings.isFixed} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Boxed</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-boxed" type="checkbox" name="isBoxed" checked={this.props.settings.isBoxed} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="p-2">
|
|
|
+ <h4 className="text-muted text-thin">Aside</h4>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Collapsed</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-collapsed" type="checkbox" name="isCollapsed" checked={this.props.settings.isCollapsed} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Collapsed Text</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-collapsed-text" type="checkbox" name="isCollapsedText" checked={this.props.settings.isCollapsedText} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Float</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-float" type="checkbox" name="isFloat" checked={this.props.settings.isFloat} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Hover</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-hover" type="checkbox" name="asideHover" checked={this.props.settings.asideHover} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="clearfix">
|
|
|
+ <p className="float-left">Show Scrollbar</p>
|
|
|
+ <div className="float-right">
|
|
|
+ <label className="switch">
|
|
|
+ <input id="chk-scrollbar" type="checkbox" name="asideScrollbar" checked={this.props.settings.asideScrollbar} onChange={this.handleSettingCheckbox} />
|
|
|
+ <span></span>
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div> */}
|
|
|
+ </TabPane>
|
|
|
+ <TabPane tabId="chat">
|
|
|
+ <h3 className="text-center text-thin mt-4">Connections</h3>
|
|
|
+ <div className="list-group">
|
|
|
+ {/* START list title */}
|
|
|
+ <div className="list-group-item border-0">
|
|
|
+ <small className="text-muted">ONLINE</small>
|
|
|
+ </div>
|
|
|
+ {/* END list title */}
|
|
|
+ <div className="list-group-item list-group-item-action border-0">
|
|
|
+ <div className="media">
|
|
|
+ <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/05.jpg" alt="User avatar" />
|
|
|
+ <div className="media-body text-truncate">
|
|
|
+ <a href="">
|
|
|
+ <strong>Juan Sims</strong>
|
|
|
+ </a>
|
|
|
+ <br />
|
|
|
+ <small className="text-muted">Designeer</small>
|
|
|
+ </div>
|
|
|
+ <div className="ml-auto">
|
|
|
+ <span className="circle bg-success circle-lg"></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="list-group-item list-group-item-action border-0">
|
|
|
+ <div className="media">
|
|
|
+ <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/06.jpg" alt="User avatar" />
|
|
|
+ <div className="media-body text-truncate">
|
|
|
+ <a href="">
|
|
|
+ <strong>Maureen Jenkins</strong>
|
|
|
+ </a>
|
|
|
+ <br />
|
|
|
+ <small className="text-muted">Designeer</small>
|
|
|
+ </div>
|
|
|
+ <div className="ml-auto">
|
|
|
+ <span className="circle bg-success circle-lg"></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="list-group-item list-group-item-action border-0">
|
|
|
+ <div className="media">
|
|
|
+ <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/07.jpg" alt="User avatar" />
|
|
|
+ <div className="media-body text-truncate">
|
|
|
+ <a href="">
|
|
|
+ <strong>Billie Dunn</strong>
|
|
|
+ </a>
|
|
|
+ <br />
|
|
|
+ <small className="text-muted">Designeer</small>
|
|
|
+ </div>
|
|
|
+ <div className="ml-auto">
|
|
|
+ <span className="circle bg-danger circle-lg"></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="list-group-item list-group-item-action border-0">
|
|
|
+ <div className="media">
|
|
|
+ <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/08.jpg" alt="User avatar" />
|
|
|
+ <div className="media-body text-truncate">
|
|
|
+ <a href="">
|
|
|
+ <strong>Tomothy Roberts</strong>
|
|
|
+ </a>
|
|
|
+ <br />
|
|
|
+ <small className="text-muted">Designeer</small>
|
|
|
+ </div>
|
|
|
+ <div className="ml-auto">
|
|
|
+ <span className="circle bg-warning circle-lg"></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {/* START list title */}
|
|
|
+ <div className="list-group-item border-0">
|
|
|
+ <small className="text-muted">OFFLINE</small>
|
|
|
+ </div>
|
|
|
+ {/* END list title */}
|
|
|
+ <div className="list-group-item list-group-item-action border-0">
|
|
|
+ <div className="media">
|
|
|
+ <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/09.jpg" alt="User avatar" />
|
|
|
+ <div className="media-body text-truncate">
|
|
|
+ <a href="">
|
|
|
+ <strong>Lawrence Robinson</strong>
|
|
|
+ </a>
|
|
|
+ <br />
|
|
|
+ <small className="text-muted">Designeer</small>
|
|
|
+ </div>
|
|
|
+ <div className="ml-auto">
|
|
|
+ <span className="circle bg-warning circle-lg"></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="list-group-item list-group-item-action border-0">
|
|
|
+ <div className="media">
|
|
|
+ <img className="align-self-center mr-3 rounded-circle thumb48" src="/static/img/user/10.jpg" alt="User avatar" />
|
|
|
+ <div className="media-body text-truncate">
|
|
|
+ <a href="">
|
|
|
+ <strong>Tyrone Owens</strong>
|
|
|
+ </a>
|
|
|
+ <br />
|
|
|
+ <small className="text-muted">Designeer</small>
|
|
|
+ </div>
|
|
|
+ <div className="ml-auto">
|
|
|
+ <span className="circle bg-warning circle-lg"></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="px-3 py-4 text-center">
|
|
|
+ {/* Optional link to list more users */}
|
|
|
+ <a className="btn btn-purple btn-sm" href="" title="See more contacts">
|
|
|
+ <strong>Load more..</strong>
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ {/* Extra items */}
|
|
|
+ <div className="px-3 py-2">
|
|
|
+ <p>
|
|
|
+ <small className="text-muted">Tasks completion</small>
|
|
|
+ </p>
|
|
|
+ <div className="progress progress-xs m-0">
|
|
|
+ <div className="progress-bar bg-success" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style={{ width: "80%" }}>
|
|
|
+ <span className="sr-only">80% Complete</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="px-3 py-2">
|
|
|
+ <p>
|
|
|
+ <small className="text-muted">Upload quota</small>
|
|
|
+ </p>
|
|
|
+ <div className="progress progress-xs m-0">
|
|
|
+ <div className="progress-bar bg-warning" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style={{ width: "40%" }}>
|
|
|
+ <span className="sr-only">40% Complete</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </TabPane>
|
|
|
+ </TabContent>
|
|
|
+ </div>
|
|
|
+ </nav>
|
|
|
+ {/* END Off Sidebar (right) */}
|
|
|
+ </aside>
|
|
|
+ )
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+Offsidebar.propTypes = {
|
|
|
+ actions: PropTypes.object,
|
|
|
+ settings: PropTypes.object,
|
|
|
+ theme: PropTypes.object,
|
|
|
+};
|
|
|
+
|
|
|
+const mapStateToProps = (state) => ({ settings: state.settings, theme: state.theme });
|
|
|
+const mapDispatchToProps = (dispatch) => ({ actions: bindActionCreators(actions, dispatch) });
|
|
|
+
|
|
|
+export default connect(mapStateToProps, mapDispatchToProps)(Offsidebar);
|