import React, { useState, useEffect } from "react"; import { omit } from "lodash"; import Modal from "components/Modal"; import Button from "components/buttons/Button"; import InfoBanner from "components/InfoBanner/InfoBanner"; import CustomLink from "components/CustomLink/CustomLink"; import Checkbox from "components/forms/fields/Checkbox/Checkbox"; import QueryFrequencyIndicator from "components/QueryFrequencyIndicator/QueryFrequencyIndicator"; import LogDestinationIndicator from "components/LogDestinationIndicator/LogDestinationIndicator"; import { ISchedulableQuery } from "interfaces/schedulable_query"; interface IManageQueryAutomationsModalProps { isUpdatingAutomations: boolean; handleSubmit: (formData: any) => void; // TODO onCancel: () => void; togglePreviewDataModal: () => void; availableQueries?: ISchedulableQuery[]; automatedQueryIds: number[]; logDestination: string; } interface ICheckedQuery { name?: string; id: number; isChecked: boolean; interval: number; } const useCheckboxListStateManagement = ( allQueries: ISchedulableQuery[], automatedQueryIds: number[] | undefined ) => { const [queryItems, setQueryItems] = useState(() => { return allQueries.map(({ name, id, interval }) => ({ name, id, isChecked: !!automatedQueryIds?.includes(id), interval, })); }); const updateQueryItems = (queryId: number) => { setQueryItems((prevItems) => prevItems.map((query) => query.id !== queryId ? query : { ...query, isChecked: !query.isChecked } ) ); }; return { queryItems, updateQueryItems }; }; const baseClass = "manage-query-automations-modal"; const ManageQueryAutomationsModal = ({ isUpdatingAutomations, automatedQueryIds, handleSubmit, onCancel, togglePreviewDataModal, availableQueries, logDestination, }: IManageQueryAutomationsModalProps): JSX.Element => { // TODO: Error handling, if any const [errors, setErrors] = useState<{ [key: string]: string }>({}); // Client side sort queries alphabetically const sortedAvailableQueries = availableQueries?.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()) ) || []; const { queryItems, updateQueryItems } = useCheckboxListStateManagement( sortedAvailableQueries, automatedQueryIds || [] ); const onSubmit = (evt: React.MouseEvent | KeyboardEvent) => { evt.preventDefault(); const newQueryIds: number[] = []; queryItems?.forEach((p) => p.isChecked && newQueryIds.push(p.id)); handleSubmit(newQueryIds); }; useEffect(() => { const listener = (event: KeyboardEvent) => { if (event.code === "Enter" || event.code === "NumpadEnter") { event.preventDefault(); onSubmit(event); } }; document.addEventListener("keydown", listener); return () => { document.removeEventListener("keydown", listener); }; }); return (
Query automations let you send data to your log destination on a schedule. Data is sent according to a query’s frequency.
{availableQueries?.length ? (

Choose which queries will send data:

{queryItems && queryItems.map((queryItem) => { const { isChecked, name, id, interval } = queryItem; return (
{ updateQueryItems(id); !isChecked && setErrors((errs) => omit(errs, "queryItems")); }} > {name}
); })}
) : (
You have no queries.

Add a query to turn on automations.

)}

Log destination:

Users with the admin role can 

Automations currently run on macOS, Windows, and Linux hosts.

Interested in query automations for your Chromebooks?  

); }; export default ManageQueryAutomationsModal;