diff --git a/frontend/components/forms/fields/InputField/InputField.jsx b/frontend/components/forms/fields/InputField/InputField.jsx index c47ac5ffd9..9de03c18d4 100644 --- a/frontend/components/forms/fields/InputField/InputField.jsx +++ b/frontend/components/forms/fields/InputField/InputField.jsx @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; import classnames from 'classnames'; -import { pick } from 'lodash'; +import { noop, pick } from 'lodash'; import FormField from 'components/forms/FormField'; @@ -18,6 +18,7 @@ class InputField extends Component { labelClassName: PropTypes.string, name: PropTypes.string, onChange: PropTypes.func, + onFocus: PropTypes.func, placeholder: PropTypes.string, type: PropTypes.string, value: PropTypes.string.isRequired, @@ -29,6 +30,7 @@ class InputField extends Component { inputOptions: {}, label: null, labelClassName: '', + onFocus: noop, type: 'text', value: '', }; @@ -54,7 +56,17 @@ class InputField extends Component { } render () { - const { error, inputClassName, inputOptions, inputWrapperClass, name, placeholder, type, value } = this.props; + const { + error, + inputClassName, + inputOptions, + inputWrapperClass, + name, + onFocus, + placeholder, + type, + value, + } = this.props; const { onInputChange } = this; const shouldShowPasswordClass = type === 'password'; const inputClasses = classnames(baseClass, inputClassName, { @@ -87,6 +99,7 @@ class InputField extends Component { { this.input = r; }} diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/SelectTargetsDropdown.jsx b/frontend/components/forms/fields/SelectTargetsDropdown/SelectTargetsDropdown.jsx index 16c255b289..3edeff6a3b 100644 --- a/frontend/components/forms/fields/SelectTargetsDropdown/SelectTargetsDropdown.jsx +++ b/frontend/components/forms/fields/SelectTargetsDropdown/SelectTargetsDropdown.jsx @@ -4,7 +4,7 @@ import classnames from 'classnames'; import Kolide from 'kolide'; import targetInterface from 'interfaces/target'; -import { formatSelectedTargetsForApi } from './helpers'; +import { formatSelectedTargetsForApi } from 'kolide/helpers'; import Input from './SelectTargetsInput'; import Menu from './SelectTargetsMenu'; diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/helpers.js b/frontend/components/forms/fields/SelectTargetsDropdown/helpers.js deleted file mode 100644 index 20fb7d3155..0000000000 --- a/frontend/components/forms/fields/SelectTargetsDropdown/helpers.js +++ /dev/null @@ -1,17 +0,0 @@ -import { flatMap } from 'lodash'; - -const filterTarget = (targetType) => { - return (target) => { - return target.target_type === targetType ? [target.id] : []; - }; -}; - -export const formatSelectedTargetsForApi = (selectedTargets) => { - const targets = selectedTargets || []; - const hosts = flatMap(targets, filterTarget('hosts')); - const labels = flatMap(targets, filterTarget('labels')); - - return { hosts, labels }; -}; - -export default { formatSelectedTargetsForApi }; diff --git a/frontend/components/forms/fields/SelectTargetsDropdown/helpers.tests.js b/frontend/components/forms/fields/SelectTargetsDropdown/helpers.tests.js deleted file mode 100644 index ce43d35037..0000000000 --- a/frontend/components/forms/fields/SelectTargetsDropdown/helpers.tests.js +++ /dev/null @@ -1,23 +0,0 @@ -import expect from 'expect'; - -import helpers from './helpers'; - -const label1 = { id: 1, target_type: 'labels' }; -const label2 = { id: 2, target_type: 'labels' }; -const host1 = { id: 6, target_type: 'hosts' }; -const host2 = { id: 5, target_type: 'hosts' }; - -describe('SelectTargetsDropdown - helpers', () => { - describe('#formatSelectedTargetsForApi', () => { - const { formatSelectedTargetsForApi } = helpers; - - it('splits targets into labels and hosts', () => { - const targets = [host1, host2, label1, label2]; - - expect(formatSelectedTargetsForApi(targets)).toEqual({ - hosts: [6, 5], - labels: [1, 2], - }); - }); - }); -}); diff --git a/frontend/components/forms/queries/QueryForm/QueryForm.jsx b/frontend/components/forms/queries/QueryForm/QueryForm.jsx index 9989083362..4075c56a10 100644 --- a/frontend/components/forms/queries/QueryForm/QueryForm.jsx +++ b/frontend/components/forms/queries/QueryForm/QueryForm.jsx @@ -15,8 +15,10 @@ class QueryForm extends Component { onCancel: PropTypes.func, onRunQuery: PropTypes.func, onSave: PropTypes.func, + onStopQuery: PropTypes.func, onUpdate: PropTypes.func, query: queryInterface, + queryIsRunning: PropTypes.bool, queryText: PropTypes.string.isRequired, queryType: PropTypes.string, }; @@ -163,8 +165,35 @@ class QueryForm extends Component { renderButtons = () => { const { canSaveAsNew, canSaveChanges } = helpers; const { formData } = this.state; - const { onRunQuery, query, queryType } = this.props; + const { + onRunQuery, + onStopQuery, + query, + queryIsRunning, + queryType, + } = this.props; const { onCancel, onSave, onUpdate } = this; + let runQueryButton; + + if (queryIsRunning) { + runQueryButton = ( +