/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { useEffect, useMemo, useState } from 'react'; import { EuiCallOut, EuiIcon, EuiSpacer, EuiSwitch, EuiText, EuiTitle } from '@elastic/eui'; import _ from 'lodash'; import { FieldArray } from 'formik'; import { EmbeddableRenderer, ErrorEmbeddable } from '../../../../../../../src/plugins/embeddable/public'; import { getClient, getEmbeddable, getNotifications, getQueryService, getUISettings, NotificationService, } from '../../../../services'; import DefineMonitor from '../../../../pages/CreateMonitor/containers/DefineMonitor'; import { formikToMonitor } from '../../../../pages/CreateMonitor/containers/CreateMonitor/utils/formikToMonitor'; import { SEARCH_TYPE } from '../../../../utils/constants'; import MonitorDetails from '../../../../pages/CreateMonitor/containers/MonitorDetails'; import ConfigureTriggers from '../../../../pages/CreateTrigger/containers/ConfigureTriggers'; import { unitToLabel } from '../../../../pages/CreateMonitor/components/Schedule/Frequencies/Interval'; import EnhancedAccordion from '../../EnhancedAccordion'; import { getPlugins } from '../../../../pages/CreateMonitor/containers/CreateMonitor/utils/helpers'; import { dotNotate } from '../../../../utils/SubmitErrorHandler'; import './styles.scss'; import { fetchVisEmbeddable } from '../../../../../../../src/plugins/vis_augmenter/public'; import { VisualizeEmbeddable } from '../../../../../../../src/plugins/visualizations/public'; function CreateNew({ embeddable, flyoutMode, formikProps, history, setFlyout, detectorId, isAssociateAllowed, showErrors }) { const isDarkMode = getUISettings().get('theme:darkMode') || false; const notifications = getNotifications(); const httpClient = getClient(); const { values, errors, touched, isSubmitting, isValid } = formikProps; const [plugins, setPlugins] = useState([]); const [generatedEmbeddable, setGeneratedEmbeddable] = useState< VisualizeEmbeddable | ErrorEmbeddable >(); const isAd = values.searchType === SEARCH_TYPE.AD; const [accordionsOpen, setAccordionsOpen] = useState(detectorId ? { monitorDetails: true } : {}); const [isShowVis, setIsShowVis] = useState(false); const title = embeddable?.vis.title; const notificationService = useMemo(() => new NotificationService(httpClient), []); const onAccordionToggle = (key) => { const newAccordionsOpen = { ...accordionsOpen }; newAccordionsOpen[key] = !accordionsOpen[key]; setAccordionsOpen(newAccordionsOpen); }; const { isShowingErrors, errorList } = useMemo(() => { const isShowingErrors = Object.keys(errors).length > 0 && !isSubmitting && !isValid; const errorList = new Set(); if (isShowingErrors) { const errorPaths = dotNotate(errors); Object.keys(errorPaths).forEach((path) => { errorList.add(errorPaths[path]); }); // Set accordion values if there are errors for top level const newAccordionsOpen = { ...accordionsOpen }; if (!newAccordionsOpen.advancedData) newAccordionsOpen.advancedData = 'aggregations' in errors || 'groupBy' in errors || 'where' in errors || 'bucketValue' in errors; if (!newAccordionsOpen.monitorDetails) newAccordionsOpen.monitorDetails = 'name' in errors || 'period' in errors; setAccordionsOpen(newAccordionsOpen); } return { isShowingErrors: errorList.size !== 0, errorList: [...errorList] }; }, [errors, isSubmitting, isValid]); // On load useEffect(() => { const updatePlugins = async () => { const newPlugins = await getPlugins(httpClient); setPlugins(newPlugins); }; const createEmbeddable = async () => { const visEmbeddable = await fetchVisEmbeddable(embeddable.vis.id, getEmbeddable(), getQueryService()); setGeneratedEmbeddable(visEmbeddable); }; updatePlugins(); createEmbeddable(); }, []); return (

{flyoutMode === 'create' && 'Create query level monitor, associated with the visualization. Learn more in the documentation.'} {flyoutMode === 'adMonitor' && 'Set up and configure alerting monitor for the anomaly detector to receive notifications on visualization when anomalies detected.'}{' '} Learn more

{isShowingErrors && showErrors && ( <>
    {errorList.map((text, index) => (
  • {text}
  • ))}
)}

{title}

setIsShowVis(!isShowVis)} />
{isAssociateAllowed && ( <>

Monitor details

onAccordionToggle('monitorDetails'), title: values.name, subTitle: values.frequency === 'interval' && ( <>

Runs every {values.period.interval} {unitToLabel[values.period.unit]}

), }} >
{!isAd && ( onAccordionToggle('advancedData'), title: 'Advanced data source configuration', }} > )}

Triggers

{(triggerArrayHelpers) => ( )} )}
); } export default CreateNew;