* 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>
101 lines
3.2 KiB
TypeScript
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;
|