Files
ohif-viewer/extensions/default/src/utils/promptSaveReport.tsx
T
1d4802c2a3 fix(SR): Added support for spline and live wire SR items. (#5870)
* fix(SR): Added support for spline and live wire SR items.

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Add a script to checkout a worktree for test builds

* fix: Allow download for testing sr validator

* Remove script that wasn't intended to be included

* Bump CS3D version.

* PR comments - simplify code and use single codepath for download

* Allow both download and save buttons for SEG and RTSTRUCT

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>
2026-03-17 08:59:47 -04:00

101 lines
3.2 KiB
TypeScript

import { utils } from '@ohif/core';
import createReportAsync from '../Actions/createReportAsync';
import { createReportDialogPrompt } from '../Panels';
import PROMPT_RESPONSES from './_shared/PROMPT_RESPONSES';
const { filterAnd, filterMeasurementsByStudyUID, filterMeasurementsBySeriesUID } =
utils.MeasurementFilters;
async function promptSaveReport({ servicesManager, commandsManager, extensionManager }, ctx, evt) {
const { measurementService, displaySetService } = servicesManager.services;
const viewportId = evt.viewportId === undefined ? evt.data.viewportId : evt.viewportId;
const isBackupSave = evt.isBackupSave === undefined ? evt.data.isBackupSave : evt.isBackupSave;
const StudyInstanceUID = evt?.data?.StudyInstanceUID || ctx.trackedStudy;
const SeriesInstanceUID = evt?.data?.SeriesInstanceUID;
const { displaySetInstanceUID } = evt.data ?? evt;
const {
trackedSeries,
measurementFilter = filterAnd(
filterMeasurementsByStudyUID(StudyInstanceUID),
filterMeasurementsBySeriesUID(trackedSeries)
),
defaultSaveTitle = 'Create Report',
} = ctx;
let displaySetInstanceUIDs;
const measurementData = measurementService.getMeasurements(measurementFilter);
const predecessorImageId = findPredecessorImageId(measurementData);
try {
const promptResult = await createReportDialogPrompt({
title: defaultSaveTitle,
predecessorImageId,
minSeriesNumber: 3000,
extensionManager,
servicesManager,
enableDownload: true,
});
if (promptResult.action === PROMPT_RESPONSES.CREATE_REPORT) {
const { series, priorSeriesNumber, value: reportName, dataSourceName } = promptResult;
const SeriesDescription = reportName || defaultSaveTitle;
const getReport = async () =>
commandsManager.runCommand(
'storeMeasurements',
{
measurementData,
dataSource: dataSourceName,
additionalFindingTypes: ['ArrowAnnotate'],
options: {
SeriesDescription,
SeriesNumber: 1 + priorSeriesNumber,
predecessorImageId: series,
},
},
'CORNERSTONE_STRUCTURED_REPORT'
);
displaySetInstanceUIDs = await createReportAsync({
servicesManager,
getReport,
});
} else if (promptResult.action === PROMPT_RESPONSES.CANCEL) {
// Do nothing
}
return {
userResponse: promptResult.action,
createdDisplaySetInstanceUIDs: displaySetInstanceUIDs,
StudyInstanceUID,
SeriesInstanceUID,
viewportId,
isBackupSave,
displaySetInstanceUID,
};
} catch (error) {
console.warn('Unable to save report', error);
return null;
}
}
export function findPredecessorImageId(annotations) {
let predecessorImageId;
for (const annotation of annotations) {
if (
predecessorImageId &&
annotation.predecessorImageId &&
annotation.predecessorImageId !== predecessorImageId
) {
console.warn('Found multiple source predecessors, not defaulting to same series');
return;
}
predecessorImageId ||= annotation.predecessorImageId;
}
return predecessorImageId;
}
export default promptSaveReport;