fleet/frontend/components/queries/QueryComposer/QueryComposer.jsx
Mike Stone f099b2ae22 Create packs (#516)
* Creates new PackComposerPage at /packs/new

* Creates PackForm component

* Adds PackForm to PackComposerPage

* Creates QueriesListItem

* Creates QueriesList

* Creates QueriesListWrapper

* Get all queries when the Packs Composer Page loads

* Form HOC handles updates to formData prop

* Creates form to configure scheduled queries

* QueriesListWrapper renders ConfigurePackQueryForm

* search queries input filters queries list

* Empty state text

* create pack when user submits the new pack form

* Adds Edit pack page to /packs/:pack_id/edit

* API client - get scheduled queries for a pack

* API client - create scheduled query

* Redux config for scheduled queries

* Remove scheduled queries from packs

* Add labels to pack on create

* Add disabled state to the select targets dropdown

* Adds edit route and pushes to new route on edit click

* Adds cancel button to edit pack form

* Adds Checkbox that selects all scheduled queries in table
2016-12-21 12:25:54 -05:00

146 lines
3.5 KiB
JavaScript

import React, { Component, PropTypes } from 'react';
import AceEditor from 'react-ace';
import 'brace/mode/sql';
import 'brace/ext/linking';
import QueryForm from 'components/forms/queries/QueryForm';
import queryInterface from 'interfaces/query';
import SelectTargetsDropdown from 'components/forms/fields/SelectTargetsDropdown';
import targetInterface from 'interfaces/target';
import './mode';
import './theme';
const baseClass = 'query-composer';
class QueryComposer extends Component {
static propTypes = {
onFetchTargets: PropTypes.func,
onFormCancel: PropTypes.func,
onOsqueryTableSelect: PropTypes.func,
onRunQuery: PropTypes.func,
onSave: PropTypes.func,
onStopQuery: PropTypes.func,
onTargetSelect: PropTypes.func,
onTextEditorInputChange: PropTypes.func,
onUpdate: PropTypes.func,
query: queryInterface,
queryIsRunning: PropTypes.bool,
queryType: PropTypes.string,
selectedTargets: PropTypes.arrayOf(targetInterface),
targetsCount: PropTypes.number,
queryText: PropTypes.string,
};
static defaultProps = {
queryType: 'query',
targetsCount: 0,
};
onLoad = (editor) => {
editor.setOptions({
enableLinking: true,
});
editor.on('linkClick', (data) => {
const { type, value } = data.token;
const { onOsqueryTableSelect } = this.props;
if (type === 'osquery-token') {
return onOsqueryTableSelect(value);
}
return false;
});
}
renderForm = () => {
const {
onFormCancel,
onRunQuery,
onSave,
onStopQuery,
onUpdate,
query,
queryIsRunning,
queryText,
queryType,
} = this.props;
return (
<QueryForm
onCancel={onFormCancel}
onRunQuery={onRunQuery}
onSave={onSave}
onStopQuery={onStopQuery}
onUpdate={onUpdate}
query={query}
queryIsRunning={queryIsRunning}
queryType={queryType}
queryText={queryText}
/>
);
}
renderTargetsInput = () => {
const {
onFetchTargets,
onTargetSelect,
queryType,
selectedTargets,
targetsCount,
} = this.props;
if (queryType === 'label') {
return false;
}
return (
<div>
<SelectTargetsDropdown
onFetchTargets={onFetchTargets}
onSelect={onTargetSelect}
selectedTargets={selectedTargets}
targetsCount={targetsCount}
label="Select Targets"
/>
</div>
);
}
render () {
const { onTextEditorInputChange, queryIsRunning, queryText, queryType } = this.props;
const { onLoad, renderForm, renderTargetsInput } = this;
return (
<div className={`${baseClass}__wrapper body-wrap`}>
<h1>{queryType === 'label' ? 'New Label Query' : 'New Query'}</h1>
<div className={`${baseClass}__text-editor-wrapper`}>
<AceEditor
enableBasicAutocompletion
enableLiveAutocompletion
editorProps={{ $blockScrolling: Infinity }}
mode="kolide"
minLines={2}
maxLines={20}
name="query-editor"
onLoad={onLoad}
onChange={onTextEditorInputChange}
readOnly={queryIsRunning}
setOptions={{ enableLinking: true }}
showGutter
showPrintMargin={false}
theme="kolide"
value={queryText}
width="100%"
fontSize={14}
/>
</div>
{renderTargetsInput()}
{renderForm()}
</div>
);
}
}
export default QueryComposer;