/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import './docView.scss'; import React, { useEffect, useState } from 'react'; import { EuiButton, EuiButtonEmpty, EuiButtonIcon, EuiCallOut, EuiFieldNumber, EuiFlexGroup, EuiFlexItem, EuiFlyoutBody, EuiFlyoutHeader, EuiFormRow, EuiSpacer, EuiText, EuiTitle, EuiToolTip, } from '@elastic/eui'; import { FlyoutContainers } from '../../../common/flyout_containers'; import { IDocType } from './docViewRow'; import { IExplorerFields, IField } from '../../../../../common/types/explorer'; import { getHeaders, fetchSurroundingData, rangeNumDocs, populateDataGrid } from '../../utils'; import { DEFAULT_COLUMNS } from '../../../../../common/constants/explorer'; import { HttpSetup } from '../../../../../../../src/core/public'; import PPLService from '../../../../services/requests/ppl'; interface Props { http: HttpSetup; detailsOpen: boolean; setDetailsOpen: React.Dispatch>; doc: IDocType; timeStampField: string; memorizedTds: JSX.Element[]; explorerFields: IExplorerFields; openTraces: boolean; setOpenTraces: React.Dispatch>; setSurroundingEventsOpen: React.Dispatch>; pplService: PPLService; rawQuery: string; selectedCols: IField[]; getTds: (doc: IDocType, selectedCols: IField[], isFlyout: boolean) => JSX.Element[]; toggleSize: boolean; setToggleSize: React.Dispatch>; } export const SurroundingFlyout = ({ http, detailsOpen, setDetailsOpen, doc, timeStampField, memorizedTds, explorerFields, openTraces, setOpenTraces, setSurroundingEventsOpen, pplService, rawQuery, selectedCols, getTds, toggleSize, setToggleSize, }: Props) => { const [numNewEvents, setNumNewEvents] = useState(5); const [valueOldEvents, setNumOldEvents] = useState(5); const [loadingNewEvents, setLoadingNewEvents] = useState(false); const [loadingOldEvents, setLoadingOldEvents] = useState(false); const [oldEventsError, setOldEventsError] = useState(''); const [newEventsError, setNewEventsError] = useState(''); const [newEventsData, setNewEventsData] = useState([[]]); const [oldEventsData, setOldEventsData] = useState([[]]); const closeFlyout = () => { setDetailsOpen(false); setOpenTraces(false); setSurroundingEventsOpen(false); }; const openDetailsFlyout = () => { setDetailsOpen(true); setOpenTraces(false); setSurroundingEventsOpen(false); }; const loadData = async (typeOfDocs: 'new' | 'old', value: number) => { const numDocs = rangeNumDocs(value); let resultCount = 0; if (typeOfDocs === 'new') { resultCount = await fetchSurroundingData( pplService, rawQuery, timeStampField, doc[timeStampField], numDocs, 'new', setNewEventsData, setNewEventsError, setLoadingNewEvents, selectedCols, getTds ); setNumNewEvents(resultCount); } else { resultCount = await fetchSurroundingData( pplService, rawQuery, timeStampField, doc[timeStampField], numDocs, 'old', setOldEventsData, setOldEventsError, setLoadingOldEvents, selectedCols, getTds ); setNumOldEvents(resultCount); } }; const loadButton = (typeOfDocs: 'new' | 'old') => { if (typeOfDocs === 'new') { loadData(typeOfDocs, numNewEvents + 5); } else { loadData(typeOfDocs, valueOldEvents + 5); } }; const handleKeyDown = ( event: React.KeyboardEvent, typeOfDocs: 'new' | 'old' ) => { if (event.key === 'Enter') { loadData(typeOfDocs, typeOfDocs === 'new' ? numNewEvents : valueOldEvents); } }; const onChangeNewEvents = (e: React.ChangeEvent) => { setNumNewEvents(parseInt(e.target.value, 10)); }; const onChangeOldEvents = (e: React.ChangeEvent) => { setNumOldEvents(parseInt(e.target.value, 10)); }; const flyoutHeader = (

View surrounding events

{ setToggleSize((isOn) => !isOn); }} /> View event details
); const getInputForm = ( iconType: string, onChange: React.ChangeEventHandler, value: number, typeOfDocs: 'new' | 'old' ) => { return ( loadButton(typeOfDocs)} iconType={iconType} > Load onChange(e)} aria-label={typeOfDocs === 'new' ? 'fetch newer events' : 'fetch older events'} min={0} max={10000} onKeyDown={(e) => handleKeyDown(e, typeOfDocs)} /> {typeOfDocs === 'new' ? 'newer' : 'older'} events ); }; const flyoutBody = (
{getInputForm('arrowUp', onChangeNewEvents, numNewEvents, 'new')}
{newEventsError !== '' && ( )}
{populateDataGrid( explorerFields, getHeaders(explorerFields.queriedFields, DEFAULT_COLUMNS.slice(1), true), <> {newEventsData} {memorizedTds} {oldEventsData} , getHeaders(explorerFields.selectedFields, DEFAULT_COLUMNS.slice(1), true), <> {newEventsData} {memorizedTds} {oldEventsData} )}
{oldEventsError !== '' && ( )}
{getInputForm('arrowDown', onChangeOldEvents, valueOldEvents, 'old')}
); const flyoutFooter = <>; useEffect(() => { loadData('new', 5); loadData('old', 5); }, []); return ( ); };