fleet/frontend/pages/queries/QueryPage/components/NewQueryModal/NewQueryModal.tsx
Martavis Parker bcfac603f0
Added components to Storybook library (#2768)
* added storybook

* added avatar component

* added button story

* added dropdown button story

* removed unused ellipsis component

* cleaned up modal path

* reorganized enroll secrets table file

* added flash story; removed unused persistent flash

* added fleet ace story

* added checkbox story

* added dropdown story

* added input story

* fixed storybook build

* fixed avatar

* added input with icon story

* added radio button story

* added select targets dropdown story

* added slider story

* added tooltip story

* added info banner story

* removed unused loaders; added spinner story

* added modal story

* removed unused NumberPill

* added pagination story

* lint fixes

* added documentation to run

* modified documentation

* fixed corelayout test

* fixed format for date-fns

* fixed date format that breaks tests

* wait for page
2021-11-06 23:41:09 -07:00

126 lines
3.4 KiB
TypeScript

import React, { useState } from "react";
import { size } from "lodash";
import { IQueryFormData } from "interfaces/query";
import { useDeepEffect } from "utilities/hooks";
import Checkbox from "components/forms/fields/Checkbox"; // @ts-ignore
import InputField from "components/forms/fields/InputField";
import Button from "components/buttons/Button";
import Modal from "components/Modal";
export interface INewQueryModalProps {
baseClass: string;
queryValue: string;
onCreateQuery: (formData: IQueryFormData) => void;
setIsSaveModalOpen: (isOpen: boolean) => void;
}
const validateQueryName = (name: string) => {
const errors: { [key: string]: any } = {};
if (!name) {
errors.name = "Query name must be present";
}
const valid = !size(errors);
return { valid, errors };
};
const NewQueryModal = ({
baseClass,
queryValue,
onCreateQuery,
setIsSaveModalOpen,
}: INewQueryModalProps) => {
const [name, setName] = useState<string>("");
const [description, setDescription] = useState<string>("");
const [observerCanRun, setObserverCanRun] = useState<boolean>(false);
const [errors, setErrors] = useState<{ [key: string]: any }>({});
useDeepEffect(() => {
if (name) {
setErrors({});
}
}, [name]);
const handleUpdate = (evt: React.MouseEvent<HTMLButtonElement>) => {
evt.preventDefault();
const { valid, errors: newErrors } = validateQueryName(name);
setErrors({
...errors,
...newErrors,
});
if (valid) {
onCreateQuery({
description,
name,
query: queryValue,
observer_can_run: observerCanRun,
});
setIsSaveModalOpen(false);
}
};
return (
<Modal title={"Save query"} onExit={() => setIsSaveModalOpen(false)}>
<form className={`${baseClass}__save-modal-form`} autoComplete="off">
<InputField
name="name"
onChange={(value: string) => setName(value)}
value={name}
error={errors.name}
inputClassName={`${baseClass}__query-save-modal-name`}
label="Name"
placeholder="What is your query called?"
/>
<InputField
name="description"
onChange={(value: string) => setDescription(value)}
value={description}
inputClassName={`${baseClass}__query-save-modal-description`}
label="Description"
type="textarea"
placeholder="What information does your query reveal?"
/>
<Checkbox
name="observerCanRun"
onChange={setObserverCanRun}
value={observerCanRun}
wrapperClassName={`${baseClass}__query-save-modal-observer-can-run-wrapper`}
>
Observers can run
</Checkbox>
<p>
Users with the Observer role will be able to run this query on hosts
where they have access.
</p>
<hr />
<div
className={`${baseClass}__button-wrap ${baseClass}__button-wrap--modal`}
>
<Button
className={`${baseClass}__btn`}
onClick={() => setIsSaveModalOpen(false)}
variant="text-link"
>
Cancel
</Button>
<Button
className={`${baseClass}__btn`}
type="button"
variant="brand"
onClick={handleUpdate}
>
Save query
</Button>
</div>
</form>
</Modal>
);
};
export default NewQueryModal;