mirror of
https://github.com/SigNoz/signoz.git
synced 2025-12-18 16:07:10 +00:00
* feat: add drilldown options in uplot * feat: add time range to timeseries, bar charts * feat: remove unwanted code * feat: minor refactor * feat: drilldown prop drilldowned * feat: refactor code * feat: update click plugin in uplot * feat: lint fix * feat: add search to breakout and other refactor * feat: context menu - increase width and add overlay * feat: add context links * feat: context links init * feat: context links init * feat: context links init * feat: update context link modal form init * feat: add double way sync on urls and param * feat: minor refactor * feat: minor refactor * feat: change contextlinks data structure * feat: context menu changes init * feat: context menu hook refactor * feat: context links processors * feat: context variables hook added * feat: add support for field variables * feat: minor refactor * feat: minor refactor * feat: minor refactor * feat: handle on save * feat: minor refactor * feat: snapshot update * feat: revert qbv5 * feat: aggregation header val * feat: fix header color * feat: minor refactor * feat: minor refactor * feat: fix breaking changes from qb v5 * feat: change api for breakout opitons * feat: minor refactor * feat: minor refactor * fix: added fix for extractquerypararms when value is string in multivalue operator * feat: minor refactor * feat: add back in breakout * feat: minor refactor * feat: add substitute var api call to decode vars * feat: minor fix * feat: optimize query value comparison in QueryBuilderV2 * feat: minor fix * feat: minor fix * feat: test fix * feat: added dynamic variables creation flow (#7541) * feat: added dynamic variables creation flow * feat: added keys and value apis and hooks * feat: added api and select component changes * feat: added keys fetching and preview values * feat: added dynamic variable to variable items * feat: handled value persistence and tab switches * feat: added default value and formed a schema for dyn-variables * feat: added client and server side searches * feat: corrected the initial load getfieldKey api * feat: removed fetch on mount restriction * feat: added dynamic variable to the dashboard details (#7755) * feat: added dynamic variable to the dashboard details * feat: added new component to existing variables * feat: added enhancement to multiselect and select for dyn-variables * feat: added refetch method between all dynamic-variables * feat: correct error handling * feat: correct error handling * feat: enforced non-empty selectedvalues and default value * feat: added client and server side searches * feat: retry on error * feat: correct error handling * feat: handle defautl value in existing variables * feat: lowercase the source for payload * feat: fixed the incorrect assignment of active indices * feat: improved handling of all option * feat: improved the ALL option visuals * feat: handled default value enforcement in existing variables * feat: added unix time to values call * feat: added incomplete data message and info to search * feat: changed dashboard panel call handling with existing variables * feat: adjusted the response type and data with the new API schema for values * feat: code refactor * feat: made dyn-variable option as the default * feat: added test cases for dyn variable creation and completion * feat: updated test cases * feat: added variable in url and made dashboard sync around that and sharable (#7944) * feat: added dynamic variable to the dashboard details * feat: added new component to existing variables * feat: added enhancement to multiselect and select for dyn-variables * feat: added refetch method between all dynamic-variables * feat: correct error handling * feat: correct error handling * feat: enforced non-empty selectedvalues and default value * feat: added client and server side searches * feat: retry on error * feat: correct error handling * feat: handle defautl value in existing variables * feat: lowercase the source for payload * feat: fixed the incorrect assignment of active indices * feat: improved handling of all option * feat: improved the ALL option visuals * feat: handled default value enforcement in existing variables * feat: added unix time to values call * feat: added incomplete data message and info to search * feat: changed dashboard panel call handling with existing variables * feat: adjusted the response type and data with the new API schema for values * feat: code refactor * feat: made dyn-variable option as the default * feat: added test cases for dyn variable creation and completion * feat: updated test cases * feat: added variable in url and made dashboard sync around that and sharable * feat: added test cases * feat: added safety check * feat: enabled url setting on first load itself * feat: code refactor * feat: cleared options query param when on dashboard list page * feat: resolved conflicts * feat: added dynamic variable suggestion in where clause * feat: added test cases for hooks and api call functions * feat: added test case for querybuildersearchv2 suggestion changes * feat: code refactor * feat: updated test case * feat: corrected the regex matcher for resolved titles * feat: added ability to add/remove variable filter to one or more existing panels * feat: added widgetselector on variable creation * feat: show labels in widget selector * feat: added apply to all and variable removal logical * feat: refectch only related and affected panels in case of dynamic variables * feat: added button loader for apply-all * feat: light-mode styles * feat: minor refactor * feat: added test cases * feat: refactor * feat: remove consoles * feat: pass panel types to substitutevars * feat: cross filtering init * fix: added fix for query builder filters * feat: cross filtering add set/unset/create functionality * feat: test update * fix: added migration to filter expression for crud operations of variable * feat: format legend name according to existing format * feat: breakout test init * feat: breakout test match query * feat: context links tests * feat: minor refactor * feat: show edit only if user has access * feat: added dynamic variables creation flow (#7541) * feat: added dynamic variables creation flow * feat: added keys and value apis and hooks * feat: added api and select component changes * feat: added keys fetching and preview values * feat: added dynamic variable to variable items * feat: handled value persistence and tab switches * feat: added default value and formed a schema for dyn-variables * feat: added client and server side searches * feat: corrected the initial load getfieldKey api * feat: removed fetch on mount restriction * feat: added dynamic variable to the dashboard details (#7755) * feat: added dynamic variable to the dashboard details * feat: added new component to existing variables * feat: added enhancement to multiselect and select for dyn-variables * feat: added refetch method between all dynamic-variables * feat: correct error handling * feat: correct error handling * feat: enforced non-empty selectedvalues and default value * feat: added client and server side searches * feat: retry on error * feat: correct error handling * feat: handle defautl value in existing variables * feat: lowercase the source for payload * feat: fixed the incorrect assignment of active indices * feat: improved handling of all option * feat: improved the ALL option visuals * feat: handled default value enforcement in existing variables * feat: added unix time to values call * feat: added incomplete data message and info to search * feat: changed dashboard panel call handling with existing variables * feat: adjusted the response type and data with the new API schema for values * feat: code refactor * feat: made dyn-variable option as the default * feat: added test cases for dyn variable creation and completion * feat: updated test cases * feat: added dynamic variable suggestion in where clause * feat: added test cases for hooks and api call functions * feat: added test case for querybuildersearchv2 suggestion changes * feat: code refactor * feat: updated test case * feat: corrected the regex matcher for resolved titles * feat: added ability to add/remove variable filter to one or more existing panels * feat: added widgetselector on variable creation * feat: show labels in widget selector * feat: added apply to all and variable removal logical * feat: refectch only related and affected panels in case of dynamic variables * feat: added button loader for apply-all * feat: light-mode styles * fix: added migration to filter expression for crud operations of variable * feat: reverted dynamic variable url config changes (#8877) * Revert "feat: changed query param name" This reverts commit 62bee5f003bf74b0da1c5951f1b5d0f2c250905d. * Revert "feat: added user-friendly format to dashboard variable url" This reverts commit 6de8b1c2e8c6a838941014ea4929e9f5c908d975. * feat: reverted url var changes * feat: reverted url changed from usedashboardvarupdate hook * feat: send empty array for widgetId * feat: added type in the variables in query_range payload for dynamic * feat: minor fixes * fix: added fix for multivalue operator without brackets * feat: minor fix * feat: fix failing test * feat: change revert * test: added tests for querycontextUtils + querybuilderv2 utils * fix: added fix for replacing filter with the new value * fix: added fix for replacing filters + datetimepicker composite query * test: fixed querybuilderv2 utils test * feat: handle number dataType in filters * feat: correct the variable addition to panel format for new qb expression * feat: remove other queries in breakout * feat: add metric to traces mapping * feat: pass proper time range * feat: update time range logic * feat: value panel drilldown init * feat: value panel drilldown init * feat: enable context links in value panel * feat: minor fix * feat: update snapshot * feat: hide breakout in value panel * feat: add panel type to view mode * feat: add support to change panel in breakouts * feat: panel change for breakout logic added * chore: fix style * chore: show variables suggestion while creating context links * chore: add timestamp to graphs * chore: add timestamp to table panel * chore: fix failing tests * chore: fix infinite re-rendering due to queryRange * chore: send appropriate time range when signal is metrics * chore: show variables suggestion while creating context links * chore: minor refactor * chore: show trace details link if filter has trace_id * chore: fix infinite render of table component * chore: added tests for v2 * fix: context links set from dropdown * chore: minor refactor * chore: minor refactor * chore: fix test * chore: fix timerange for apm metrics * fix: get correct timestamp for clicked data * chore: comment out change to histogram on breakout by number * chore: change panel type on panel type change in url * chore: remove consoles * feat: added dynamic variables creation flow (#7541) * feat: added dynamic variables creation flow * feat: added keys and value apis and hooks * feat: added api and select component changes * feat: added keys fetching and preview values * feat: added dynamic variable to variable items * feat: handled value persistence and tab switches * feat: added default value and formed a schema for dyn-variables * feat: added client and server side searches * feat: corrected the initial load getfieldKey api * feat: removed fetch on mount restriction * feat: added dynamic variable to the dashboard details (#7755) * feat: added dynamic variable to the dashboard details * feat: added new component to existing variables * feat: added enhancement to multiselect and select for dyn-variables * feat: added refetch method between all dynamic-variables * feat: correct error handling * feat: correct error handling * feat: enforced non-empty selectedvalues and default value * feat: added client and server side searches * feat: retry on error * feat: correct error handling * feat: handle defautl value in existing variables * feat: lowercase the source for payload * feat: fixed the incorrect assignment of active indices * feat: improved handling of all option * feat: improved the ALL option visuals * feat: handled default value enforcement in existing variables * feat: added unix time to values call * feat: added incomplete data message and info to search * feat: changed dashboard panel call handling with existing variables * feat: adjusted the response type and data with the new API schema for values * feat: code refactor * feat: made dyn-variable option as the default * feat: added test cases for dyn variable creation and completion * feat: updated test cases * feat: fix lint and test cases * feat: fix typo * feat: fixed test case * feat: added dynamic variable suggestion in where clause * feat: added test cases for hooks and api call functions * feat: added test case for querybuildersearchv2 suggestion changes * feat: code refactor * feat: corrected the regex matcher for resolved titles * feat: fixed test cases * feat: added ability to add/remove variable filter to one or more existing panels * feat: added widgetselector on variable creation * feat: show labels in widget selector * feat: added apply to all and variable removal logical * feat: refectch only related and affected panels in case of dynamic variables * feat: added button loader for apply-all * feat: light-mode styles * fix: added migration to filter expression for crud operations of variable * feat: added type in the variables in query_range payload for dynamic * feat: correct the variable addition to panel format for new qb expression * feat: added test cases for dynamic variable and add/remove panel feat * feat: implemented where clause suggestion in new qb v5 * feat: added retries for dyn variable and fixed on-enter selection issue * feat: added relatedValues and existing query in param related changes * feat: sanitized data storage and removed duplicates * fix: fixed typechecks * feat: updated panel wait and refetch logic and ALL option selection * feat: fixed variable tabel reordering issue * feat: added empty name validation in variable creation * feat: change value to searchtext in values API * feat: added option for regex in the component, disabled for now * feat: added beta and not rec. tag in variable tabs * feat: added check to prevent api and updates calls with same payload * feat: optimized localstorage for all selection in dynamic variable and updated __all__ case * feat: resolved variable tables infinite loop update error * feat: aded variable name auto-update based on attribute name entered for dynamic variables * feat: modified only/all click behaviour and set all selection always true for dynamic variable * feat: fix dropdown closing doesn't reset us back to our all available values when we have a search * feat: handled all state distinction and carry forward in existing variables * feat: trucate + n more tooltip content to 10 * feat: fixed infinite loop because of dependency of frequently changing object ref in var table * feat: fixed inconsist search implementations * feat: reverted only - all updated area implementation * feat: added more space for search in multiselect component * feat: checked for variable id instead of variable key for refetch * feat: improved performance around multiselect component and added confirm modal for apply to all * feat: rewrite functionality around add and remove panels * feat: changed color for apply to all modal * feat: added changes under flag to handle variable specific removal for removeKeysFromExpression func * feat: added validation in variable edit panel * chore: fix dynamic variable update in context menu to latest logic * chore: minor fix * chore: type fix * fix: remove unwanted code * fix: remove unwanted code * fix: resolved pr comments * fix: minor fix * fix: fix tests * fix: style fix --------- Co-authored-by: Aditya Singh <adityasingh@Adityas-MacBook-Pro.local> Co-authored-by: Abhi Kumar <ahrefabhi@gmail.com> Co-authored-by: SagarRajput-7 <162284829+SagarRajput-7@users.noreply.github.com> Co-authored-by: SagarRajput-7 <sagar@signoz.io>
403 lines
12 KiB
TypeScript
403 lines
12 KiB
TypeScript
/* eslint-disable sonarjs/cognitive-complexity */
|
|
import './WidgetFullView.styles.scss';
|
|
|
|
import {
|
|
LoadingOutlined,
|
|
SearchOutlined,
|
|
SyncOutlined,
|
|
} from '@ant-design/icons';
|
|
import { Button, Input, Spin } from 'antd';
|
|
import cx from 'classnames';
|
|
import { ToggleGraphProps } from 'components/Graph/types';
|
|
import OverlayScrollbar from 'components/OverlayScrollbar/OverlayScrollbar';
|
|
import { QueryBuilderV2 } from 'components/QueryBuilderV2/QueryBuilderV2';
|
|
import Spinner from 'components/Spinner';
|
|
import TimePreference from 'components/TimePreferenceDropDown';
|
|
import WarningPopover from 'components/WarningPopover/WarningPopover';
|
|
import { ENTITY_VERSION_V5 } from 'constants/app';
|
|
import { QueryParams } from 'constants/query';
|
|
import { PANEL_TYPES } from 'constants/queryBuilder';
|
|
import useDrilldown from 'container/GridCardLayout/GridCard/FullView/useDrilldown';
|
|
import { populateMultipleResults } from 'container/NewWidget/LeftContainer/WidgetGraph/util';
|
|
import {
|
|
timeItems,
|
|
timePreferance,
|
|
} from 'container/NewWidget/RightContainer/timeItems';
|
|
import PanelWrapper from 'container/PanelWrapper/PanelWrapper';
|
|
import RightToolbarActions from 'container/QueryBuilder/components/ToolbarActions/RightToolbarActions';
|
|
import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange';
|
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
|
import { useChartMutable } from 'hooks/useChartMutable';
|
|
import useComponentPermission from 'hooks/useComponentPermission';
|
|
import { useSafeNavigate } from 'hooks/useSafeNavigate';
|
|
import useUrlQuery from 'hooks/useUrlQuery';
|
|
import { getDashboardVariables } from 'lib/dashbaordVariables/getDashboardVariables';
|
|
import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults';
|
|
import GetMinMax from 'lib/getMinMax';
|
|
import { isEmpty } from 'lodash-es';
|
|
import { useAppContext } from 'providers/App/App';
|
|
import { useDashboard } from 'providers/Dashboard/Dashboard';
|
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
import { useLocation } from 'react-router-dom';
|
|
import { UpdateTimeInterval } from 'store/actions';
|
|
import { AppState } from 'store/reducers';
|
|
import { Warning } from 'types/api';
|
|
import { GlobalReducer } from 'types/reducer/globalTime';
|
|
import { getGraphType } from 'utils/getGraphType';
|
|
import { getSortedSeriesData } from 'utils/getSortedSeriesData';
|
|
|
|
import { getLocalStorageGraphVisibilityState } from '../utils';
|
|
import { PANEL_TYPES_VS_FULL_VIEW_TABLE } from './contants';
|
|
import PanelTypeSelector from './PanelTypeSelector';
|
|
import { GraphContainer, TimeContainer } from './styles';
|
|
import { FullViewProps } from './types';
|
|
|
|
function FullView({
|
|
widget,
|
|
fullViewOptions = true,
|
|
version,
|
|
originalName,
|
|
tableProcessedDataRef,
|
|
isDependedDataLoaded = false,
|
|
onToggleModelHandler,
|
|
onClickHandler,
|
|
customOnDragSelect,
|
|
setCurrentGraphRef,
|
|
enableDrillDown = false,
|
|
}: FullViewProps): JSX.Element {
|
|
const { safeNavigate } = useSafeNavigate();
|
|
const { selectedTime: globalSelectedTime } = useSelector<
|
|
AppState,
|
|
GlobalReducer
|
|
>((state) => state.globalTime);
|
|
const dispatch = useDispatch();
|
|
const urlQuery = useUrlQuery();
|
|
const location = useLocation();
|
|
|
|
const fullViewRef = useRef<HTMLDivElement>(null);
|
|
const { handleRunQuery } = useQueryBuilder();
|
|
|
|
useEffect(() => {
|
|
setCurrentGraphRef(fullViewRef);
|
|
}, [setCurrentGraphRef]);
|
|
|
|
const { selectedDashboard, isDashboardLocked } = useDashboard();
|
|
const { user } = useAppContext();
|
|
|
|
const [editWidget] = useComponentPermission(['edit_widget'], user.role);
|
|
|
|
const getSelectedTime = useCallback(
|
|
() =>
|
|
timeItems.find((e) => e.enum === (widget?.timePreferance || 'GLOBAL_TIME')),
|
|
[widget],
|
|
);
|
|
|
|
const fullViewChartRef = useRef<ToggleGraphProps>();
|
|
|
|
const [selectedTime, setSelectedTime] = useState<timePreferance>({
|
|
name: getSelectedTime()?.name || '',
|
|
enum: widget?.timePreferance || 'GLOBAL_TIME',
|
|
});
|
|
|
|
const updatedQuery = widget?.query;
|
|
|
|
// Panel type derived from URL with fallback to widget setting
|
|
const selectedPanelType = useMemo(() => {
|
|
const urlPanelType = urlQuery.get(QueryParams.graphType) as PANEL_TYPES;
|
|
if (urlPanelType && Object.values(PANEL_TYPES).includes(urlPanelType)) {
|
|
return urlPanelType;
|
|
}
|
|
return widget?.panelTypes || PANEL_TYPES.TIME_SERIES;
|
|
}, [urlQuery, widget?.panelTypes]);
|
|
|
|
const [requestData, setRequestData] = useState<GetQueryResultsProps>(() => {
|
|
if (selectedPanelType !== PANEL_TYPES.LIST) {
|
|
return {
|
|
selectedTime: selectedTime.enum,
|
|
graphType: getGraphType(selectedPanelType),
|
|
query: updatedQuery,
|
|
globalSelectedInterval: globalSelectedTime,
|
|
variables: getDashboardVariables(selectedDashboard?.data.variables),
|
|
fillGaps: widget.fillSpans,
|
|
formatForWeb: selectedPanelType === PANEL_TYPES.TABLE,
|
|
originalGraphType: selectedPanelType,
|
|
};
|
|
}
|
|
updatedQuery.builder.queryData[0].pageSize = 10;
|
|
return {
|
|
query: updatedQuery,
|
|
graphType: PANEL_TYPES.LIST,
|
|
selectedTime: widget?.timePreferance || 'GLOBAL_TIME',
|
|
globalSelectedInterval: globalSelectedTime,
|
|
variables: getDashboardVariables(selectedDashboard?.data.variables),
|
|
tableParams: {
|
|
pagination: {
|
|
offset: 0,
|
|
limit: updatedQuery.builder.queryData[0].limit || 0,
|
|
},
|
|
},
|
|
};
|
|
});
|
|
|
|
const {
|
|
drilldownQuery,
|
|
dashboardEditView,
|
|
handleResetQuery,
|
|
showResetQuery,
|
|
} = useDrilldown({
|
|
enableDrillDown,
|
|
widget,
|
|
setRequestData,
|
|
selectedDashboard,
|
|
selectedPanelType,
|
|
});
|
|
|
|
useEffect(() => {
|
|
setRequestData((prev) => ({
|
|
...prev,
|
|
selectedTime: selectedTime.enum,
|
|
}));
|
|
}, [selectedTime]);
|
|
|
|
// Update requestData when panel type changes
|
|
useEffect(() => {
|
|
setRequestData((prev) => {
|
|
if (selectedPanelType !== PANEL_TYPES.LIST) {
|
|
return {
|
|
...prev,
|
|
graphType: getGraphType(selectedPanelType),
|
|
formatForWeb: selectedPanelType === PANEL_TYPES.TABLE,
|
|
originalGraphType: selectedPanelType,
|
|
};
|
|
}
|
|
// For LIST panels, ensure proper configuration
|
|
return {
|
|
...prev,
|
|
graphType: PANEL_TYPES.LIST,
|
|
formatForWeb: false,
|
|
originalGraphType: selectedPanelType,
|
|
};
|
|
});
|
|
}, [selectedPanelType]);
|
|
|
|
const response = useGetQueryRange(
|
|
requestData,
|
|
// selectedDashboard?.data?.version || version || DEFAULT_ENTITY_VERSION,
|
|
ENTITY_VERSION_V5,
|
|
{
|
|
queryKey: [widget?.query, selectedPanelType, requestData, version],
|
|
enabled: !isDependedDataLoaded,
|
|
keepPreviousData: true,
|
|
},
|
|
);
|
|
|
|
const onDragSelect = useCallback(
|
|
(start: number, end: number): void => {
|
|
const startTimestamp = Math.trunc(start);
|
|
const endTimestamp = Math.trunc(end);
|
|
|
|
if (startTimestamp !== endTimestamp) {
|
|
dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp]));
|
|
}
|
|
|
|
const { maxTime, minTime } = GetMinMax('custom', [
|
|
startTimestamp,
|
|
endTimestamp,
|
|
]);
|
|
|
|
urlQuery.set(QueryParams.startTime, minTime.toString());
|
|
urlQuery.set(QueryParams.endTime, maxTime.toString());
|
|
const generatedUrl = `${location.pathname}?${urlQuery.toString()}`;
|
|
safeNavigate(generatedUrl);
|
|
},
|
|
[dispatch, location.pathname, safeNavigate, urlQuery],
|
|
);
|
|
|
|
const [graphsVisibilityStates, setGraphsVisibilityStates] = useState<
|
|
boolean[]
|
|
>(Array(response.data?.payload?.data?.result?.length).fill(true));
|
|
|
|
useEffect(() => {
|
|
const {
|
|
graphVisibilityStates: localStoredVisibilityState,
|
|
} = getLocalStorageGraphVisibilityState({
|
|
apiResponse: response.data?.payload.data.result || [],
|
|
name: originalName,
|
|
});
|
|
setGraphsVisibilityStates(localStoredVisibilityState);
|
|
}, [originalName, response.data?.payload.data.result]);
|
|
|
|
const canModifyChart = useChartMutable({
|
|
panelType: selectedPanelType,
|
|
panelTypeAndGraphManagerVisibility: PANEL_TYPES_VS_FULL_VIEW_TABLE,
|
|
});
|
|
|
|
if (response.data && selectedPanelType === PANEL_TYPES.BAR) {
|
|
const sortedSeriesData = getSortedSeriesData(
|
|
response.data?.payload.data.result,
|
|
);
|
|
response.data.payload.data.result = sortedSeriesData;
|
|
}
|
|
|
|
if (response.data && selectedPanelType === PANEL_TYPES.PIE) {
|
|
const transformedData = populateMultipleResults(response?.data);
|
|
// eslint-disable-next-line no-param-reassign
|
|
response.data = transformedData;
|
|
}
|
|
|
|
useEffect(() => {
|
|
graphsVisibilityStates?.forEach((e, i) => {
|
|
fullViewChartRef?.current?.toggleGraph(i, e);
|
|
});
|
|
}, [graphsVisibilityStates]);
|
|
|
|
const isListView = selectedPanelType === PANEL_TYPES.LIST;
|
|
|
|
const isTablePanel = selectedPanelType === PANEL_TYPES.TABLE;
|
|
|
|
const [searchTerm, setSearchTerm] = useState<string>('');
|
|
|
|
if (response.isLoading && selectedPanelType !== PANEL_TYPES.LIST) {
|
|
return <Spinner height="100%" size="large" tip="Loading..." />;
|
|
}
|
|
|
|
return (
|
|
<div className="full-view-container">
|
|
<OverlayScrollbar>
|
|
<>
|
|
<div className="full-view-header-container">
|
|
{fullViewOptions && (
|
|
<TimeContainer $panelType={selectedPanelType}>
|
|
{enableDrillDown && (
|
|
<div className="drildown-options-container">
|
|
{showResetQuery && (
|
|
<Button type="link" onClick={handleResetQuery}>
|
|
Reset Query
|
|
</Button>
|
|
)}
|
|
{editWidget && (
|
|
<Button
|
|
className="switch-edit-btn"
|
|
disabled={response.isFetching || response.isLoading}
|
|
onClick={(): void => {
|
|
if (dashboardEditView) {
|
|
safeNavigate(dashboardEditView);
|
|
}
|
|
}}
|
|
>
|
|
Switch to Edit Mode
|
|
</Button>
|
|
)}
|
|
<PanelTypeSelector
|
|
selectedPanelType={selectedPanelType}
|
|
disabled={response.isFetching || response.isLoading}
|
|
query={drilldownQuery}
|
|
widgetId={widget?.id || ''}
|
|
/>
|
|
</div>
|
|
)}
|
|
{!isEmpty(response.data?.warning) && (
|
|
<WarningPopover warningData={response.data?.warning as Warning} />
|
|
)}
|
|
<div className="time-container">
|
|
{response.isFetching && (
|
|
<Spin spinning indicator={<LoadingOutlined spin />} />
|
|
)}
|
|
<TimePreference
|
|
selectedTime={selectedTime}
|
|
setSelectedTime={setSelectedTime}
|
|
/>
|
|
<Button
|
|
style={{
|
|
marginLeft: '4px',
|
|
}}
|
|
onClick={(): void => {
|
|
response.refetch();
|
|
}}
|
|
type="primary"
|
|
icon={<SyncOutlined />}
|
|
/>
|
|
</div>
|
|
</TimeContainer>
|
|
)}
|
|
{enableDrillDown && (
|
|
<>
|
|
<QueryBuilderV2
|
|
panelType={selectedPanelType}
|
|
version={selectedDashboard?.data?.version || 'v3'}
|
|
isListViewPanel={selectedPanelType === PANEL_TYPES.LIST}
|
|
// filterConfigs={filterConfigs}
|
|
// queryComponents={queryComponents}
|
|
/>
|
|
<RightToolbarActions
|
|
onStageRunQuery={(): void => {
|
|
handleRunQuery();
|
|
}}
|
|
/>
|
|
</>
|
|
)}
|
|
</div>
|
|
|
|
<div
|
|
className={cx('graph-container', {
|
|
disabled: isDashboardLocked,
|
|
'height-widget':
|
|
widget?.mergeAllActiveQueries || widget?.stackedBarChart,
|
|
'full-view-graph-container': isListView,
|
|
})}
|
|
ref={fullViewRef}
|
|
>
|
|
<GraphContainer
|
|
style={{
|
|
height: isListView ? '100%' : '90%',
|
|
}}
|
|
isGraphLegendToggleAvailable={canModifyChart}
|
|
>
|
|
{isTablePanel && (
|
|
<Input
|
|
addonBefore={<SearchOutlined size={14} />}
|
|
className="global-search"
|
|
placeholder="Search..."
|
|
allowClear
|
|
key={widget.id}
|
|
onChange={(e): void => {
|
|
setSearchTerm(e.target.value || '');
|
|
}}
|
|
/>
|
|
)}
|
|
<PanelWrapper
|
|
queryResponse={response}
|
|
widget={widget}
|
|
setRequestData={setRequestData}
|
|
isFullViewMode
|
|
onToggleModelHandler={onToggleModelHandler}
|
|
setGraphVisibility={setGraphsVisibilityStates}
|
|
graphVisibility={graphsVisibilityStates}
|
|
onDragSelect={customOnDragSelect ?? onDragSelect}
|
|
tableProcessedDataRef={tableProcessedDataRef}
|
|
searchTerm={searchTerm}
|
|
onClickHandler={onClickHandler}
|
|
enableDrillDown={enableDrillDown}
|
|
selectedGraph={selectedPanelType}
|
|
/>
|
|
</GraphContainer>
|
|
</div>
|
|
</>
|
|
</OverlayScrollbar>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
FullView.defaultProps = {
|
|
fullViewOptions: undefined,
|
|
onClickHandler: undefined,
|
|
yAxisUnit: undefined,
|
|
onDragSelect: undefined,
|
|
isDependedDataLoaded: undefined,
|
|
};
|
|
|
|
FullView.displayName = 'FullView';
|
|
|
|
export default FullView;
|