ohif-viewer/platform/core/src/utils/createStudyBrowserTabs.ts

103 lines
3.0 KiB
TypeScript

import { useSystem } from '../contextProviders/SystemProvider';
/**
*
* @param {string[]} primaryStudyInstanceUIDs
* @param {object[]} studyDisplayList
* @param {string} studyDisplayList.studyInstanceUid
* @param {string} studyDisplayList.date
* @param {string} studyDisplayList.description
* @param {string} studyDisplayList.modalities
* @param {number} studyDisplayList.numInstances
* @param {object[]} displaySets
* @param {number} recentTimeframe - The number of milliseconds to consider a study recent
* @returns tabs - The prop object expected by the StudyBrowser component
*/
export function createStudyBrowserTabs(
primaryStudyInstanceUIDs,
studyDisplayList,
displaySets,
recentTimeframeMS = 31536000000
) {
const { servicesManager } = useSystem();
const { displaySetService } = servicesManager.services;
const shouldSortBySeriesUID = process.env.TEST_ENV === 'true';
const primaryStudies = [];
const allStudies = [];
studyDisplayList.forEach(study => {
const displaySetsForStudy = displaySets.filter(
ds => ds.StudyInstanceUID === study.studyInstanceUid
);
// sort them by seriesInstanceUID
let sortedDisplaySets;
if (shouldSortBySeriesUID) {
sortedDisplaySets = displaySetsForStudy.sort((a, b) => {
const displaySetA = displaySetService.getDisplaySetByUID(a.displaySetInstanceUID);
const displaySetB = displaySetService.getDisplaySetByUID(b.displaySetInstanceUID);
return displaySetA.SeriesInstanceUID.localeCompare(displaySetB.SeriesInstanceUID);
});
} else {
sortedDisplaySets = displaySetsForStudy;
}
const tabStudy = Object.assign({}, study, {
displaySets: sortedDisplaySets,
});
if (primaryStudyInstanceUIDs.includes(study.studyInstanceUid)) {
primaryStudies.push(tabStudy);
}
allStudies.push(tabStudy);
});
const primaryStudiesTimestamps = primaryStudies
.filter(study => study.date)
.map(study => new Date(study.date).getTime());
const recentStudies =
primaryStudiesTimestamps.length > 0
? allStudies.filter(study => {
const oldestPrimaryTimeStamp = Math.min(...primaryStudiesTimestamps);
if (!study.date) {
return false;
}
const studyTimeStamp = new Date(study.date).getTime();
return oldestPrimaryTimeStamp - studyTimeStamp < recentTimeframeMS;
})
: [];
// Newest first
const _byDate = (a, b) => {
const dateA = Date.parse(a);
const dateB = Date.parse(b);
return dateB - dateA;
};
const tabs = [
{
name: 'primary',
label: 'Primary',
studies: primaryStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),
},
{
name: 'recent',
label: 'Recent',
studies: recentStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),
},
{
name: 'all',
label: 'All',
studies: allStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),
},
];
return tabs;
}