feat: fixed bugs in saved views for traces

This commit is contained in:
sawhil 2025-05-15 02:21:38 +05:30
parent 9a7bec31a7
commit 308bf6e523
7 changed files with 70 additions and 61 deletions

View File

@ -4,9 +4,14 @@ import { Compass, Cone, TowerControl } from 'lucide-react';
import SaveView from 'pages/SaveView'; import SaveView from 'pages/SaveView';
import TracesExplorer from 'pages/TracesExplorer'; import TracesExplorer from 'pages/TracesExplorer';
import TracesFunnels from 'pages/TracesFunnels'; import TracesFunnels from 'pages/TracesFunnels';
import { PreferenceContextProvider } from 'providers/preferences/context/PreferenceContextProvider';
export const tracesExplorer: TabRoutes = { export const tracesExplorer: TabRoutes = {
Component: TracesExplorer, Component: (): JSX.Element => (
<PreferenceContextProvider>
<TracesExplorer />
</PreferenceContextProvider>
),
name: ( name: (
<div className="tab-item"> <div className="tab-item">
<Compass size={16} /> Explorer <Compass size={16} /> Explorer

View File

@ -29,10 +29,11 @@ const getLogsUpdaterConfig = (
} }
if (mode === 'direct') { if (mode === 'direct') {
// redirectWithOptionsData({ // just need to update the columns see for remove props
// ...defaultOptionsQuery, redirectWithOptionsData({
// selectColumns: newColumns, ...defaultOptionsQuery,
// }); selectColumns: newColumns,
});
// Also update local storage // Also update local storage
const local = JSON.parse( const local = JSON.parse(

View File

@ -1,17 +1,41 @@
import setLocalStorageKey from 'api/browser/localstorage/set'; import setLocalStorageKey from 'api/browser/localstorage/set';
import { LOCALSTORAGE } from 'constants/localStorage'; import { LOCALSTORAGE } from 'constants/localStorage';
import { defaultOptionsQuery } from 'container/OptionsMenu/constants';
import { FontSize, OptionsQuery } from 'container/OptionsMenu/types';
import { Dispatch, SetStateAction } from 'react';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { Preferences } from '../types';
// --- TRACES preferences updater config --- // --- TRACES preferences updater config ---
const tracesUpdater = { const getTracesUpdaterConfig = (
redirectWithOptionsData: (options: OptionsQuery) => void,
setSavedViewPreferences: Dispatch<SetStateAction<Preferences | null>>,
): {
updateColumns: (newColumns: BaseAutocompleteData[], mode: string) => void;
updateFormatting: () => void;
} => ({
updateColumns: (newColumns: BaseAutocompleteData[], mode: string): void => { updateColumns: (newColumns: BaseAutocompleteData[], mode: string): void => {
const url = new URL(window.location.href); // remove the formatting props
const options = JSON.parse(url.searchParams.get('options') || '{}'); if (mode === 'savedView') {
options.selectColumns = newColumns; setSavedViewPreferences({
url.searchParams.set('options', JSON.stringify(options)); columns: newColumns,
window.history.replaceState({}, '', url.toString()); formatting: {
maxLines: 2,
format: 'table',
fontSize: 'small' as FontSize,
version: 1,
},
});
}
if (mode === 'direct') { if (mode === 'direct') {
// just need to update the columns see for remove props
redirectWithOptionsData({
...defaultOptionsQuery,
selectColumns: newColumns,
});
const local = JSON.parse( const local = JSON.parse(
localStorage.getItem(LOCALSTORAGE.TRACES_LIST_OPTIONS) || '{}', localStorage.getItem(LOCALSTORAGE.TRACES_LIST_OPTIONS) || '{}',
); );
@ -20,6 +44,6 @@ const tracesUpdater = {
} }
}, },
updateFormatting: (): void => {}, // no-op for traces updateFormatting: (): void => {}, // no-op for traces
}; });
export default tracesUpdater; export default getTracesUpdaterConfig;

View File

@ -1,17 +1,12 @@
/* eslint-disable sonarjs/cognitive-complexity */ /* eslint-disable sonarjs/cognitive-complexity */
/* eslint-disable no-empty */ /* eslint-disable no-empty */
// import {
// defaultLogsSelectedColumns,
// defaultTraceSelectedColumns,
// } from 'container/OptionsMenu/constants';
import { useGetAllViews } from 'hooks/saveViews/useGetAllViews';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { DataSource } from 'types/common/queryBuilder'; import { DataSource } from 'types/common/queryBuilder';
import logsLoaderConfig from '../configs/logsLoaderConfig'; import logsLoaderConfig from '../configs/logsLoaderConfig';
import tracesLoaderConfig from '../configs/tracesLoaderConfig'; import tracesLoaderConfig from '../configs/tracesLoaderConfig';
import { FormattingOptions, PreferenceMode, Preferences } from '../types'; import { FormattingOptions, Preferences } from '../types';
// Generic preferences loader that works with any config // Generic preferences loader that works with any config
async function preferencesLoader<T>(config: { async function preferencesLoader<T>(config: {
@ -53,13 +48,9 @@ async function tracesPreferencesLoader(): Promise<{
} }
export function usePreferenceLoader({ export function usePreferenceLoader({
mode,
savedViewId,
dataSource, dataSource,
reSync, reSync,
}: { }: {
mode: PreferenceMode;
savedViewId: string;
dataSource: DataSource; dataSource: DataSource;
reSync: number; reSync: number;
}): { }): {
@ -71,46 +62,20 @@ export function usePreferenceLoader({
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null); const [error, setError] = useState<Error | null>(null);
const { data: viewsData } = useGetAllViews(dataSource);
useEffect((): void => { useEffect((): void => {
async function loadPreferences(): Promise<void> { async function loadPreferences(): Promise<void> {
setLoading(true); setLoading(true);
setError(null); setError(null);
try { try {
if (mode === 'savedView' && savedViewId) { if (dataSource === DataSource.LOGS) {
// we can also switch to the URL options params const { columns, formatting } = await logsPreferencesLoader();
// as we are essentially setting the options in the URL setPreferences({ columns, formatting });
// in ExplorerOptions.tsx#430 (updateOrRestoreSelectColumns) }
// const extraData = viewsData?.data?.data?.find(
// (view) => view.id === savedViewId,
// )?.extraData;
// const parsedExtraData = JSON.parse(extraData || '{}');
// let columns: BaseAutocompleteData[] = [];
// let formatting: FormattingOptions | undefined;
// if (dataSource === DataSource.LOGS) {
// columns = parsedExtraData?.selectColumns || defaultLogsSelectedColumns;
// formatting = {
// maxLines: parsedExtraData?.maxLines ?? 2,
// format: parsedExtraData?.format ?? 'table',
// fontSize: parsedExtraData?.fontSize ?? 'small',
// version: parsedExtraData?.version ?? 1,
// };
// } else if (dataSource === DataSource.TRACES) {
// columns = parsedExtraData?.selectColumns || defaultTraceSelectedColumns;
// }
// setPreferences(savedViewPreferences);
} else {
if (dataSource === DataSource.LOGS) {
const { columns, formatting } = await logsPreferencesLoader();
setPreferences({ columns, formatting });
}
if (dataSource === DataSource.TRACES) { if (dataSource === DataSource.TRACES) {
const { columns } = await tracesPreferencesLoader(); const { columns } = await tracesPreferencesLoader();
setPreferences({ columns }); setPreferences({ columns });
}
} }
} catch (e) { } catch (e) {
setError(e as Error); setError(e as Error);
@ -119,7 +84,7 @@ export function usePreferenceLoader({
} }
} }
loadPreferences(); loadPreferences();
}, [mode, savedViewId, dataSource, reSync, viewsData]); }, [dataSource, reSync]);
return { preferences, loading, error }; return { preferences, loading, error };
} }

View File

@ -1,4 +1,5 @@
import { defaultLogsSelectedColumns } from 'container/OptionsMenu/constants'; import { defaultLogsSelectedColumns } from 'container/OptionsMenu/constants';
import { defaultSelectedColumns as defaultTracesSelectedColumns } from 'container/TracesExplorer/ListView/configs';
import { useGetAllViews } from 'hooks/saveViews/useGetAllViews'; import { useGetAllViews } from 'hooks/saveViews/useGetAllViews';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
@ -24,6 +25,7 @@ export function usePreferenceSync({
updateFormatting: (newFormatting: FormattingOptions) => void; updateFormatting: (newFormatting: FormattingOptions) => void;
} { } {
const { data: viewsData } = useGetAllViews(dataSource); const { data: viewsData } = useGetAllViews(dataSource);
const [ const [
savedViewPreferences, savedViewPreferences,
setSavedViewPreferences, setSavedViewPreferences,
@ -35,6 +37,10 @@ export function usePreferenceSync({
)?.extraData; )?.extraData;
const parsedExtraData = JSON.parse(extraData || '{}'); const parsedExtraData = JSON.parse(extraData || '{}');
console.log('uncaught extraData', {
extraData,
parsedExtraData,
});
let columns: BaseAutocompleteData[] = []; let columns: BaseAutocompleteData[] = [];
let formatting: FormattingOptions | undefined; let formatting: FormattingOptions | undefined;
if (dataSource === DataSource.LOGS) { if (dataSource === DataSource.LOGS) {
@ -46,6 +52,9 @@ export function usePreferenceSync({
version: parsedExtraData?.version ?? 1, version: parsedExtraData?.version ?? 1,
}; };
} }
if (dataSource === DataSource.TRACES) {
columns = parsedExtraData?.selectColumns || defaultTracesSelectedColumns;
}
setSavedViewPreferences({ columns, formatting }); setSavedViewPreferences({ columns, formatting });
}, [viewsData, dataSource, savedViewId, mode]); }, [viewsData, dataSource, savedViewId, mode]);
@ -53,8 +62,6 @@ export function usePreferenceSync({
// and we want to make sure we are always using the latest preferences // and we want to make sure we are always using the latest preferences
const [reSync, setReSync] = useState(0); const [reSync, setReSync] = useState(0);
const { preferences, loading, error } = usePreferenceLoader({ const { preferences, loading, error } = usePreferenceLoader({
mode,
savedViewId: savedViewId || '',
dataSource, dataSource,
reSync, reSync,
}); });

View File

@ -9,7 +9,7 @@ import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteRe
import { DataSource } from 'types/common/queryBuilder'; import { DataSource } from 'types/common/queryBuilder';
import getLogsUpdaterConfig from '../configs/logsUpdaterConfig'; import getLogsUpdaterConfig from '../configs/logsUpdaterConfig';
import tracesUpdater from '../configs/tracesUpdaterConfig'; import getTracesUpdaterConfig from '../configs/tracesUpdaterConfig';
import { FormattingOptions, Preferences } from '../types'; import { FormattingOptions, Preferences } from '../types';
const metricsUpdater = { const metricsUpdater = {
@ -31,7 +31,10 @@ const getUpdaterConfig = (
redirectWithOptionsData, redirectWithOptionsData,
setSavedViewPreferences, setSavedViewPreferences,
), ),
[DataSource.TRACES]: tracesUpdater, [DataSource.TRACES]: getTracesUpdaterConfig(
redirectWithOptionsData,
setSavedViewPreferences,
),
[DataSource.METRICS]: metricsUpdater, [DataSource.METRICS]: metricsUpdater,
}); });

4
yarn.lock Normal file
View File

@ -0,0 +1,4 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1