/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import './index.scss'; import { EuiGlobalToastList, EuiPage, EuiPageBody, EuiResizableContainer, htmlIdGenerator, OnTimeChangeProps, ShortDate, } from '@elastic/eui'; import { DurationRange } from '@elastic/eui/src/components/date_picker/types'; import React, { ReactChild, useEffect, useState } from 'react'; import { HashRouter, Route, RouteComponentProps } from 'react-router-dom'; import { StaticContext } from 'react-router-dom'; import { useSelector } from 'react-redux'; import { ChromeBreadcrumb, Toast } from '../../../../../src/core/public'; import { onTimeChange } from './helpers/utils'; import { Sidebar } from './sidebar/sidebar'; import { EmptyMetricsView } from './view/empty_view'; import PPLService from '../../services/requests/ppl'; import { TopMenu } from './top_menu/top_menu'; import { MetricType } from '../../../common/types/metrics'; import { MetricsGrid } from './view/metrics_grid'; import { metricsLayoutSelector, selectedMetricsSelector } from './redux/slices/metrics_slice'; import { resolutionOptions } from '../../../common/constants/metrics'; import SavedObjects from '../../services/saved_objects/event_analytics/saved_objects'; import { observabilityLogsID } from '../../../common/constants/shared'; interface MetricsProps { parentBreadcrumb: ChromeBreadcrumb; renderProps: RouteComponentProps; pplService: PPLService; savedObjects: SavedObjects; setBreadcrumbs: (newBreadcrumbs: ChromeBreadcrumb[]) => void; } export const Home = ({ chrome, parentBreadcrumb }: MetricsProps) => { // Redux tools const selectedMetrics = useSelector(selectedMetricsSelector); const metricsLayout = useSelector(metricsLayoutSelector); // Date picker constants const [recentlyUsedRanges, setRecentlyUsedRanges] = useState([]); const [startTime, setStartTime] = useState('now-1d'); const [endTime, setEndTime] = useState('now'); // Top panel const [IsTopPanelDisabled, setIsTopPanelDisabled] = useState(false); const [editMode, setEditMode] = useState(false); const [onRefresh, setOnRefresh] = useState(false); const [editActionType, setEditActionType] = useState(''); const [resolutionValue, setResolutionValue] = useState(resolutionOptions[2].value); const [spanValue, setSpanValue] = useState(1); const resolutionSelectId = htmlIdGenerator('resolutionSelect')(); const [toasts, setToasts] = useState([]); const [toastRightSide, setToastRightSide] = useState(true); // Metrics constants const [panelVisualizations, setPanelVisualizations] = useState([]); const setToast = (title: string, color = 'success', text?: ReactChild, side?: string) => { if (!text) text = ''; setToastRightSide(!side); setToasts([...toasts, { id: new Date().toISOString(), title, text, color } as Toast]); }; const onRefreshFilters = () => { if (spanValue < 1) { setToast('Please add a valid span interval', 'danger'); return; } setOnRefresh(!onRefresh); }; const onDatePickerChange = (props: OnTimeChangeProps) => { onTimeChange( props.start, props.end, recentlyUsedRanges, setRecentlyUsedRanges, setStartTime, setEndTime ); onRefreshFilters(); }; const onEditClick = (savedVisualizationId: string) => { window.location.assign(`${observabilityLogsID}#/explorer/${savedVisualizationId}`); }; useEffect(() => { chrome.setBreadcrumbs([ parentBreadcrumb, { text: 'Metrics', href: `#/`, }, ]); }, [chrome, parentBreadcrumb]); useEffect(() => { if (!editMode) { selectedMetrics.length > 0 ? setIsTopPanelDisabled(false) : setIsTopPanelDisabled(true); // eslint-disable-line } else { setIsTopPanelDisabled(true); } }, [selectedMetrics, editMode]); useEffect(() => { setPanelVisualizations(metricsLayout); }, [metricsLayout]); return ( <> { setToasts(toasts.filter((toast) => toast.id !== removedToast.id)); }} side={toastRightSide ? 'right' : 'left'} toastLifeTimeMs={6000} /> (
{(EuiResizablePanel, EuiResizableButton) => ( <> {selectedMetrics.length > 0 ? ( ) : ( )} )}
)} />
); };