/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import PPLService from 'public/services/requests/ppl'; import React, { useEffect, useState } from 'react'; import { Layout, Layouts, Responsive, WidthProvider } from 'react-grid-layout'; import { useObservable } from 'react-use'; import _ from 'lodash'; import { useDispatch } from 'react-redux'; import { CoreStart } from '../../../../../../src/core/public'; import { VisualizationContainer } from '../../custom_panels/panel_modules/visualization_container'; import { MetricType } from '../../../../common/types/metrics'; import { mergeLayoutAndVisualizations } from '../../custom_panels/helpers/utils'; import { updateMetricsLayout, deSelectMetric } from '../redux/slices/metrics_slice'; import { mergeLayoutAndMetrics } from '../helpers/utils'; import './metrics_grid.scss'; // HOC container to provide dynamic width for Grid layout const ResponsiveGridLayout = WidthProvider(Responsive); interface MetricsGridProps { http: CoreStart['http']; chrome: CoreStart['chrome']; panelVisualizations: MetricType[]; setPanelVisualizations: React.Dispatch>; editMode: boolean; pplService: PPLService; startTime: string; endTime: string; moveToEvents: (savedVisualizationId: string) => any; onRefresh: boolean; editActionType: string; setEditActionType: React.Dispatch>; spanParam: string; } export const MetricsGrid = ({ http, chrome, panelVisualizations, setPanelVisualizations, editMode, pplService, startTime, endTime, moveToEvents, onRefresh, editActionType, setEditActionType, spanParam, }: MetricsGridProps) => { // Redux tools const dispatch = useDispatch(); const updateLayout = (metric: any) => dispatch(updateMetricsLayout(metric)); const handleRemoveMetric = (metric: any) => { dispatch(deSelectMetric(metric)); }; const [currentLayout, setCurrentLayout] = useState([]); const [postEditLayout, setPostEditLayout] = useState([]); const [gridData, setGridData] = useState(panelVisualizations.map(() => <>)); const [removeMetricsList, setRemoveMetricsList] = useState>([]); const isLocked = useObservable(chrome.getIsNavDrawerLocked$()); // Reset Size of Visualizations when layout is changed const layoutChanged = (currLayouts: Layout[], allLayouts: Layouts) => { window.dispatchEvent(new Event('resize')); setPostEditLayout(currLayouts); }; const loadVizComponents = () => { const gridDataComps = panelVisualizations.map((panelVisualization: MetricType, index) => ( )); setGridData(gridDataComps); }; // Reload the Layout const reloadLayout = () => { const tempLayout: Layout[] = panelVisualizations.map((panelVisualization) => { return { i: panelVisualization.id, x: panelVisualization.x, y: panelVisualization.y, w: panelVisualization.w, h: panelVisualization.h, minW: 12, // restricting width of the metric visualization maxW: 12, static: !editMode, } as Layout; }); setCurrentLayout(tempLayout); }; // remove visualization from panel in edit mode const removeVisualization = (visualizationId: string) => { const newVisualizationList = _.reject(panelVisualizations, { id: visualizationId, }); setRemoveMetricsList([...removeMetricsList, { id: visualizationId }]); mergeLayoutAndVisualizations(postEditLayout, newVisualizationList, setPanelVisualizations); }; // Update layout whenever user edit gets completed useEffect(() => { if (editMode) { reloadLayout(); loadVizComponents(); } }, [editMode]); useEffect(() => { if (editActionType === 'cancel') { setRemoveMetricsList([]); } if (editActionType === 'save') { removeMetricsList.map((value) => handleRemoveMetric(value)); updateLayout(mergeLayoutAndMetrics(postEditLayout, panelVisualizations)); setEditActionType(''); } }, [editActionType]); // Update layout whenever visualizations are updated useEffect(() => { reloadLayout(); loadVizComponents(); }, [panelVisualizations]); // Reset Size of Panel Grid when Nav Dock is Locked useEffect(() => { setTimeout(function () { window.dispatchEvent(new Event('resize')); }, 300); }, [isLocked]); useEffect(() => { loadVizComponents(); }, [onRefresh]); useEffect(() => { loadVizComponents(); }, []); return ( {panelVisualizations.map((panelVisualization: MetricType, index) => (
{gridData[index]}
))}
); };