feat: Start using group filtering to define measurements table layout (#4501)

This commit is contained in:
Bill Wallace authored and GitHub committed 2025-01-09 22:01:42 -05:00
1 parent bc73de9710
commit 82440e88d5
16 files changed
+357 -210

No files matched your search

@@ -1,20 +1,12 @@
import React, { useEffect, useState } from 'react';
import { PanelMeasurement } from '@ohif/extension-cornerstone';
import { useViewportGrid } from '@ohif/ui-next';
import { StudySummary } from '@ohif/ui-next';
import { Button, Icons } from '@ohif/ui-next';
import { DicomMetadataStore, utils } from '@ohif/core';
import { useViewportGrid } from '@ohif/ui-next';
import { Button, Icons } from '@ohif/ui-next';
import { PanelMeasurement, StudySummaryFromMetadata } from '@ohif/extension-cornerstone';
import { useTrackedMeasurements } from '../getContextModule';
import { useTranslation } from 'react-i18next';
const { downloadCSVReport, formatDate } = utils;
const DISPLAY_STUDY_SUMMARY_INITIAL_VALUE = {
key: undefined, //
date: '', // '07-Sep-2010',
modality: '', // 'CT',
description: '', // 'CHEST/ABD/PELVIS W CONTRAST',
};
const { filterAnd, filterPlanarMeasurement, filterAny, filterMeasurementsBySeriesUID } =
utils.MeasurementFilters;
function PanelMeasurementTableTracking({
servicesManager,
@@ -22,52 +14,12 @@ function PanelMeasurementTableTracking({
commandsManager,
}: withAppTypes) {
const [viewportGrid] = useViewportGrid();
const { t } = useTranslation('MeasurementTable');
const { measurementService, customizationService } = servicesManager.services;
const { customizationService } = servicesManager.services;
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();
const { trackedStudy, trackedSeries } = trackedMeasurements.context;
const [displayStudySummary, setDisplayStudySummary] = useState(
DISPLAY_STUDY_SUMMARY_INITIAL_VALUE
);
useEffect(() => {
const updateDisplayStudySummary = async () => {
if (trackedMeasurements.matches('tracking') && trackedStudy) {
const studyMeta = DicomMetadataStore.getStudy(trackedStudy);
if (!studyMeta || !studyMeta.series || studyMeta.series.length === 0) {
console.debug('Study metadata not available');
return;
}
const instanceMeta = studyMeta.series[0].instances[0];
const { StudyDate, StudyDescription } = instanceMeta;
const modalities = new Set();
studyMeta.series.forEach(series => {
if (trackedSeries.includes(series.SeriesInstanceUID)) {
modalities.add(series.instances[0].Modality);
}
});
const modality = Array.from(modalities).join('/');
setDisplayStudySummary(prevSummary => {
if (prevSummary.key !== trackedStudy) {
return {
key: trackedStudy,
date: StudyDate,
modality,
description: StudyDescription,
};
}
return prevSummary;
});
} else if (!trackedStudy) {
setDisplayStudySummary(DISPLAY_STUDY_SUMMARY_INITIAL_VALUE);
}
};
updateDisplayStudySummary();
}, [trackedMeasurements, trackedStudy, trackedSeries]);
const measurementFilter = trackedStudy
? filterAnd(filterPlanarMeasurement, filterMeasurementsBySeriesUID(trackedSeries))
: filterPlanarMeasurement;
const { disableEditing } = customizationService.getCustomization(
'PanelMeasurement.disableEditing',
@@ -79,20 +31,12 @@ function PanelMeasurementTableTracking({
return (
<>
{displayStudySummary.key && (
<StudySummary
date={formatDate(displayStudySummary.date)}
description={displayStudySummary.description}
/>
)}
<StudySummaryFromMetadata StudyInstanceUID={trackedStudy} />
<PanelMeasurement
servicesManager={servicesManager}
extensionManager={extensionManager}
commandsManager={commandsManager}
measurementFilter={measurement =>
trackedStudy === measurement.referenceStudyUID &&
trackedSeries.includes(measurement.referenceSeriesUID)
}
measurementFilter={measurementFilter}
customHeader={({ additionalFindings, measurements }) => {
const disabled = additionalFindings.length === 0 && measurements.length === 0;
@@ -108,14 +52,9 @@ function PanelMeasurementTableTracking({
variant="ghost"
className="pl-1.5"
onClick={() => {
const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter(
m =>
trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID)
);
downloadCSVReport(trackedMeasurements);
commandsManager.runCommand('downloadCSVMeasurementsReport', {
measurementFilter,
});
}}
>
<Icons.Download className="h-5 w-5" />
@@ -140,7 +79,7 @@ function PanelMeasurementTableTracking({
variant="ghost"
className="pl-0.5"
onClick={() => {
measurementService.clearMeasurements();
commandsManager.runCommand('clearMeasurements', { measurementFilter });
}}
>
<Icons.Delete />