import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { size } from 'lodash'; import DropdownButton from 'components/buttons/DropdownButton'; import Form from 'components/forms/Form'; import formFieldInterface from 'interfaces/form_field'; import helpers from 'components/forms/queries/QueryForm/helpers'; import InputField from 'components/forms/fields/InputField'; import KolideAce from 'components/KolideAce'; import queryInterface from 'interfaces/query'; import validateQuery from 'components/forms/validators/validate_query'; const baseClass = 'query-form'; const validate = (formData) => { const errors = {}; const { error: queryError, valid: queryValid, } = validateQuery(formData.query); if (!queryValid) { errors.query = queryError; } if (!formData.name) { errors.name = 'Title must be present'; } const valid = !size(errors); return { valid, errors }; }; class QueryForm extends Component { static propTypes = { baseError: PropTypes.string, fields: PropTypes.shape({ description: formFieldInterface.isRequired, name: formFieldInterface.isRequired, query: formFieldInterface.isRequired, }).isRequired, handleSubmit: PropTypes.func, formData: queryInterface, onOsqueryTableSelect: PropTypes.func, onUpdate: PropTypes.func, queryIsRunning: PropTypes.bool, title: PropTypes.string, }; static defaultProps = { targetsCount: 0, }; constructor (props) { super(props); this.state = { errors: {} }; } 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; }); } onUpdate = (evt) => { evt.preventDefault(); const { fields } = this.props; const { onUpdate: handleUpdate } = this.props; const formData = { description: fields.description.value, name: fields.name.value, query: fields.query.value, }; const { valid, errors } = validate(formData); if (valid) { handleUpdate(formData); return false; } this.setState({ errors: { ...this.state.errors, ...errors, }, }); return false; } renderButtons = () => { const { canSaveAsNew, canSaveChanges } = helpers; const { fields, formData, handleSubmit } = this.props; const { onUpdate } = this; const dropdownBtnOptions = [ { disabled: !canSaveChanges(fields, formData), label: 'Save Changes', onClick: onUpdate, }, { disabled: !canSaveAsNew(fields, formData), label: 'Save As New...', onClick: handleSubmit, }, ]; return (
Save
); } render () { const { baseError, fields, handleSubmit, queryIsRunning, title } = this.props; const { errors } = this.state; const { onLoad, renderButtons } = this; return (

{title}

{baseError &&
{baseError}
} {renderButtons()} ); } } export default Form(QueryForm, { fields: ['description', 'name', 'platform', 'query'], validate, });