resources/web/docs_js/components/console_widget.jsx (226 lines of code) (raw):
import * as utils from "../utils";
import {prop, pick, merge, omit} from "../../../../../node_modules/ramda";
import {h, Component} from "../../../../../node_modules/preact";
import linkState from "../../../../../node_modules/linkstate";
import {connect} from "../../../../../node_modules/preact-redux";
import {openModal} from "../actions/modal";
import {saveSettings} from "../actions/settings";
import AlternativePicker from "./alternative_picker";
const copyAsCurl = ({setting, consoleText, isKibana, addPretty}) => (_, getState) => {
const state = getState();
const langStrings = state.settings.langStrings;
const curlVals = {
curl_host: prop(setting + "_curl_host", state.settings),
curl_user: prop(setting + "_curl_user", state.settings),
curl_password: prop(setting + "_curl_password", state.settings)
};
const curlText = utils.getCurlText(merge(curlVals, {consoleText, isKibana, addPretty}))
return utils.copyText(curlText, langStrings);
}
export class _ConsoleForm extends Component {
componentWillMount() {
const defaultVals = omit(['langStrings', 'saveSettings', 'url_label', 'setting'], this.props);
this.setState(defaultVals);
}
render(props, state) {
const getValueFromState = field => state[`${props.setting}_${field}`]
const getFieldName = field => `${props.setting}_${field}`
return (
<form>
<p><strong>Dev Tools Console settings</strong></p>
<label for="url">{props.langStrings(props.url_label)}</label>
<input
id="url"
type="text"
value={getValueFromState('url')}
onInput={linkState(this, getFieldName('url'))}
/>
<p>Learn more about the Dev Tools
<a href="https://www.elastic.co/guide/en/kibana/current/console-kibana.html">Console</a>.
</p>
<p><strong>curl settings (basic auth)</strong></p>
<label for="curl_host">Elasticsearch {props.langStrings('host')}</label>
<input
id="curl_host"
type="text"
value={getValueFromState('curl_host')}
onInput={linkState(this, getFieldName('curl_host'))}
/>
<label for="curl_username">Elasticsearch {props.langStrings('username')}</label>
<input
id="curl_username"
type="text"
value={getValueFromState('curl_user')}
onInput={linkState(this, getFieldName('curl_user'))}
/>
{/* TODO
<label for="curl_pw" title={props.langStrings("curl_pw_title")}>curl {props.langStrings('password')}</label>
<input id="curl_pw" title={props.langStrings("curl_pw_title")} type="text" value={getValueFromState("curl_password")} onInput={linkState(this, getFieldName("curl_password"))} />
*/}
<button
id="save_url"
type="button"
onClick={(e) => props.saveSettings(this.state)}
>
{props.langStrings('Save')}
</button>
<button
id="reset"
onClick={(e) =>
this.setState(
omit(
['langStrings', 'saveSettings', 'url_label', 'setting'],
props
)
)
}
type="button"
>
Reset
</button>
<p className="console_help_text">
{props.langStrings('For information on how to set up and run')}
{props.setting === 'sense_url' ? (
<span>
the Sense 2 {props.langStrings('editor')} check
<a href="https://www.elastic.co/guide/en/sense/current/installing.html">
Installing Sense
</a>
</span>
) : (
<span>
Kibana, refer to
<a href="https://www.elastic.co/guide/en/kibana/master/setup.html">
Set up
</a>
</span>
)}
{props.langStrings('.')}
</p>
</form>
)
}
}
export class _TryConsoleSelector extends Component {
componentWillMount() {
const defaultVals = omit(['langStrings', 'saveSettings', 'url_label', 'setting'], this.props);
this.setState(defaultVals);
}
render(props) {
const handleConfigureClick = (e) => {
e.preventDefault();
props.settingsModalAction();
}
return (
<div className="try_console_selector">
<h4>Try code examples in Elastic</h4>
<p>To run code examples in your Dev Tools Console, add your Console URL to
<a
id="try_console_selector_configure_example_widget_button"
href="#"
onClick={handleConfigureClick}
>
the settings
</a>
.
</p>
<p><em>New to Elastic?</em></p>
<div className="try_console_new_to_elastic_buttons">
<a
id="try_console_selector_try_cloud_button"
className="button btn-primary btn-small"
href="https://cloud.elastic.co/registration"
target="_blank"
>
Start free Cloud trial
</a>
<p>
<a
href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html"
target="_blank"
>
Install locally
</a>
</p>
</div>
</div>
)
}
}
export const ConsoleForm = connect((state, props) =>
pick(["langStrings",
`${props.setting}_url`,
`${props.setting}_curl_host`,
`${props.setting}_curl_user`,
`${props.setting}_curl_password`], state.settings)
, {saveSettings})(_ConsoleForm);
export const TryConsoleSelector = connect((state, props) =>
pick(["langStrings",
`${props.setting}_url`,
`${props.setting}_curl_host`,
`${props.setting}_curl_user`,
`${props.setting}_curl_password`], state.settings)
, {saveSettings})(_TryConsoleSelector);
// ConsoleWidget isn't quite the right name for this any more....
export const ConsoleWidget = props => {
const settingsModalAction = () => props.openModal(ConsoleForm, {setting: props.setting, url_label: props.url_label});
const openConsoleModal = () =>
props.openModal(TryConsoleSelector, { settingsModalAction })
const consoleModalAction = (e) => {
e.preventDefault();
const target = e.target;
utils.checkServerStatus(target.href)
.then((isUp) => {
if (isUp) {
window.open(target.href)
} else {
openConsoleModal();
}
})
.catch((_) => {
openConsoleModal();
});
};
return (
<div className="u-space-between">
<AlternativePicker langs={props.langs} />
<div className="u-space-between">
<a
className="sense_widget copy_as_curl"
onClick={(e) =>
props.copyAsCurl({
isKibana: props.isKibana,
consoleText: props.consoleText,
setting: props.setting,
addPretty: props.addPretty,
})
}
>
{props.langStrings('Copy as curl')}
</a>
{props.view_in_text && (
<a
className="view_in_link"
target="console"
onClick={(e) => consoleModalAction(e)}
title={props.langStrings(props.view_in_text)}
href={`${props[props.setting + "_url"]}?load_from=${props.baseUrl}${props.snippet}`}
>
{props.langStrings(props.view_in_text)}
</a>
)}
<a
className="console_settings"
onClick={settingsModalAction}
title={props.langStrings(props.configure_text)}
>
</a>
</div>
</div>
)
}
export default connect(
(state, props) => pick(["langStrings", "baseUrl", `${props.setting}_url`], state.settings),
{copyAsCurl, openModal, saveSettings}
)(ConsoleWidget);