mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 09:28:54 +00:00
* 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
146 lines
3.5 KiB
JavaScript
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;
|