Merge pull request #1053 from buster-so/big-nate-bus-1857-add-report-id-to-the-get-metric-stuff

Update query request for get data
This commit is contained in:
Nate Kelley 2025-09-22 22:14:48 -06:00 committed by GitHub
commit 9ee6013bef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 44 additions and 52 deletions

View File

@ -143,11 +143,11 @@ export const useGetMetricData = <TData = BusterMetricDataExtended>(
{ {
id = '', id = '',
versionNumber: versionNumberProp, versionNumber: versionNumberProp,
reportFileId, cacheDataId,
}: { }: {
id: string | undefined; id: string | undefined;
versionNumber?: number | 'LATEST'; versionNumber?: number | 'LATEST';
reportFileId?: string; cacheDataId?: string;
}, },
params?: Omit<UseQueryOptions<BusterMetricData, RustApiError, TData>, 'queryKey' | 'queryFn'> params?: Omit<UseQueryOptions<BusterMetricData, RustApiError, TData>, 'queryKey' | 'queryFn'>
) => { ) => {
@ -172,7 +172,7 @@ export const useGetMetricData = <TData = BusterMetricDataExtended>(
id, id,
version_number: chosenVersionNumber || undefined, version_number: chosenVersionNumber || undefined,
password, password,
report_file_id: reportFileId, report_file_id: cacheDataId,
}); });
const latestVersionNumber = getLatestMetricVersion(id); const latestVersionNumber = getLatestMetricVersion(id);
const isLatest = const isLatest =

View File

@ -26,9 +26,19 @@ export const metricsGetList = (
initialDataUpdatedAt: 0, initialDataUpdatedAt: 0,
}); });
export const metricsGetData = (id: string, version_number: number | 'LATEST') => export const metricsGetData = (
id: string,
version_number: number | 'LATEST',
cacheDataId?: string
) =>
queryOptions<BusterMetricDataExtended>({ queryOptions<BusterMetricDataExtended>({
queryKey: ['metrics', 'data', id, version_number || 'LATEST'] as const, queryKey: [
'metrics',
'data',
id,
version_number || 'LATEST',
cacheDataId || 'live-data',
] as const,
staleTime: 1000 * 60 * 30, // 30 minutes, staleTime: 1000 * 60 * 30, // 30 minutes,
}); });

View File

