feat(MED-105): update analysis results view to be by analysis order

This commit is contained in:
2025-08-14 12:10:12 +03:00
parent d3b393156a
commit 1285b02f9c
11 changed files with 140 additions and 59 deletions

View File

@@ -11,10 +11,11 @@ import { loadUserAnalysis } from '../../_lib/server/load-user-analysis';
import Analysis from './_components/analysis';
import pathsConfig from '~/config/paths.config';
import { redirect } from 'next/navigation';
import { getAnalysisOrders } from '~/lib/services/order.service';
import { AnalysisOrder, getAnalysisOrders } from '~/lib/services/order.service';
import { getAnalysisElements } from '~/lib/services/analysis-element.service';
import { loadCurrentUserAccount } from '@/app/home/(user)/_lib/server/load-user-account';
import { createPageViewLog } from '~/lib/services/audit/pageView.service';
import { ButtonTooltip } from '~/components/ui/button-tooltip';
export const generateMetadata = async () => {
const i18n = await createI18nServerInstance();
@@ -45,25 +46,15 @@ async function AnalysisResultsPage() {
action: 'VIEW_ANALYSIS_RESULTS',
});
const analysisElementIds = [
const getAnalysisElementIds = (analysisOrders: AnalysisOrder[]) => [
...new Set(analysisOrders?.flatMap((order) => order.analysis_element_ids).filter(Boolean) as number[]),
];
const analysisElements = await getAnalysisElements({ ids: analysisElementIds });
const analysisElementsWithResults = analysisResponseElements
?.sort((a, b) => {
if (!a.response_time || !b.response_time) {
return 0;
}
return new Date(b.response_time).getTime() - new Date(a.response_time).getTime();
})
.map((results) => ({ results })) ?? [];
const analysisElementsWithoutResults = analysisElements
.filter((element) => !analysisElementsWithResults?.some(({ results }) => results.analysis_element_original_id === element.analysis_id_original));
const hasNoAnalysisElements = analysisElementsWithResults.length === 0 && analysisElementsWithoutResults.length === 0;
const analysisElementIds = getAnalysisElementIds(analysisOrders);
const analysisElements = await getAnalysisElements({ ids: analysisElementIds });
return (
<PageBody>
<PageBody className="gap-4">
<div className="mt-8 flex flex-col sm:flex-row sm:items-center justify-between gap-4 sm:gap-0">
<div>
<h4>
@@ -83,22 +74,44 @@ async function AnalysisResultsPage() {
</Link>
</Button>
</div>
<div className="flex flex-col gap-2">
{analysisElementsWithResults.map(({ results }) => {
const analysisElement = analysisElements.find((element) => element.analysis_id_original === results.analysis_element_original_id);
if (!analysisElement) {
return null;
}
<div className="flex flex-col gap-8">
{analysisOrders.length > 0 && analysisElements.length > 0 ? analysisOrders.map((analysisOrder) => {
const analysisElementIds = getAnalysisElementIds([analysisOrder]);
const analysisElementsForOrder = analysisElements.filter((element) => analysisElementIds.includes(element.id));
return (
<Analysis key={results.id} analysisElement={analysisElement} results={results} />
<div key={analysisOrder.id} className="flex flex-col gap-4">
<h4>
<Trans i18nKey="analysis-results:orderTitle" values={{ orderNumber: analysisOrder.medusa_order_id }} />
</h4>
<h5>
<Trans i18nKey={`orders:status.${analysisOrder.status}`} />
<ButtonTooltip
content={`${new Date(analysisOrder.created_at).toLocaleString()}`}
className="ml-6"
/>
</h5>
<div className="flex flex-col gap-2">
{analysisElementsForOrder.length > 0 ? analysisElementsForOrder.map((analysisElement) => {
const results = analysisResponseElements?.find((element) => element.analysis_element_original_id === analysisElement.analysis_id_original);
if (!results) {
return (
<Analysis key={`${analysisOrder.id}-${analysisElement.id}`} analysisElement={analysisElement} />
);
}
return (
<Analysis key={`${analysisOrder.id}-${analysisElement.id}`} analysisElement={analysisElement} results={results} />
);
}) : (
<div className="text-muted-foreground text-sm">
<Trans i18nKey="analysis-results:noAnalysisElements" />
</div>
)}
</div>
</div>
);
})}
{analysisElementsWithoutResults.map((element) => (
<Analysis key={element.analysis_id_original} analysisElement={element} />
))}
{hasNoAnalysisElements && (
}) : (
<div className="text-muted-foreground text-sm">
<Trans i18nKey="analysis-results:noAnalysisElements" />
<Trans i18nKey="analysis-results:noAnalysisOrders" />
</div>
)}
</div>