diff --git a/resources/js/components/Settings/SettingsIndex.js b/resources/js/components/Settings/SettingsIndex.js index 802e2bc7..41439cca 100644 --- a/resources/js/components/Settings/SettingsIndex.js +++ b/resources/js/components/Settings/SettingsIndex.js @@ -1,20 +1,82 @@ +import Axios from 'axios'; import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import Navbar from '../Navbar'; +import SettingsTabs from './SettingsTabs'; export default class SettingsIndex extends Component { constructor(props) { super(props) this.state = { - + data: null, + loading: true, } } + getData = () => { + var url = 'api/settings/?token=' + window.token; + + Axios.get(url) + .then((resp) => { + this.setState({ + data: this.sortSettings(resp.data), + loading: false, + }); + }) + .catch((err) => { + // + }) + } + + sortSettings = (data) => { + return { + General: [ + { + obj: data.schedule, + type: 'text', + }, + { + obj: data.server, + type: 'text', + }, + { + obj: data.show_average, + type: 'checkbox', + }, + { + obj: data.show_max, + type: 'checkbox', + }, + { + obj: data.show_min, + type: 'checkbox', + } + ], + Graphs: {} + }; + } + + componentDidMount() { + this.getData(); + } + render() { + var data = this.state.data; + var loading = this.state.loading; + + if(loading) { + return ( +
Loading
+ ); + } + return (
+
+ +
); } diff --git a/resources/js/components/Settings/SettingsInput.js b/resources/js/components/Settings/SettingsInput.js new file mode 100644 index 00000000..ad9a04c8 --- /dev/null +++ b/resources/js/components/Settings/SettingsInput.js @@ -0,0 +1,92 @@ +import React, { Component } from 'react'; +import { Form } from 'react-bootstrap'; +import ReactDOM from 'react-dom'; + +export default class SettingsInput extends Component { + constructor(props) { + super(props) + + this.state = { + type: this.props.type, + name: this.props.name, + value: (this.props.value) ? this.props.value : '', + classes: this.props.classes, + id: this.props.id, + label: (this.props.label) ? this.props.label : false, + readonly: true, + description: (this.props.description) ? this.props.description : false, + } + } + + componentDidMount() { + this.setState({ + readonly: this.isReadOnly() + }); + } + + handleInput = (evt) => { + var val = evt.target.value; + + if(this.state.type === 'checkbox') { + val = e.target.checked; + } + + this.props.handleInput( + this.state.name.split(' ').join('_'), + val + ); + + this.setState({ + value: val + }); + } + + isReadOnly = () => { + if(window.config.editable[this.state.name] == false) { + return true; + } + + return false; + } + + generateInput = () => { + var disabled = (this.state.readonly) ? true : false; + + return + } + + render() { + var input = this.generateInput(); + var id = this.state.id; + var readonly = this.state.readonly; + var label = this.state.label; + var description = this.state.description; + + return ( + + {label && + + } + + {input} + + {description && +

+ } + + {readonly && + This setting is defined as an env variable and is not editable. + } +
+ ); + } +} + +if (document.getElementById('SettingsInput')) { + ReactDOM.render(, document.getElementById('SettingsInput')); +} diff --git a/resources/js/components/Settings/SettingsTabs.js b/resources/js/components/Settings/SettingsTabs.js new file mode 100644 index 00000000..3d88d0bd --- /dev/null +++ b/resources/js/components/Settings/SettingsTabs.js @@ -0,0 +1,76 @@ +import React, { Component } from 'react'; +import { Nav, Tab, Tabs } from 'react-bootstrap'; +import ReactDOM from 'react-dom'; +import GeneralSettings from './tabs/GeneralSettings'; +import GraphsSettings from './tabs/GraphsSettings'; + +export default class SettingsTabs extends Component { + constructor(props) { + super(props) + + this.state = { + tab: "General", + data: this.props.data + } + } + + generateTabs = () => { + var tabs = [ + 'General', + 'Graphs', + 'Notifications', + 'healthchecks.io', + 'Reset', + ]; + + return tabs.map((tab) => { + return + }); + } + + switchTab = (tab) => { + this.setState({ + tab: tab + }); + } + + getTabContent = () => { + var data = this.state.data; + console.log(data); + + switch(this.state.tab) { + case 'General': + return + break; + case 'Graphs': + return + break; + } + } + + render() { + var tabs = this.generateTabs(); + var activeTab = this.state.tab; + var tabContent = this.getTabContent(); + + return ( +
+ { this.switchTab(tab) }} + activeKey={activeTab} + > + {tabs} + + +
+ {tabContent} +
+
+ ); + } +} + +if (document.getElementById('settingsTabs')) { + ReactDOM.render(, document.getElementById('settingsTabs')); +} diff --git a/resources/js/components/Settings/tabs/GeneralSettings.js b/resources/js/components/Settings/tabs/GeneralSettings.js new file mode 100644 index 00000000..4b399c42 --- /dev/null +++ b/resources/js/components/Settings/tabs/GeneralSettings.js @@ -0,0 +1,55 @@ +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import { Modal, Button, Tab } from 'react-bootstrap'; +import Axios from 'axios'; +import { toast } from 'react-toastify'; +import SettingsInput from '../SettingsInput'; + +export default class GeneralSettings extends Component { + constructor(props) { + super(props) + + this.state = { + data: this.props.data + } + } + + inputHandler = () => { + var settings = this.state.data; + var i = 0; + settings.forEach(ele => { + if(ele.obj.name == name) { + ele.obj.value = val; + } + settings[i] = ele; + i++; + }); + this.setState({ + data: settings + }); + } + + render() { + var settings = this.state.data[0]; + + return ( + + General + + + ); + } +} + +if (document.getElementById('GeneralSettings')) { + ReactDOM.render(, document.getElementById('GeneralSettings')); +}