@ -24,6 +24,7 @@ export type MetricChartCardProps = {
animate?: boolean; animate?: boolean;
renderChartContent?: boolean; // we do this to avoid expensive rendering if off screen renderChartContent?: boolean; // we do this to avoid expensive rendering if off screen
disableTooltip?: boolean; disableTooltip?: boolean;
cacheDataId?: string;
}; };
const stableMetricSelect = ({ const stableMetricSelect = ({
@ -60,6 +61,7 @@ export const MetricChartCard = React.memo(
animate = true, animate = true,
renderChartContent = true, renderChartContent = true,
disableTooltip, disableTooltip,
cacheDataId,
}, },
ref ref
) => { ) => {
@ -71,7 +73,7 @@ export const MetricChartCard = React.memo(
data: metricData, data: metricData,
isFetched: isFetchedMetricData, isFetched: isFetchedMetricData,
error: metricDataError, error: metricDataError,
} = useGetMetricData({ id: metricId, versionNumber }); } = useGetMetricData({ id: metricId, versionNumber, cacheDataId });
//data config //data config
const loadingData = !isFetchedMetricData; const loadingData = !isFetchedMetricData;

View File

@ -21,11 +21,13 @@ import {
export const ReportMetricThreeDotMenu = ({ export const ReportMetricThreeDotMenu = ({
metricId, metricId,
metricVersionNumber, metricVersionNumber,
reportId,
}: { }: {
metricId: string; metricId: string;
metricVersionNumber: number | undefined; metricVersionNumber: number | undefined;
reportId: string;
}) => { }) => {
const items = useReportMetricThreeDotMenu({ metricId, metricVersionNumber }); const items = useReportMetricThreeDotMenu({ metricId, metricVersionNumber, reportId });
return <MetricHeaderSecondaryWrapperDropdown dropdownItems={items} />; return <MetricHeaderSecondaryWrapperDropdown dropdownItems={items} />;
}; };
@ -33,9 +35,11 @@ export const ReportMetricThreeDotMenu = ({
const useReportMetricThreeDotMenu = ({ const useReportMetricThreeDotMenu = ({
metricId, metricId,
metricVersionNumber, metricVersionNumber,
reportId,
}: { }: {
metricId: string; metricId: string;
metricVersionNumber: number | undefined; metricVersionNumber: number | undefined;
reportId: string;
}): IDropdownItems => { }): IDropdownItems => {
const editor = useEditorRef(); const editor = useEditorRef();
const element = useElement(); const element = useElement();
@ -52,7 +56,11 @@ const useReportMetricThreeDotMenu = ({
metricId, metricId,
metricVersionNumber, metricVersionNumber,
}); });
const downloadCSV = useDownloadMetricDataCSV({ metricId, metricVersionNumber }); const downloadCSV = useDownloadMetricDataCSV({
metricId,
metricVersionNumber,
cacheDataId: reportId,
});
const downloadPNG = useDownloadPNGSelectMenu({ metricId, metricVersionNumber }); const downloadPNG = useDownloadPNGSelectMenu({ metricId, metricVersionNumber });
const renameMetric = useRenameMetricOnPage({ const renameMetric = useRenameMetricOnPage({
metricId, metricId,

View File

@ -159,16 +159,21 @@ export const useRenameMetricOnPage = ({
export const useDownloadMetricDataCSV = ({ export const useDownloadMetricDataCSV = ({
metricId, metricId,
metricVersionNumber, metricVersionNumber,
cacheDataId,
}: { }: {
metricId: string; metricId: string;
metricVersionNumber: number | undefined; metricVersionNumber: number | undefined;
cacheDataId?: string;
}) => { }) => {
const [isDownloading, setIsDownloading] = useState(false); const [isDownloading, setIsDownloading] = useState(false);
const { data: metricData } = useGetMetricData( const { data: metricData } = useGetMetricData(
{ id: metricId, versionNumber: metricVersionNumber }, { id: metricId, versionNumber: metricVersionNumber, cacheDataId },
{ enabled: false } { enabled: false }
); );
const { data: name } = useGetMetric({ id: metricId }, { select: (x) => x.name }); const { data: name } = useGetMetric(
{ id: metricId },
{ select: useCallback((x: BusterMetric) => x.name, []) }
);
return useMemo( return useMemo(
() => ({ () => ({

View File

@ -1,27 +1,31 @@
import React, { useRef } from 'react'; import React, { useRef } from 'react';
import { MetricChartCard } from '@/components/features/metrics/MetricChartCard'; import { MetricChartCard } from '@/components/features/metrics/MetricChartCard';
import { ReportMetricThreeDotMenu } from '@/components/features/metrics/ReportMetricItem'; import { ReportMetricThreeDotMenu } from '@/components/features/metrics/ReportMetricItem';
import { useGetReportParams } from '@/context/Reports/useGetReportParams';
import { useInViewport } from '@/hooks/useInViewport'; import { useInViewport } from '@/hooks/useInViewport';
export const MetricContent = React.memo( export const MetricContent = React.memo(
({ ({
metricId, metricId,
metricVersionNumber, metricVersionNumber,
isExportMode = false, isExportMode = false,
readOnly = false, readOnly = false,
className, className,
}: { }: {
metricId: string; metricId: string;
metricVersionNumber: number | undefined; metricVersionNumber: number | undefined;
readOnly?: boolean; readOnly?: boolean;
isExportMode?: boolean; isExportMode?: boolean;
className?: string; className?: string;
}) => { }) => {
const { reportId = '' } = useGetReportParams();
const ref = useRef<HTMLDivElement>(null); const ref = useRef<HTMLDivElement>(null);
const hasBeenInViewport = useRef(false); const hasBeenInViewport = useRef(false);
const [inViewport] = useInViewport(ref, { const [inViewport] = useInViewport(ref, {
threshold: 0.25, threshold: 0.275,
}); });
if (inViewport && !hasBeenInViewport.current) { if (inViewport && !hasBeenInViewport.current) {
hasBeenInViewport.current = true; hasBeenInViewport.current = true;
@ -38,11 +42,13 @@ export const MetricContent = React.memo(
renderChartContent={renderChart} renderChartContent={renderChart}
animate={!isExportMode} animate={!isExportMode}
className={className} className={className}
cacheDataId={reportId}
headerSecondaryContent={ headerSecondaryContent={
!readOnly && ( !readOnly && (
<ReportMetricThreeDotMenu <ReportMetricThreeDotMenu
metricId={metricId} metricId={metricId}
metricVersionNumber={metricVersionNumber} metricVersionNumber={metricVersionNumber}
reportId={reportId}
/> />
) )
} }

View File

@ -1,39 +0,0 @@
import {
SlateElement,
type SlateElementProps,
type TCaptionProps,
type TResizableProps,
} from 'platejs';
import type { TMetricElement } from '../../plugins/metric-kit';
import { MetricContent } from './MetricContent';
import { MetricEmbedPlaceholder } from './MetricPlaceholder';
export const MetricElementStatic = (
props: SlateElementProps<TMetricElement & TCaptionProps & TResizableProps>
) => {
const metricId = props.element.metricId;
const metricVersionNumber = props.element.metricVersionNumber;
const readOnly = true;
const { align = 'center', caption, url, width } = props.element;
const content = metricId ? (
<MetricContent
metricId={metricId}
metricVersionNumber={metricVersionNumber}
readOnly={readOnly}
/>
) : (
<MetricEmbedPlaceholder />
);
return (
<SlateElement {...props} className="mt-2.5 mb-4.5">
<figure className="relative m-0 inline-block" style={{ width }}>
<div className="relative max-w-full min-w-[92px]" style={{ textAlign: align }}>
{content}
</div>
<div className="h-0">{props.children}</div>
</figure>
</SlateElement>
);
};

View File

@ -37,11 +37,11 @@ export function SlashInputElement(props: PlateElementProps<TSlashInputElement>)
<InlineCombobox <InlineCombobox
element={element} element={element}
trigger="/" trigger="/"
className="bg-item-select relative rounded pl-2 pr-1.5 mr-1 overflow-hidden w-fit flex items-center" className="bg-item-select relative rounded pl-2 pr-1.5 mr-1 overflow-hidden w-fit flex items-center text-gray-dark"
> >
<InlineComboboxInput <InlineComboboxInput
placeholder={placeholder} placeholder={placeholder}
className="bg-item-select text-gray-light ml-1 rounded-r" className="bg-item-select text-gray-light ml-0.5 rounded-r"
/> />
<InlineComboboxContent> <InlineComboboxContent>