mirror of https://github.com/buster-so/buster.git
Merge remote-tracking branch 'origin/staging' into staging
This commit is contained in:
commit
69a05f0d0f
|
@ -1,22 +1,16 @@
|
|||
import type { GetDashboardResponse } from '@buster/server-shared/dashboards';
|
||||
import { type QueryClient, useQueryClient } from '@tanstack/react-query';
|
||||
import last from 'lodash/last';
|
||||
import { dashboardQueryKeys } from '@/api/query_keys/dashboard';
|
||||
import { metricsQueryKeys } from '@/api/query_keys/metric';
|
||||
import { useBusterNotifications } from '@/context/BusterNotifications';
|
||||
import { setOriginalDashboard } from '@/context/Dashboards/useOriginalDashboardStore';
|
||||
import { setOriginalMetric } from '@/context/Metrics/useOriginalMetricStore';
|
||||
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
|
||||
import { upgradeMetricToIMetric } from '@/lib/metrics/upgradeToIMetric';
|
||||
import { prefetchGetMetricDataClient } from '../metrics/queryRequests';
|
||||
import { initializeMetrics } from '../metrics/metricQueryHelpers';
|
||||
import { getDashboardById } from './requests';
|
||||
|
||||
export const useEnsureDashboardConfig = (params?: { prefetchData?: boolean }) => {
|
||||
const { prefetchData = true } = params || {};
|
||||
const queryClient = useQueryClient();
|
||||
const prefetchDashboard = useGetDashboardAndInitializeMetrics({
|
||||
prefetchData,
|
||||
});
|
||||
|
||||
const { openErrorMessage } = useBusterNotifications();
|
||||
|
||||
const method = useMemoizedFn(
|
||||
|
@ -24,11 +18,13 @@ export const useEnsureDashboardConfig = (params?: { prefetchData?: boolean }) =>
|
|||
const options = dashboardQueryKeys.dashboardGetDashboard(dashboardId, 'LATEST');
|
||||
let dashboardResponse = queryClient.getQueryData(options.queryKey);
|
||||
if (!dashboardResponse) {
|
||||
const res = await prefetchDashboard({
|
||||
const res = await getDashboardAndInitializeMetrics({
|
||||
id: dashboardId,
|
||||
version_number: 'LATEST',
|
||||
shouldInitializeMetrics: initializeMetrics,
|
||||
password,
|
||||
queryClient,
|
||||
shouldInitializeMetrics: initializeMetrics,
|
||||
prefetchMetricsData: prefetchData,
|
||||
}).catch(() => {
|
||||
openErrorMessage('Failed to save metrics to dashboard. Dashboard not found');
|
||||
});
|
||||
|
@ -48,63 +44,6 @@ export const useEnsureDashboardConfig = (params?: { prefetchData?: boolean }) =>
|
|||
return method;
|
||||
};
|
||||
|
||||
export const initializeMetrics = (
|
||||
metrics: GetDashboardResponse['metrics'],
|
||||
queryClient: QueryClient,
|
||||
prefetchData: boolean
|
||||
) => {
|
||||
for (const metric of Object.values(metrics)) {
|
||||
const upgradedMetric = upgradeMetricToIMetric(metric, null);
|
||||
queryClient.setQueryData(
|
||||
metricsQueryKeys.metricsGetMetric(metric.id, metric.version_number).queryKey,
|
||||
upgradedMetric
|
||||
);
|
||||
const isLatestVersion = metric.version_number === last(metric.versions)?.version_number;
|
||||
if (isLatestVersion) {
|
||||
setOriginalMetric(upgradedMetric);
|
||||
queryClient.setQueryData(
|
||||
metricsQueryKeys.metricsGetMetric(metric.id, 'LATEST').queryKey,
|
||||
upgradedMetric
|
||||
);
|
||||
}
|
||||
if (prefetchData) {
|
||||
prefetchGetMetricDataClient(
|
||||
{ id: metric.id, version_number: metric.version_number },
|
||||
queryClient
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const useGetDashboardAndInitializeMetrics = (params?: { prefetchData?: boolean }) => {
|
||||
const { prefetchData = true } = params || {};
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMemoizedFn(
|
||||
async ({
|
||||
id,
|
||||
version_number,
|
||||
shouldInitializeMetrics = true,
|
||||
password,
|
||||
}: {
|
||||
id: string;
|
||||
version_number: number | 'LATEST';
|
||||
shouldInitializeMetrics?: boolean;
|
||||
password: string | undefined;
|
||||
}) => {
|
||||
return getDashboardAndInitializeMetrics({
|
||||
id,
|
||||
version_number,
|
||||
password,
|
||||
queryClient,
|
||||
shouldInitializeMetrics,
|
||||
prefetchMetricsData: prefetchData,
|
||||
});
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
//Can use this in server side
|
||||
export const getDashboardAndInitializeMetrics = async ({
|
||||
id,
|
||||
version_number,
|
||||
|
|
|
@ -3,7 +3,7 @@ import { useNavigate } from '@tanstack/react-router';
|
|||
import last from 'lodash/last';
|
||||
import { dashboardQueryKeys } from '@/api/query_keys/dashboard';
|
||||
import { setOriginalDashboard } from '@/context/Dashboards/useOriginalDashboardStore';
|
||||
import { initializeMetrics } from '../dashboardQueryHelpers';
|
||||
import { initializeMetrics } from '../../metrics/metricQueryHelpers';
|
||||
import { dashboardsUpdateDashboard } from '../requests';
|
||||
|
||||
/**
|
||||
|
|
|
@ -15,10 +15,7 @@ import {
|
|||
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
|
||||
import { isQueryStale } from '@/lib/query';
|
||||
import { hasOrganizationId } from '../../users/userQueryHelpers';
|
||||
import {
|
||||
getDashboardAndInitializeMetrics,
|
||||
useGetDashboardAndInitializeMetrics,
|
||||
} from '../dashboardQueryHelpers';
|
||||
import { getDashboardAndInitializeMetrics } from '../dashboardQueryHelpers';
|
||||
import { useGetDashboardVersionNumber } from '../dashboardVersionNumber';
|
||||
import { dashboardsGetList } from '../requests';
|
||||
|
||||
|
@ -36,14 +33,22 @@ export const useGetDashboard = <TData = GetDashboardResponse>(
|
|||
) => {
|
||||
const id = idProp || '';
|
||||
const password = useProtectedAssetPassword(id);
|
||||
const queryFn = useGetDashboardAndInitializeMetrics();
|
||||
const queryClient = useQueryClient();
|
||||
// const queryFn = useGetDashboardAndInitializeMetrics();
|
||||
|
||||
const { selectedVersionNumber } = useGetDashboardVersionNumber(id, versionNumberProp);
|
||||
|
||||
const { isFetched: isFetchedInitial, isError: isErrorInitial } = useQuery({
|
||||
...dashboardQueryKeys.dashboardGetDashboard(id, 'LATEST'),
|
||||
queryFn: () =>
|
||||
queryFn({ id, version_number: 'LATEST', shouldInitializeMetrics: true, password }),
|
||||
getDashboardAndInitializeMetrics({
|
||||
id,
|
||||
version_number: 'LATEST',
|
||||
password,
|
||||
queryClient,
|
||||
shouldInitializeMetrics: true,
|
||||
prefetchMetricsData: true,
|
||||
}),
|
||||
enabled: true,
|
||||
retry(_failureCount, error) {
|
||||
if (error?.message !== undefined) {
|
||||
|
@ -61,11 +66,13 @@ export const useGetDashboard = <TData = GetDashboardResponse>(
|
|||
return useQuery({
|
||||
...dashboardQueryKeys.dashboardGetDashboard(id, selectedVersionNumber),
|
||||
queryFn: () =>
|
||||
queryFn({
|
||||
getDashboardAndInitializeMetrics({
|
||||
id,
|
||||
version_number: selectedVersionNumber,
|
||||
shouldInitializeMetrics: true,
|
||||
password,
|
||||
queryClient,
|
||||
shouldInitializeMetrics: true,
|
||||
prefetchMetricsData: true,
|
||||
}),
|
||||
enabled: isFetchedInitial && !isErrorInitial,
|
||||
select: params?.select,
|
||||
|
@ -80,7 +87,6 @@ export const usePrefetchGetDashboardClient = <TData = GetDashboardResponse>(
|
|||
params?: Omit<UseQueryOptions<GetDashboardResponse, ApiError, TData>, 'queryKey' | 'queryFn'>
|
||||
) => {
|
||||
const queryClient = useQueryClient();
|
||||
const queryFn = useGetDashboardAndInitializeMetrics({ prefetchData: false });
|
||||
|
||||
return useMemoizedFn((id: string, versionNumber: number | 'LATEST') => {
|
||||
const getDashboardQueryKey = dashboardQueryKeys.dashboardGetDashboard(id, versionNumber);
|
||||
|
@ -89,11 +95,13 @@ export const usePrefetchGetDashboardClient = <TData = GetDashboardResponse>(
|
|||
return queryClient.prefetchQuery({
|
||||
...dashboardQueryKeys.dashboardGetDashboard(id, versionNumber),
|
||||
queryFn: () =>
|
||||
queryFn({
|
||||
getDashboardAndInitializeMetrics({
|
||||
id,
|
||||
version_number: versionNumber,
|
||||
shouldInitializeMetrics: true,
|
||||
version_number: 'LATEST',
|
||||
password: undefined,
|
||||
queryClient,
|
||||
shouldInitializeMetrics: true,
|
||||
prefetchMetricsData: false,
|
||||
}),
|
||||
...params,
|
||||
});
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import type { GetDashboardResponse } from '@buster/server-shared/dashboards';
|
||||
import type { GetReportResponse } from '@buster/server-shared/reports';
|
||||
import { type QueryClient, useQueryClient } from '@tanstack/react-query';
|
||||
import last from 'lodash/last';
|
||||
import { setOriginalMetric } from '@/context/Metrics/useOriginalMetricStore';
|
||||
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
|
||||
import { upgradeMetricToIMetric } from '@/lib/metrics/upgradeToIMetric';
|
||||
import type { BusterMetricDataExtended } from '../../asset_interfaces/metric';
|
||||
import type { BusterMetric } from '../../asset_interfaces/metric/interfaces';
|
||||
import { metricsQueryKeys } from '../../query_keys/metric';
|
||||
import { prefetchGetMetricDataClient } from './getMetricQueryRequests';
|
||||
|
||||
export const useGetMetricMemoized = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
@ -37,3 +43,31 @@ export const useGetMetricDataMemoized = () => {
|
|||
);
|
||||
return getMetricDataMemoized;
|
||||
};
|
||||
|
||||
export const initializeMetrics = (
|
||||
metrics: GetDashboardResponse['metrics'] | GetReportResponse['metrics'],
|
||||
queryClient: QueryClient,
|
||||
prefetchData: boolean
|
||||
) => {
|
||||
for (const metric of Object.values(metrics)) {
|
||||
const upgradedMetric = upgradeMetricToIMetric(metric, null);
|
||||
queryClient.setQueryData(
|
||||
metricsQueryKeys.metricsGetMetric(metric.id, metric.version_number).queryKey,
|
||||
upgradedMetric
|
||||
);
|
||||
const isLatestVersion = metric.version_number === last(metric.versions)?.version_number;
|
||||
if (isLatestVersion) {
|
||||
setOriginalMetric(upgradedMetric);
|
||||
queryClient.setQueryData(
|
||||
metricsQueryKeys.metricsGetMetric(metric.id, 'LATEST').queryKey,
|
||||
upgradedMetric
|
||||
);
|
||||
}
|
||||
if (prefetchData) {
|
||||
prefetchGetMetricDataClient(
|
||||
{ id: metric.id, version_number: metric.version_number },
|
||||
queryClient
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -17,7 +17,8 @@ import {
|
|||
useRemoveAssetFromCollection,
|
||||
} from '../collections/queryRequests';
|
||||
import { useGetUserFavorites } from '../users/favorites';
|
||||
import { getReportById, getReportsList, updateReport } from './requests';
|
||||
import { getReportAndInitializeMetrics } from './reportQueryHelpers';
|
||||
import { getReportsList, updateReport } from './requests';
|
||||
|
||||
/**
|
||||
* Hook to get a list of reports
|
||||
|
@ -80,9 +81,13 @@ export const prefetchGetReport = async (
|
|||
await queryClient.prefetchQuery({
|
||||
...reportsQueryKeys.reportsGetReport(reportId, version_number || 'LATEST'),
|
||||
queryFn: () =>
|
||||
getReportById({
|
||||
getReportAndInitializeMetrics({
|
||||
id: reportId,
|
||||
version_number: typeof version_number === 'number' ? version_number : undefined,
|
||||
password: undefined,
|
||||
queryClient,
|
||||
shouldInitializeMetrics: true,
|
||||
prefetchMetricsData: false,
|
||||
}),
|
||||
retry: silenceAssetErrors,
|
||||
});
|
||||
|
@ -106,17 +111,20 @@ export const useGetReport = <T = GetReportResponse>(
|
|||
options?: Omit<UseQueryOptions<GetReportResponse, ApiError, T>, 'queryKey' | 'queryFn'>
|
||||
) => {
|
||||
const password = useProtectedAssetPassword(id || '');
|
||||
const queryFn = () => {
|
||||
return getReportById({
|
||||
id: id ?? '',
|
||||
version_number: typeof versionNumber === 'number' ? versionNumber : undefined,
|
||||
password,
|
||||
});
|
||||
};
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useQuery({
|
||||
...reportsQueryKeys.reportsGetReport(id ?? '', versionNumber || 'LATEST'),
|
||||
queryFn,
|
||||
queryFn: () => {
|
||||
return getReportAndInitializeMetrics({
|
||||
id: id ?? '',
|
||||
version_number: typeof versionNumber === 'number' ? versionNumber : undefined,
|
||||
password,
|
||||
queryClient,
|
||||
shouldInitializeMetrics: true,
|
||||
prefetchMetricsData: true,
|
||||
});
|
||||
},
|
||||
enabled: !!id,
|
||||
select: options?.select,
|
||||
...options,
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
import type { QueryClient } from '@tanstack/react-query';
|
||||
import last from 'lodash/last';
|
||||
import { reportsQueryKeys } from '@/api/query_keys/reports';
|
||||
import { initializeMetrics } from '../metrics/metricQueryHelpers';
|
||||
import { getReportById } from './requests';
|
||||
|
||||
export const getReportAndInitializeMetrics = async ({
|
||||
id,
|
||||
version_number,
|
||||
password,
|
||||
queryClient,
|
||||
shouldInitializeMetrics = true,
|
||||
prefetchMetricsData = false,
|
||||
}: {
|
||||
id: string;
|
||||
version_number: number | 'LATEST' | undefined;
|
||||
password: string | undefined;
|
||||
queryClient: QueryClient;
|
||||
shouldInitializeMetrics: boolean;
|
||||
prefetchMetricsData: boolean;
|
||||
}) => {
|
||||
const chosenVersionNumber = version_number === 'LATEST' ? undefined : version_number;
|
||||
return getReportById({
|
||||
id,
|
||||
version_number: chosenVersionNumber,
|
||||
password,
|
||||
}).then((data) => {
|
||||
const latestVersion = last(data.versions)?.version_number || 1;
|
||||
const isLatestVersion = data.version_number === latestVersion;
|
||||
|
||||
if (isLatestVersion) {
|
||||
// set the original report?
|
||||
}
|
||||
|
||||
if (data.version_number) {
|
||||
queryClient.setQueryData(
|
||||
reportsQueryKeys.reportsGetReport(data.id, data.version_number).queryKey,
|
||||
data
|
||||
);
|
||||
}
|
||||
|
||||
if (shouldInitializeMetrics || prefetchMetricsData) {
|
||||
initializeMetrics(data.metrics, queryClient, !!prefetchMetricsData);
|
||||
}
|
||||
|
||||
return data;
|
||||
});
|
||||
};
|
Loading…
Reference in New Issue