mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-12 15:39:06 +08:00
fix[FE]: fix the update view button not visible on changes to Not Updating in Logs and Traces List View. (#6454)
* fix[FE]: fix the update view button not visible on changes to columns in logs and traces list view * fix: pass the missing options to isStagedQueryUpdated in ExplorerCard * test: mock useHistory hook for ExplorerCard tests --------- Co-authored-by: ahmadshaheer <ashaheerki@gmail.com>
This commit is contained in:
parent
846b6a9346
commit
7359c0a825
@ -18,7 +18,9 @@ import {
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import TextToolTip from 'components/TextToolTip';
|
import TextToolTip from 'components/TextToolTip';
|
||||||
import { SOMETHING_WENT_WRONG } from 'constants/api';
|
import { SOMETHING_WENT_WRONG } from 'constants/api';
|
||||||
|
import { LOCALSTORAGE } from 'constants/localStorage';
|
||||||
import { QueryParams } from 'constants/query';
|
import { QueryParams } from 'constants/query';
|
||||||
|
import { useOptionsMenu } from 'container/OptionsMenu';
|
||||||
import { useGetSearchQueryParam } from 'hooks/queryBuilder/useGetSearchQueryParam';
|
import { useGetSearchQueryParam } from 'hooks/queryBuilder/useGetSearchQueryParam';
|
||||||
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
||||||
import { useDeleteView } from 'hooks/saveViews/useDeleteView';
|
import { useDeleteView } from 'hooks/saveViews/useDeleteView';
|
||||||
@ -29,6 +31,7 @@ import { useNotifications } from 'hooks/useNotifications';
|
|||||||
import { mapCompositeQueryFromQuery } from 'lib/newQueryBuilder/queryBuilderMappers/mapCompositeQueryFromQuery';
|
import { mapCompositeQueryFromQuery } from 'lib/newQueryBuilder/queryBuilderMappers/mapCompositeQueryFromQuery';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useCopyToClipboard } from 'react-use';
|
import { useCopyToClipboard } from 'react-use';
|
||||||
|
import { DataSource, StringOperators } from 'types/common/queryBuilder';
|
||||||
import { popupContainer } from 'utils/selectPopupContainer';
|
import { popupContainer } from 'utils/selectPopupContainer';
|
||||||
|
|
||||||
import { ExploreHeaderToolTip, SaveButtonText } from './constants';
|
import { ExploreHeaderToolTip, SaveButtonText } from './constants';
|
||||||
@ -83,7 +86,20 @@ function ExplorerCard({
|
|||||||
|
|
||||||
const viewKey = useGetSearchQueryParam(QueryParams.viewKey) || '';
|
const viewKey = useGetSearchQueryParam(QueryParams.viewKey) || '';
|
||||||
|
|
||||||
const isQueryUpdated = isStagedQueryUpdated(viewsData?.data?.data, viewKey);
|
const { options } = useOptionsMenu({
|
||||||
|
storageKey:
|
||||||
|
sourcepage === DataSource.TRACES
|
||||||
|
? LOCALSTORAGE.TRACES_LIST_OPTIONS
|
||||||
|
: LOCALSTORAGE.LOGS_LIST_OPTIONS,
|
||||||
|
dataSource: sourcepage,
|
||||||
|
aggregateOperator: StringOperators.NOOP,
|
||||||
|
});
|
||||||
|
|
||||||
|
const isQueryUpdated = isStagedQueryUpdated(
|
||||||
|
viewsData?.data?.data,
|
||||||
|
viewKey,
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
|
||||||
const { mutateAsync: updateViewAsync } = useUpdateView({
|
const { mutateAsync: updateViewAsync } = useUpdateView({
|
||||||
compositeQuery: mapCompositeQueryFromQuery(currentQuery, panelType),
|
compositeQuery: mapCompositeQueryFromQuery(currentQuery, panelType),
|
||||||
|
@ -6,11 +6,18 @@ import { DataSource } from 'types/common/queryBuilder';
|
|||||||
import { viewMockData } from '../__mock__/viewData';
|
import { viewMockData } from '../__mock__/viewData';
|
||||||
import ExplorerCard from '../ExplorerCard';
|
import ExplorerCard from '../ExplorerCard';
|
||||||
|
|
||||||
|
const historyReplace = jest.fn();
|
||||||
|
|
||||||
|
// eslint-disable-next-line sonarjs/no-duplicate-string
|
||||||
jest.mock('react-router-dom', () => ({
|
jest.mock('react-router-dom', () => ({
|
||||||
...jest.requireActual('react-router-dom'),
|
...jest.requireActual('react-router-dom'),
|
||||||
useLocation: (): { pathname: string } => ({
|
useLocation: (): { pathname: string } => ({
|
||||||
pathname: `${process.env.FRONTEND_API_ENDPOINT}/${ROUTES.TRACES_EXPLORER}/`,
|
pathname: `${process.env.FRONTEND_API_ENDPOINT}/${ROUTES.TRACES_EXPLORER}/`,
|
||||||
}),
|
}),
|
||||||
|
useHistory: (): any => ({
|
||||||
|
...jest.requireActual('react-router-dom').useHistory(),
|
||||||
|
replace: historyReplace,
|
||||||
|
}),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
jest.mock('hooks/queryBuilder/useGetPanelTypesQueryParam', () => ({
|
jest.mock('hooks/queryBuilder/useGetPanelTypesQueryParam', () => ({
|
||||||
|
@ -2,6 +2,7 @@ import { FormInstance } from 'antd';
|
|||||||
import { NotificationInstance } from 'antd/es/notification/interface';
|
import { NotificationInstance } from 'antd/es/notification/interface';
|
||||||
import { AxiosResponse } from 'axios';
|
import { AxiosResponse } from 'axios';
|
||||||
import { PANEL_TYPES } from 'constants/queryBuilder';
|
import { PANEL_TYPES } from 'constants/queryBuilder';
|
||||||
|
import { OptionsQuery } from 'container/OptionsMenu/types';
|
||||||
import { UseMutateAsyncFunction } from 'react-query';
|
import { UseMutateAsyncFunction } from 'react-query';
|
||||||
import { ICompositeMetricQuery } from 'types/api/alerts/compositeQuery';
|
import { ICompositeMetricQuery } from 'types/api/alerts/compositeQuery';
|
||||||
import { Query } from 'types/api/queryBuilder/queryBuilderData';
|
import { Query } from 'types/api/queryBuilder/queryBuilderData';
|
||||||
@ -36,6 +37,7 @@ export interface IsQueryUpdatedInViewProps {
|
|||||||
data: ViewProps[] | undefined;
|
data: ViewProps[] | undefined;
|
||||||
stagedQuery: Query | null;
|
stagedQuery: Query | null;
|
||||||
currentPanelType: PANEL_TYPES | null;
|
currentPanelType: PANEL_TYPES | null;
|
||||||
|
options: OptionsQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SaveViewWithNameProps {
|
export interface SaveViewWithNameProps {
|
||||||
|
@ -80,12 +80,13 @@ export const isQueryUpdatedInView = ({
|
|||||||
data,
|
data,
|
||||||
stagedQuery,
|
stagedQuery,
|
||||||
currentPanelType,
|
currentPanelType,
|
||||||
|
options,
|
||||||
}: IsQueryUpdatedInViewProps): boolean => {
|
}: IsQueryUpdatedInViewProps): boolean => {
|
||||||
const currentViewDetails = getViewDetailsUsingViewKey(viewKey, data);
|
const currentViewDetails = getViewDetailsUsingViewKey(viewKey, data);
|
||||||
if (!currentViewDetails) {
|
if (!currentViewDetails) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const { query, panelType } = currentViewDetails;
|
const { query, panelType, extraData } = currentViewDetails;
|
||||||
|
|
||||||
// Omitting id from aggregateAttribute and groupBy
|
// Omitting id from aggregateAttribute and groupBy
|
||||||
const updatedCurrentQuery = omitIdFromQuery(stagedQuery);
|
const updatedCurrentQuery = omitIdFromQuery(stagedQuery);
|
||||||
@ -97,12 +98,15 @@ export const isQueryUpdatedInView = ({
|
|||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
panelType !== currentPanelType ||
|
panelType !== currentPanelType ||
|
||||||
!isEqual(query.builder, updatedCurrentQuery?.builder) ||
|
!isEqual(query.builder, updatedCurrentQuery?.builder) ||
|
||||||
!isEqual(query.clickhouse_sql, updatedCurrentQuery?.clickhouse_sql) ||
|
!isEqual(query.clickhouse_sql, updatedCurrentQuery?.clickhouse_sql) ||
|
||||||
!isEqual(query.promql, updatedCurrentQuery?.promql)
|
!isEqual(query.promql, updatedCurrentQuery?.promql) ||
|
||||||
|
!isEqual(
|
||||||
|
options?.selectColumns,
|
||||||
|
extraData && JSON.parse(extraData)?.selectColumns,
|
||||||
|
)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -212,13 +212,46 @@ function ExplorerOptions({
|
|||||||
0.08,
|
0.08,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { options, handleOptionsChange } = useOptionsMenu({
|
||||||
|
storageKey:
|
||||||
|
sourcepage === DataSource.TRACES
|
||||||
|
? LOCALSTORAGE.TRACES_LIST_OPTIONS
|
||||||
|
: LOCALSTORAGE.LOGS_LIST_OPTIONS,
|
||||||
|
dataSource: sourcepage,
|
||||||
|
aggregateOperator: StringOperators.NOOP,
|
||||||
|
});
|
||||||
|
|
||||||
|
const getUpdatedExtraData = (
|
||||||
|
extraData: string | undefined,
|
||||||
|
newSelectedColumns: BaseAutocompleteData[],
|
||||||
|
): string => {
|
||||||
|
let updatedExtraData;
|
||||||
|
|
||||||
|
if (extraData) {
|
||||||
|
const parsedExtraData = JSON.parse(extraData);
|
||||||
|
parsedExtraData.selectColumns = newSelectedColumns;
|
||||||
|
updatedExtraData = JSON.stringify(parsedExtraData);
|
||||||
|
} else {
|
||||||
|
updatedExtraData = JSON.stringify({
|
||||||
|
color: Color.BG_SIENNA_500,
|
||||||
|
selectColumns: newSelectedColumns,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return updatedExtraData;
|
||||||
|
};
|
||||||
|
|
||||||
|
const updatedExtraData = getUpdatedExtraData(
|
||||||
|
extraData,
|
||||||
|
options?.selectColumns,
|
||||||
|
);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
mutateAsync: updateViewAsync,
|
mutateAsync: updateViewAsync,
|
||||||
isLoading: isViewUpdating,
|
isLoading: isViewUpdating,
|
||||||
} = useUpdateView({
|
} = useUpdateView({
|
||||||
compositeQuery,
|
compositeQuery,
|
||||||
viewKey,
|
viewKey,
|
||||||
extraData: extraData || JSON.stringify({ color: Color.BG_SIENNA_500 }),
|
extraData: updatedExtraData,
|
||||||
sourcePage: sourcepage,
|
sourcePage: sourcepage,
|
||||||
viewName,
|
viewName,
|
||||||
});
|
});
|
||||||
@ -230,13 +263,11 @@ function ExplorerOptions({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const onUpdateQueryHandler = (): void => {
|
const onUpdateQueryHandler = (): void => {
|
||||||
const extraData = viewsData?.data?.data?.find((view) => view.uuid === viewKey)
|
|
||||||
?.extraData;
|
|
||||||
updateViewAsync(
|
updateViewAsync(
|
||||||
{
|
{
|
||||||
compositeQuery: mapCompositeQueryFromQuery(currentQuery, panelType),
|
compositeQuery: mapCompositeQueryFromQuery(currentQuery, panelType),
|
||||||
viewKey,
|
viewKey,
|
||||||
extraData: extraData || JSON.stringify({ color: Color.BG_SIENNA_500 }),
|
extraData: updatedExtraData,
|
||||||
sourcePage: sourcepage,
|
sourcePage: sourcepage,
|
||||||
viewName,
|
viewName,
|
||||||
},
|
},
|
||||||
@ -258,15 +289,6 @@ function ExplorerOptions({
|
|||||||
|
|
||||||
const { handleExplorerTabChange } = useHandleExplorerTabChange();
|
const { handleExplorerTabChange } = useHandleExplorerTabChange();
|
||||||
|
|
||||||
const { options, handleOptionsChange } = useOptionsMenu({
|
|
||||||
storageKey:
|
|
||||||
sourcepage === DataSource.TRACES
|
|
||||||
? LOCALSTORAGE.TRACES_LIST_OPTIONS
|
|
||||||
: LOCALSTORAGE.LOGS_LIST_OPTIONS,
|
|
||||||
dataSource: sourcepage,
|
|
||||||
aggregateOperator: StringOperators.NOOP,
|
|
||||||
});
|
|
||||||
|
|
||||||
type ExtraData = {
|
type ExtraData = {
|
||||||
selectColumns?: BaseAutocompleteData[];
|
selectColumns?: BaseAutocompleteData[];
|
||||||
version?: number;
|
version?: number;
|
||||||
@ -422,7 +444,11 @@ function ExplorerOptions({
|
|||||||
history.replace(DATASOURCE_VS_ROUTES[sourcepage]);
|
history.replace(DATASOURCE_VS_ROUTES[sourcepage]);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isQueryUpdated = isStagedQueryUpdated(viewsData?.data?.data, viewKey);
|
const isQueryUpdated = isStagedQueryUpdated(
|
||||||
|
viewsData?.data?.data,
|
||||||
|
viewKey,
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
isLoading: isSaveViewLoading,
|
isLoading: isSaveViewLoading,
|
||||||
|
@ -20,6 +20,7 @@ import {
|
|||||||
panelTypeDataSourceFormValuesMap,
|
panelTypeDataSourceFormValuesMap,
|
||||||
PartialPanelTypes,
|
PartialPanelTypes,
|
||||||
} from 'container/NewWidget/utils';
|
} from 'container/NewWidget/utils';
|
||||||
|
import { OptionsQuery } from 'container/OptionsMenu/types';
|
||||||
import { useGetCompositeQueryParam } from 'hooks/queryBuilder/useGetCompositeQueryParam';
|
import { useGetCompositeQueryParam } from 'hooks/queryBuilder/useGetCompositeQueryParam';
|
||||||
import { updateStepInterval } from 'hooks/queryBuilder/useStepInterval';
|
import { updateStepInterval } from 'hooks/queryBuilder/useStepInterval';
|
||||||
import useUrlQuery from 'hooks/useUrlQuery';
|
import useUrlQuery from 'hooks/useUrlQuery';
|
||||||
@ -747,12 +748,17 @@ export function QueryBuilderProvider({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const isStagedQueryUpdated = useCallback(
|
const isStagedQueryUpdated = useCallback(
|
||||||
(viewData: ViewProps[] | undefined, viewKey: string): boolean =>
|
(
|
||||||
|
viewData: ViewProps[] | undefined,
|
||||||
|
viewKey: string,
|
||||||
|
options: OptionsQuery,
|
||||||
|
): boolean =>
|
||||||
isQueryUpdatedInView({
|
isQueryUpdatedInView({
|
||||||
currentPanelType: panelType,
|
currentPanelType: panelType,
|
||||||
data: viewData,
|
data: viewData,
|
||||||
stagedQuery,
|
stagedQuery,
|
||||||
viewKey,
|
viewKey,
|
||||||
|
options,
|
||||||
}),
|
}),
|
||||||
[panelType, stagedQuery],
|
[panelType, stagedQuery],
|
||||||
);
|
);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { PANEL_TYPES } from 'constants/queryBuilder';
|
import { PANEL_TYPES } from 'constants/queryBuilder';
|
||||||
import ROUTES from 'constants/routes';
|
import ROUTES from 'constants/routes';
|
||||||
import { Format } from 'container/NewWidget/RightContainer/types';
|
import { Format } from 'container/NewWidget/RightContainer/types';
|
||||||
|
import { OptionsQuery } from 'container/OptionsMenu/types';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction } from 'react';
|
||||||
import {
|
import {
|
||||||
IBuilderFormula,
|
IBuilderFormula,
|
||||||
@ -246,6 +247,7 @@ export type QueryBuilderContextType = {
|
|||||||
isStagedQueryUpdated: (
|
isStagedQueryUpdated: (
|
||||||
viewData: ViewProps[] | undefined,
|
viewData: ViewProps[] | undefined,
|
||||||
viewKey: string,
|
viewKey: string,
|
||||||
|
options: OptionsQuery,
|
||||||
) => boolean;
|
) => boolean;
|
||||||
isDefaultQuery: (props: IsDefaultQueryProps) => boolean;
|
isDefaultQuery: (props: IsDefaultQueryProps) => boolean;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user