Reverts `Remove sidebars`
diff --git a/frontend/src/components/sidebar/containers/Sidebar.js b/frontend/src/components/sidebar/containers/Sidebar.js
new file mode 100644
index 0000000..c3547cb
--- /dev/null
+++ b/frontend/src/components/sidebar/containers/Sidebar.js
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { connect } from 'react-redux';
+import Sidebar from '../presentations/Sidebar';
+
+const mapStateToProps = (state) => ({
+  activeMenuName: state.navigator.activeMenu,
+  isActive: state.navigator.isActive,
+});
+
+/*
+const  mapDispatchToProps = (dispatch) => {
+    return {
+        onThemeChange: function(e) {
+            const selectedTheme = e.target.value
+            dispatch({type: 'CHANGE_THEME', theme : selectedTheme})
+        }
+    }
+}
+*/
+
+const mapDispatchToProps = {};
+
+export default connect(mapStateToProps, mapDispatchToProps)(Sidebar);
+
+/*
+import React, {Component} from 'react'
+import store from '../../../app/store'
+class SidebarContainer extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {navigator : store.getState().navigator}
+    }
+
+    componentDidMount() {
+        store.subscribe(function() {
+            this.setState({navigator : store.getState().navigator});
+        }.bind(this));
+    }
+
+    changeTheme = (e) => {
+        console.log(e);
+        const selectedTheme = e.target.value
+        store.dispatch({type: 'CHANGE_THEME', theme : selectedTheme})
+    }
+
+    render() {
+        const activeMenu  = this.state.navigator.activeMenu
+        return (
+            <Sidebar activeMenuName={activeMenu} onThemeChange={this.changeTheme} />
+        );
+    }
+
+}
+
+export default SidebarContainer
+*/
diff --git a/frontend/src/components/sidebar/containers/SidebarHome.js b/frontend/src/components/sidebar/containers/SidebarHome.js
new file mode 100644
index 0000000..860495b
--- /dev/null
+++ b/frontend/src/components/sidebar/containers/SidebarHome.js
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { connect } from 'react-redux';
+import SidebarHome from '../presentations/SidebarHome';
+import { setCommand } from '../../../features/editor/EditorSlice';
+import { addFrame, trimFrame } from '../../../features/frame/FrameSlice';
+import { getMetaData } from '../../../features/database/MetadataSlice';
+
+const mapStateToProps = (state) => ({
+  edges: state.metadata.edges,
+  nodes: state.metadata.nodes,
+  propertyKeys: state.metadata.propertyKeys,
+  dbname: state.metadata.dbname,
+  graph: state.metadata.graph,
+  role: state.metadata.role,
+  command: state.editor.command,
+});
+
+const mapDispatchToProps = {
+  setCommand, addFrame, trimFrame, getMetaData,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(SidebarHome);
diff --git a/frontend/src/components/sidebar/containers/SidebarSetting.js b/frontend/src/components/sidebar/containers/SidebarSetting.js
new file mode 100644
index 0000000..4dd0009
--- /dev/null
+++ b/frontend/src/components/sidebar/containers/SidebarSetting.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { connect } from 'react-redux';
+import {
+  changeMaxDataOfGraph,
+  changeMaxDataOfTable,
+  changeMaxNumOfFrames,
+  changeMaxNumOfHistories,
+  changeTheme,
+  resetSetting,
+} from '../../../features/setting/SettingSlice';
+import SidebarSetting from '../presentations/SidebarSetting';
+
+const mapStateToProps = (state) => ({
+  theme: state.setting.theme,
+  maxNumOfFrames: state.setting.maxNumOfFrames,
+  maxNumOfHistories: state.setting.maxNumOfHistories,
+  maxDataOfGraph: state.setting.maxDataOfGraph,
+  maxDataOfTable: state.setting.maxDataOfTable,
+});
+
+const mapDispatchToProps = {
+  changeTheme,
+  changeMaxNumOfFrames,
+  changeMaxNumOfHistories,
+  changeMaxDataOfGraph,
+  changeMaxDataOfTable,
+  resetSetting,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(SidebarSetting);
diff --git a/frontend/src/components/sidebar/presentations/Sidebar.jsx b/frontend/src/components/sidebar/presentations/Sidebar.jsx
new file mode 100644
index 0000000..ccb6d02
--- /dev/null
+++ b/frontend/src/components/sidebar/presentations/Sidebar.jsx
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import SidebarHome from '../containers/SidebarHome';
+import SidebarSetting from '../containers/SidebarSetting';
+
+const Sidebar = ({ activeMenuName, isActive }) => (
+  <div id="sidebar" className={isActive ? ' active ' : 'inactive'}>
+    <div className="tab-content">
+      <div className={`tab-pane fade${activeMenuName === 'home' ? ' active show ' : ''}`} role="tabpanel" aria-labelledby="side-home-tab">
+        <SidebarHome />
+      </div>
+      <div className={`tab-pane fade${activeMenuName === 'setting' ? ' active show ' : ''}`} role="tabpanel" aria-labelledby="side-setting-tab">
+        <SidebarSetting />
+      </div>
+    </div>
+  </div>
+);
+
+Sidebar.propTypes = {
+  activeMenuName: PropTypes.string.isRequired,
+  isActive: PropTypes.bool.isRequired,
+};
+
+export default Sidebar;
diff --git a/frontend/src/components/sidebar/presentations/SidebarComponents.jsx b/frontend/src/components/sidebar/presentations/SidebarComponents.jsx
new file mode 100644
index 0000000..fcc34a0
--- /dev/null
+++ b/frontend/src/components/sidebar/presentations/SidebarComponents.jsx
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+
+const StyleTextRight = {
+  marginBottom: '10px', textAlign: 'right', fontSize: '13px', fontWeight: 'bold',
+};
+const StyleTextLeft = { fontSize: '13px', fontWeight: 'bold' };
+
+export const ColoredLine = () => (
+  <hr
+    style={{
+      color: '#B0B0B0',
+      backgroundColor: '#B0B0B0',
+      marginTop: 0,
+      height: 0.3,
+    }}
+  />
+);
+
+export const VerticalLine = () => (
+  <div
+    style={{
+      backgroundColor: '#C4C4C4',
+      width: '1px',
+      height: '120px',
+      marginTop: '37px',
+      marginBottom: '37px',
+    }}
+  />
+);
+
+const SubLabelRight = ({ label, classes }) => (
+  <div className={classes} style={StyleTextRight}>{label}</div>
+);
+SubLabelRight.propTypes = {
+  classes: PropTypes.string.isRequired,
+  label: PropTypes.string.isRequired,
+};
+
+const SubLabelLeft = ({ label, classes }) => (
+  <div className={classes} style={StyleTextLeft}>{label}</div>
+);
+SubLabelLeft.propTypes = {
+  classes: PropTypes.string.isRequired,
+  label: PropTypes.oneOfType([
+    PropTypes.string,
+    PropTypes.element,
+  ]).isRequired,
+};
+
+const SubLabelLeftWithLink = ({ label, classes }) => (
+  <div className={classes} style={StyleTextLeft}><pre>{label}</pre></div>
+);
+SubLabelLeftWithLink.propTypes = {
+  classes: PropTypes.string.isRequired,
+  label: PropTypes.string.isRequired,
+};
+
+export { SubLabelRight, SubLabelLeft, SubLabelLeftWithLink };
diff --git a/frontend/src/components/sidebar/presentations/SidebarHome.jsx b/frontend/src/components/sidebar/presentations/SidebarHome.jsx
new file mode 100644
index 0000000..6521585
--- /dev/null
+++ b/frontend/src/components/sidebar/presentations/SidebarHome.jsx
@@ -0,0 +1,427 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+
+import { Modal } from 'antd';
+import uuid from 'react-uuid';
+import { connect, useDispatch } from 'react-redux';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faRedo, faTimes } from '@fortawesome/free-solid-svg-icons';
+import { VerticalLine, SubLabelLeft, SubLabelRight } from './SidebarComponents';
+
+const genLabelQuery = (eleType, labelName, database) => {
+  function age() {
+    if (eleType === 'node') {
+      if (labelName === '*') {
+        return `SELECT * from cypher('${database.graph}', $$
+          MATCH (V)
+          RETURN V
+$$) as (V agtype);`;
+      }
+      return `SELECT * from cypher('${database.graph}', $$
+          MATCH (V:${labelName})
+          RETURN V
+$$) as (V agtype);`;
+    }
+    if (eleType === 'edge') {
+      if (labelName === '*') {
+        return `SELECT * from cypher('${database.graph}', $$
+          MATCH (V)-[R]-(V2)
+          RETURN V,R,V2
+$$) as (V agtype, R agtype, V2 agtype);`;
+      }
+      return `SELECT * from cypher('${database.graph}', $$
+          MATCH (V)-[R:${labelName}]-(V2)
+          RETURN V,R,V2
+$$) as (V agtype, R agtype, V2 agtype);`;
+    }
+    return '';
+  }
+  function agens() {
+    if (eleType === 'node') {
+      if (labelName === '*') {
+        return 'MATCH (V) RETURN V';
+      }
+      return `MATCH (V) WHERE LABEL(V) = '${labelName}' RETURN V`;
+    }
+    if (eleType === 'edge') {
+      if (labelName === '*') {
+        return 'MATCH (V)-[R]->(V2) RETURN *';
+      }
+      return `MATCH (V)-[R]->(V2) WHERE LABEL(R) = '${labelName}' RETURN *`;
+    }
+    return '';
+  }
+  if (database.flavor === 'AGE') {
+    return age();
+  }
+  if (database.flavor === 'AGENS') {
+    return agens();
+  }
+  return '';
+};
+
+const genPropQuery = (eleType, propertyName) => {
+  if (eleType === 'v') {
+    return `MATCH (V) WHERE V.${propertyName} IS NOT NULL RETURN V`;
+  }
+  if (eleType === 'e') {
+    return `MATCH (V)-[R]->(V2) WHERE R.${propertyName} IS NOT NULL RETURN *`;
+  }
+  return '';
+};
+
+const NodeList = ({ nodes, setCommand }) => {
+  let list;
+  if (nodes) {
+    list = nodes.map((item) => (
+      <NodeItems
+        key={uuid()}
+        label={item.label}
+        cnt={item.cnt}
+        setCommand={setCommand}
+      />
+    ));
+    return (
+      <div style={{
+        display: 'flex',
+        flexWrap: 'wrap',
+        height: '80px',
+        overflowY: 'auto',
+        marginTop: '12px',
+      }}
+      >
+        {list}
+      </div>
+    );
+  }
+
+  return null;
+};
+NodeList.propTypes = {
+  nodes: PropTypes.arrayOf(PropTypes.shape({
+    label: PropTypes.string,
+    cnt: PropTypes.number,
+  })).isRequired,
+  setCommand: PropTypes.func.isRequired,
+};
+
+const NodeItems = connect((state) => ({
+  database: state.database,
+}), {})(
+  ({
+    label, cnt, setCommand, database,
+  }) => (
+    <button
+      type="button"
+      className="node-item"
+      onClick={() => setCommand(genLabelQuery('node', label, database))}
+    >
+      {label}
+      (
+      {cnt}
+      )
+    </button>
+  ),
+);
+NodeItems.propTypes = {
+  database: PropTypes.shape({
+    flavor: PropTypes.string,
+  }).isRequired,
+  label: PropTypes.string.isRequired,
+  cnt: PropTypes.number.isRequired,
+  setCommand: PropTypes.func.isRequired,
+};
+
+const EdgeList = ({ edges, setCommand }) => {
+  let list;
+  if (edges) {
+    list = edges.map((item) => (
+      <EdgeItems
+        key={uuid()}
+        label={item.label}
+        cnt={item.cnt}
+        setCommand={setCommand}
+      />
+    ));
+    return (
+      <div style={{
+        display: 'flex',
+        flexWrap: 'wrap',
+        height: '80px',
+        overflowY: 'auto',
+        marginTop: '12px',
+      }}
+      >
+        {list}
+      </div>
+    );
+  }
+
+  return null;
+};
+EdgeList.propTypes = {
+  edges: PropTypes.arrayOf(PropTypes.shape({
+    label: PropTypes.string,
+    cnt: PropTypes.number,
+  })).isRequired,
+  setCommand: PropTypes.func.isRequired,
+};
+
+const EdgeItems = connect((state) => ({
+  database: state.database,
+}), {})(({
+  label, cnt, setCommand, database,
+}) => (
+  <button
+    type="button"
+    className="edge-item"
+    onClick={() => setCommand(genLabelQuery('edge', label, database))}
+  >
+    {label}
+    (
+    {cnt}
+    )
+  </button>
+));
+EdgeItems.propTypes = {
+  database: PropTypes.shape({
+    flavor: PropTypes.string,
+  }).isRequired,
+  label: PropTypes.string.isRequired,
+  cnt: PropTypes.number.isRequired,
+  setCommand: PropTypes.func.isRequired,
+};
+
+const PropertyList = ({ propertyKeys, setCommand }) => {
+  let list;
+  if (propertyKeys) {
+    list = propertyKeys.map((item) => (
+      <PropertyItems
+        key={uuid()}
+        propertyName={item.key}
+        keyType={item.key_type}
+        setCommand={setCommand}
+      />
+    ));
+    return (
+      <div style={{
+        display: 'flex',
+        flexWrap: 'wrap',
+        height: '80px',
+        overflowY: 'auto',
+        marginTop: '12px',
+      }}
+      >
+        {list}
+      </div>
+    );
+  }
+
+  return null;
+};
+PropertyList.propTypes = {
+  propertyKeys: PropTypes.arrayOf(PropTypes.shape({
+    key: PropTypes.string,
+    key_type: PropTypes.string,
+  })).isRequired,
+  setCommand: PropTypes.func.isRequired,
+};
+
+const PropertyItems = ({ propertyName, keyType, setCommand }) => (
+  <button
+    type="button"
+    className={`${keyType === 'v' ? 'propertie-item' : 'propertie-item'} propertie-item`}
+    onClick={() => setCommand(genPropQuery(keyType, propertyName))}
+  >
+    {propertyName}
+  </button>
+);
+PropertyItems.propTypes = {
+  propertyName: PropTypes.string.isRequired,
+  keyType: PropTypes.string.isRequired,
+  setCommand: PropTypes.func.isRequired,
+};
+
+const ConnectedText = ({ userName, roleName }) => (
+  <div>
+    <h6>
+      <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+        <SubLabelRight label="Username :" classes="col-sm-6" />
+        <SubLabelLeft label={userName} classes="col-sm-6" />
+      </div>
+      <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+        <SubLabelRight label="Roles :" classes="col-sm-6" />
+        <SubLabelLeft label={roleName} classes="col-sm-6" />
+      </div>
+    </h6>
+  </div>
+);
+
+ConnectedText.propTypes = {
+  userName: PropTypes.string.isRequired,
+  roleName: PropTypes.string.isRequired,
+};
+
+const DBMSText = ({ dbname, graph }) => (
+  <div>
+    <h6>
+      <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+        <SubLabelRight label="Databases :" classes="col-sm-6" />
+        <SubLabelLeft label={dbname} classes="col-sm-6" />
+      </div>
+      <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+        <SubLabelRight label="Graph Path :" classes="col-sm-6" />
+        <SubLabelLeft label={graph} classes="col-sm-6" />
+      </div>
+      <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+        <SubLabelRight label="Information :" classes="col-sm-6" />
+        <SubLabelLeft label="-" classes="col-sm-6" />
+      </div>
+      <div style={{ display: 'flex', flexWrap: 'wrap' }}>
+        <SubLabelRight label="Query List :" classes="col-sm-6" />
+        <SubLabelLeft label="-" classes="col-sm-6" />
+      </div>
+    </h6>
+  </div>
+);
+
+DBMSText.propTypes = {
+  dbname: PropTypes.string.isRequired,
+  graph: PropTypes.string.isRequired,
+};
+
+const SidebarHome = ({
+  edges,
+  nodes,
+  propertyKeys,
+  setCommand,
+  command,
+  trimFrame,
+  addFrame,
+  getMetaData,
+}) => {
+  const dispatch = useDispatch();
+  const { confirm } = Modal;
+
+  const requestDisconnect = () => {
+    const refKey = uuid();
+    dispatch(() => trimFrame('ServerDisconnect'));
+    dispatch(() => addFrame(command, 'ServerDisconnect', refKey));
+  };
+
+  const refreshSidebarHome = () => {
+    getMetaData();
+  };
+
+  return (
+    <div className="sidebar-home">
+      <div className="sidebar sidebar-body">
+        <div className="form-group sidebar-item">
+          <b>Node Label</b>
+          <br />
+          <NodeList nodes={nodes} setCommand={setCommand} />
+        </div>
+        <VerticalLine />
+        <div className="form-group sidebar-item">
+          <b>Edge Label</b>
+          <br />
+          <EdgeList edges={edges} setCommand={setCommand} />
+        </div>
+        <VerticalLine />
+        <div className="form-group sidebar-item">
+          <b>Properties</b>
+          <br />
+          <PropertyList propertyKeys={propertyKeys} setCommand={setCommand} />
+        </div>
+        <VerticalLine />
+        <div className="form-group sidebar-item-disconnect">
+          <button
+            className="frame-head-button refresh_button btn btn-link"
+            type="button"
+            onClick={() => refreshSidebarHome()}
+          >
+            <FontAwesomeIcon
+              icon={faRedo}
+              size="1x"
+              color="white"
+              flip="horizontal"
+            />
+          </button>
+          <br />
+          <b>Refresh</b>
+          <div style={{
+            border: '1px solid #C4C4C4',
+            opacity: '1',
+            width: '80%',
+            height: '0',
+            margin: '3px auto',
+          }}
+          />
+          <button
+            className="frame-head-button close_session btn btn-link"
+            type="button"
+            color="#142B80"
+            onClick={() => confirm({
+              title: 'Are you sure you want to close this window?',
+              onOk() {
+                requestDisconnect();
+              },
+              onCancel() {
+                return false;
+              },
+            })}
+          >
+            <FontAwesomeIcon
+              icon={faTimes}
+              size="1x"
+              color="white"
+            />
+          </button>
+          <br />
+          <b>Close Session</b>
+        </div>
+      </div>
+    </div>
+  );
+};
+
+SidebarHome.propTypes = {
+  edges: PropTypes.arrayOf(PropTypes.shape({
+    label: PropTypes.string,
+    cnt: PropTypes.number,
+  })).isRequired,
+  nodes: PropTypes.arrayOf(PropTypes.shape({
+    label: PropTypes.string,
+    cnt: PropTypes.number,
+  })).isRequired,
+  propertyKeys: PropTypes.arrayOf(PropTypes.shape({
+    key: PropTypes.string,
+    key_type: PropTypes.string,
+  })).isRequired,
+  setCommand: PropTypes.func.isRequired,
+  command: PropTypes.string.isRequired,
+  trimFrame: PropTypes.func.isRequired,
+  addFrame: PropTypes.func.isRequired,
+  getMetaData: PropTypes.func.isRequired,
+};
+
+export default SidebarHome;
diff --git a/frontend/src/components/sidebar/presentations/SidebarSetting.jsx b/frontend/src/components/sidebar/presentations/SidebarSetting.jsx
new file mode 100644
index 0000000..382b39f
--- /dev/null
+++ b/frontend/src/components/sidebar/presentations/SidebarSetting.jsx
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import { ColoredLine, SubLabelLeft } from './SidebarComponents';
+import { saveToCookie } from '../../../features/cookie/CookieUtil';
+
+const SidebarSetting = ({
+  theme,
+  maxNumOfFrames,
+  maxNumOfHistories,
+  maxDataOfGraph,
+  maxDataOfTable,
+  changeTheme,
+  changeMaxNumOfFrames,
+  changeMaxNumOfHistories,
+  changeMaxDataOfGraph,
+  changeMaxDataOfTable,
+  resetSetting,
+}) => (
+  <div className="sidebar-setting">
+    <div className="sidebar sidebar-header">
+      <h4>Configuration</h4>
+    </div>
+    <div className="sidebar sidebar-body">
+      <div className="form-group">
+        <b>Themes</b>
+        <ColoredLine />
+        <select
+          className="form-control theme-switcher"
+          value={theme}
+          onChange={(e) => [saveToCookie('theme', e.target.value), changeTheme(e)]}
+        >
+          <option value="default">Default</option>
+          <option value="dark">Dark</option>
+        </select>
+      </div>
+      <div className="form-group pt-4">
+        <b>Frames</b>
+        <ColoredLine />
+        <fieldset className="form-group">
+          <SubLabelLeft label="Maximum Number of Frames:" classes="py-1" />
+          <input
+            type="number"
+            className="form-control"
+            id="maxFrames"
+            name="maxFrames"
+            min="0"
+            value={maxNumOfFrames}
+            onChange={(e) => [saveToCookie('maxNumOfFrames', e.target.value), changeMaxNumOfFrames(parseInt(e.target.value, 10))]}
+          />
+        </fieldset>
+        <fieldset className="form-group">
+          <SubLabelLeft label="Max Number of Histories:" classes="py-1" />
+          <input
+            type="number"
+            className="form-control"
+            id="maxHistories"
+            name="maxHistories"
+            value={maxNumOfHistories}
+            min="0"
+            onChange={(e) => [saveToCookie('maxNumOfHistories', e.target.value), changeMaxNumOfHistories(parseInt(e.target.value, 10))]}
+          />
+        </fieldset>
+      </div>
+      <div className="form-group pt-4">
+        <b>Data Display</b>
+        <ColoredLine />
+        <fieldset className="form-group">
+          <SubLabelLeft label="Maximum Data of Graph Visualization" classes="py-1" />
+          <input
+            type="number"
+            className="form-control"
+            id="maxGraphData"
+            name="maxGraphData"
+            value={maxDataOfGraph.toString()}
+            min="0"
+            onChange={(e) => [saveToCookie('maxDataOfGraph', e.target.value), changeMaxDataOfGraph(parseInt(e.target.value, 10))]}
+          />
+        </fieldset>
+        <fieldset className="form-group">
+          <SubLabelLeft label="Maximum Data of Table Display" classes="py-1" />
+          <input
+            type="number"
+            className="form-control"
+            id="maxTableData"
+            name="maxTableData"
+            value={maxDataOfTable}
+            min="0"
+            onChange={(e) => [saveToCookie('maxDataOfTable', e.target.value), changeMaxDataOfTable(parseInt(e.target.value, 10))]}
+          />
+        </fieldset>
+      </div>
+      <div className="form-group pt-4">
+        <fieldset className="form-group">
+          <button
+            type="button"
+            className="btn btn-info btn-sm btn-block"
+            onClick={() => [
+              resetSetting(),
+            ]}
+          >
+            Reset Configuration
+          </button>
+        </fieldset>
+      </div>
+    </div>
+  </div>
+);
+
+SidebarSetting.propTypes = {
+  theme: PropTypes.string.isRequired,
+  maxNumOfFrames: PropTypes.number.isRequired,
+  maxNumOfHistories: PropTypes.number.isRequired,
+  maxDataOfGraph: PropTypes.number.isRequired,
+  maxDataOfTable: PropTypes.number.isRequired,
+  changeTheme: PropTypes.func.isRequired,
+  changeMaxNumOfFrames: PropTypes.func.isRequired,
+  changeMaxNumOfHistories: PropTypes.func.isRequired,
+  changeMaxDataOfGraph: PropTypes.func.isRequired,
+  changeMaxDataOfTable: PropTypes.func.isRequired,
+  resetSetting: PropTypes.func.isRequired,
+};
+
+export default SidebarSetting;