/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import { EuiButton, EuiButtonEmpty, EuiComboBoxOptionOption, EuiFieldText, EuiFlexGroup, EuiFlexItem, EuiPopover, EuiPopoverFooter, EuiSelect, EuiSpacer, EuiSuperDatePicker, OnTimeChangeProps, ShortDate, } from '@elastic/eui'; import { DurationRange } from '@elastic/eui/src/components/date_picker/types'; import React, { useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { CoreStart } from '../../../../../../src/core/public'; import { CUSTOM_PANELS_API_PREFIX } from '../../../../common/constants/custom_panels'; import { resolutionOptions } from '../../../../common/constants/metrics'; import { MetricType } from '../../../../common/types/metrics'; import { uiSettingsService } from '../../../../common/utils'; import { getSavedObjectsClient } from '../../../services/saved_objects/saved_object_client/client_factory'; import { OSDSavedVisualizationClient } from '../../../services/saved_objects/saved_object_client/osd_saved_objects/saved_visualization'; import { addMultipleVizToPanels, uuidRx } from '../../custom_panels/redux/panel_slice'; import { sortMetricLayout, updateMetricsWithSelections } from '../helpers/utils'; import { metricsLayoutSelector } from '../redux/slices/metrics_slice'; import { MetricsExportPanel } from './metrics_export_panel'; import './top_menu.scss'; interface TopMenuProps { IsTopPanelDisabled: boolean; startTime: ShortDate; endTime: ShortDate; onDatePickerChange: (props: OnTimeChangeProps) => void; recentlyUsedRanges: DurationRange[]; editMode: boolean; setEditMode: React.Dispatch>; setEditActionType: React.Dispatch>; panelVisualizations: MetricType[]; setPanelVisualizations: React.Dispatch>; resolutionValue: string; setResolutionValue: React.Dispatch>; spanValue: number; setSpanValue: React.Dispatch>; resolutionSelectId: string; setToast: (title: string, color?: string, text?: any, side?: string) => void; } export const TopMenu = ({ IsTopPanelDisabled, startTime, endTime, onDatePickerChange, recentlyUsedRanges, editMode, setEditActionType, setEditMode, panelVisualizations, setPanelVisualizations, resolutionValue, setResolutionValue, spanValue, setSpanValue, resolutionSelectId, setToast, }: TopMenuProps) => { // Redux tools const dispatch = useDispatch(); const metricsLayout = useSelector(metricsLayoutSelector); const sortedMetricsLayout = sortMetricLayout([...metricsLayout]); const [visualizationsMetaData, setVisualizationsMetaData] = useState([]); const [originalPanelVisualizations, setOriginalPanelVisualizations] = useState([]); const [isSavePanelOpen, setIsSavePanelOpen] = useState(false); const [selectedPanelOptions, setSelectedPanelOptions] = useState< Array> | undefined >([]); // toggle between panel edit mode const editPanel = (editType: string) => { setEditMode(!editMode); switch (editType) { case 'edit': { if (panelVisualizations.length > 0) { setOriginalPanelVisualizations([...panelVisualizations]); } else { setOriginalPanelVisualizations([]); } break; } case 'cancel': { setPanelVisualizations(originalPanelVisualizations); setOriginalPanelVisualizations([]); break; } default: { break; } } setEditActionType(editType); }; const onResolutionChange = (e) => { setResolutionValue(e.target.value); }; const cancelButton = ( editPanel('cancel')}> Cancel ); const saveButton = ( editPanel('save')} > Save view ); const editButton = ( editPanel('edit')} isDisabled={IsTopPanelDisabled} > Edit view ); const Savebutton = ( { setIsSavePanelOpen((staleState) => !staleState); }} data-test-subj="metrics__saveManagementPopover" iconType="arrowDown" isDisabled={IsTopPanelDisabled} > Save ); const handleSavingObjects = async () => { let savedMetricIds = []; try { savedMetricIds = await Promise.all( sortedMetricsLayout.map(async (metricLayout, index) => { const updatedMetric = updateMetricsWithSelections( visualizationsMetaData[index], startTime, endTime, spanValue + resolutionValue ); if (metricLayout.metricType === 'prometheusMetric') { return OSDSavedVisualizationClient.getInstance().create(updatedMetric); } else { return getSavedObjectsClient({ objectId: metricLayout.id, objectType: 'savedVisualization', }).update({ ...updatedMetric, objectId: metricLayout.id, }); } }) ); } catch (e) { const message = 'Issue in saving metrics'; console.error(message, e); setToast(message, 'danger'); return; } setToast('Saved metrics successfully!'); if (selectedPanelOptions.length > 0) { try { const allMetricIds = savedMetricIds.map((metric) => metric.objectId); const soPanels = selectedPanelOptions.filter((panel) => uuidRx.test(panel.panel.id)); dispatch(addMultipleVizToPanels(soPanels, allMetricIds)); } catch (e) { const message = 'Issue in saving metrics to panels'; console.error(message, e); setToast('Issue in saving metrics', 'danger'); } setToast('Saved metrics to Dashboards successfully!'); } }; return ( <>
setSpanValue(e.target.value)} data-test-subj="metrics__spanValue" append={ onResolutionChange(e)} aria-label="resolutionSelect" data-test-subj="metrics__spanResolutionSelect" /> } disabled={IsTopPanelDisabled} aria-label="resolutionField" />
setIsSavePanelOpen(false)} > setIsSavePanelOpen(false)} data-test-subj="metrics__SaveCancel" > Cancel { handleSavingObjects().then(() => setIsSavePanelOpen(false)); }} data-test-subj="metrics__SaveConfirm" > Save
{editMode ? ( <> {cancelButton} {saveButton} ) : ( {editButton} )} ); };