sqlpad
Version:
Web app for writing and running SQL queries and visualizing the results. Supports Postgres, MySQL, SQL Server, Crate and Vertica.
130 lines (123 loc) • 4.26 kB
JavaScript
import React from 'react'
import Alert from 'react-s-alert'
import Col from 'react-bootstrap/lib/Col'
import Form from 'react-bootstrap/lib/Form'
import AutoAffix from 'react-overlays/lib/AutoAffix'
import debounce from 'lodash.debounce'
import CheckListItem from './CheckListItem'
import ConfigEnvDocumentation from './ConfigEnvDocumentation'
import ConfigItemInput from './ConfigItemInput'
import fetchJson from '../utilities/fetch-json.js'
class ConfigurationView extends React.Component {
state = {
configItems: []
}
loadConfigValuesFromServer = () => {
fetchJson('GET', '/api/config-items').then(json => {
if (json.error) Alert.error(json.error)
this.setState({ configItems: json.configItems })
})
}
saveConfigValue = (key, value) => {
fetchJson('POST', '/api/config-values/' + key, {
value: value
}).then(json => {
if (json.error) {
Alert.error('Save failed')
} else {
Alert.success('Value saved')
this.loadConfigValuesFromServer()
}
})
}
componentDidMount() {
document.title = 'SQLPad - Configuration'
this.loadConfigValuesFromServer()
this.saveConfigValue = debounce(this.saveConfigValue, 500)
}
render() {
var configItemInputNodes = this.state.configItems
.filter(config => config.interface === 'ui')
.map(config => {
return (
<ConfigItemInput
key={config.key}
config={config}
saveConfigValue={this.saveConfigValue}
/>
)
})
return (
<div>
<Col sm={6} smOffset={1}>
<div className="configBox">
<h1 style={{ textAlign: 'center' }}>Configuration</h1>
<hr />
<Form horizontal>{configItemInputNodes}</Form>
<hr />
<p>
Some configuration is only accessible via environment variables or
command-line-interface (CLI) flags. Below are the current values
for these variables. Sensitive values are masked. Hover over input
for additional information.
</p>
<hr />
<ConfigEnvDocumentation configItems={this.state.configItems} />
</div>
</Col>
<Col sm={3} smOffset={1} style={{ paddingTop: 90 }}>
<AutoAffix viewportOffsetTop={95}>
<div className="panel panel-default">
<div className="panel-body">
<p>
<strong>Feature Checklist</strong>
</p>
<p>Unlock features by providing the required configuration.</p>
<hr />
<strong>Email</strong>
<ul style={{ paddingLeft: 20 }}>
<CheckListItem
configKey={'smtpUser'}
configItems={this.state.configItems}
/>
<CheckListItem
configKey={'smtpHost'}
configItems={this.state.configItems}
/>
<CheckListItem
configKey={'smtpPort'}
configItems={this.state.configItems}
/>
<CheckListItem
configKey={'smtpFrom'}
configItems={this.state.configItems}
/>
<CheckListItem
configKey={'publicUrl'}
configItems={this.state.configItems}
/>
</ul>
<strong>Google OAuth</strong>
<ul style={{ paddingLeft: 20 }}>
<CheckListItem
configKey={'googleClientId'}
configItems={this.state.configItems}
/>
<CheckListItem
configKey={'googleClientSecret'}
configItems={this.state.configItems}
/>
<CheckListItem
configKey={'publicUrl'}
configItems={this.state.configItems}
/>
</ul>
</div>
</div>
</AutoAffix>
</Col>
</div>
)
}
}
export default ConfigurationView