chore(prettier): full repo linting and code reformatting once and for all (#3627)

This commit is contained in:
Alireza authored and GitHub committed 2023-09-01 16:19:39 -04:00
1 parent 01500a2d4c
commit 9045ddaedc
656 files changed
+21737 -20628

No files matched your search

@@ -2,8 +2,7 @@ const webpack = require('webpack');
const { merge } = require('webpack-merge');
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin;
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const pkg = require('./../package.json');
const webpackCommon = require('./../../../.webpack/webpack.base.js');
@@ -41,13 +40,7 @@ module.exports = (env, argv) => {
libraryTarget: 'umd',
filename: pkg.main,
},
externals: [
/\b(vtk.js)/,
/\b(dcmjs)/,
/\b(gl-matrix)/,
/^@ohif/,
/^@cornerstonejs/,
],
externals: [/\b(vtk.js)/, /\b(dcmjs)/, /\b(gl-matrix)/, /^@ohif/, /^@cornerstonejs/],
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
@@ -16,11 +16,7 @@ async function createReportAsync(
measurements,
options
) {
const {
displaySetService,
uiNotificationService,
uiDialogService,
} = servicesManager.services;
const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services;
const loadingDialogId = uiDialogService.create({
showOverlay: true,
isDraggable: false,
@@ -4,7 +4,7 @@ import { ButtonEnums, Dialog, Input } from '@ohif/ui';
import RESPONSE from './PROMPT_RESPONSES';
export default function createReportDialogPrompt(uiDialogService) {
return new Promise(function(resolve, reject) {
return new Promise(function (resolve, reject) {
let dialogId = undefined;
const _handleClose = () => {
@@ -72,7 +72,7 @@ export default function createReportDialogPrompt(uiDialogService) {
label="Enter the report name"
labelClassName="text-white grow leading-[1.2] text-[14px]"
autoFocus
className="bg-black border-primary-main grow"
className="border-primary-main grow bg-black"
type="text"
value={value.label}
onChange={onChangeHandler}
@@ -3,10 +3,7 @@ import PropTypes from 'prop-types';
import { Machine } from 'xstate';
import { useMachine } from '@xstate/react';
import { useViewportGrid } from '@ohif/ui';
import {
machineConfiguration,
defaultOptions,
} from './measurementTrackingMachine';
import { machineConfiguration, defaultOptions } from './measurementTrackingMachine';
import promptBeginTracking from './promptBeginTracking';
import promptTrackNewSeries from './promptTrackNewSeries';
import promptTrackNewStudy from './promptTrackNewStudy';
@@ -19,8 +16,7 @@ const TrackedMeasurementsContext = React.createContext();
TrackedMeasurementsContext.displayName = 'TrackedMeasurementsContext';
const useTrackedMeasurements = () => useContext(TrackedMeasurementsContext);
const SR_SOPCLASSHANDLERID =
'@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr';
const SR_SOPCLASSHANDLERID = '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr';
/**
*
@@ -42,9 +38,7 @@ function TrackedMeasurementsContextProvider(
const { trackedStudy, trackedSeries } = ctx;
const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter(
m =>
trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID)
m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)
);
console.log(
@@ -53,16 +47,11 @@ function TrackedMeasurementsContextProvider(
trackedMeasurements[0]
);
const referencedDisplaySetUID =
trackedMeasurements[0].displaySetInstanceUID;
const referencedDisplaySet = displaySetService.getDisplaySetByUID(
referencedDisplaySetUID
);
const referencedDisplaySetUID = trackedMeasurements[0].displaySetInstanceUID;
const referencedDisplaySet = displaySetService.getDisplaySetByUID(referencedDisplaySetUID);
const referencedImages = referencedDisplaySet.images;
const isVolumeIdReferenced = referencedImages[0].imageId.startsWith(
'volumeId'
);
const isVolumeIdReferenced = referencedImages[0].imageId.startsWith('volumeId');
const measurementData = trackedMeasurements[0].data;
@@ -76,9 +65,7 @@ function TrackedMeasurementsContextProvider(
});
if (imageIndex === -1) {
console.warn(
'Could not find image index for tracked measurement, using 0'
);
console.warn('Could not find image index for tracked measurement, using 0');
imageIndex = 0;
}
}
@@ -167,10 +154,7 @@ function TrackedMeasurementsContextProvider(
// - Fix viewport border resize
// - created/destroyed hooks for extensions (cornerstone measurement subscriptions in it's `init`)
const measurementTrackingMachine = Machine(
machineConfiguration,
machineOptions
);
const measurementTrackingMachine = Machine(machineConfiguration, machineOptions);
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useMachine(
measurementTrackingMachine
@@ -231,12 +215,7 @@ function TrackedMeasurementsContextProvider(
});
}
}
}, [
activeViewportId,
sendTrackedMeasurementsEvent,
servicesManager.services,
viewports,
]);
}, [activeViewportId, sendTrackedMeasurementsEvent, servicesManager.services, viewports]);
return (
<TrackedMeasurementsContext.Provider
@@ -255,8 +234,4 @@ TrackedMeasurementsContextProvider.propTypes = {
appConfig: PropTypes.object,
};
export {
TrackedMeasurementsContext,
TrackedMeasurementsContextProvider,
useTrackedMeasurements,
};
export { TrackedMeasurementsContext, TrackedMeasurementsContextProvider, useTrackedMeasurements };
@@ -1,15 +1,9 @@
import { hydrateStructuredReport as baseHydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr';
function hydrateStructuredReport(
{ servicesManager, extensionManager },
ctx,
evt
) {
function hydrateStructuredReport({ servicesManager, extensionManager }, ctx, evt) {
const { displaySetService } = servicesManager.services;
const { viewportId, displaySetInstanceUID } = evt;
const srDisplaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID
);
const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
return new Promise((resolve, reject) => {
const hydrationResult = baseHydrateStructuredReport(
@@ -183,10 +183,7 @@ const machineConfiguration = {
// - show DICOM SR
{
target: 'idle',
actions: [
'clearAllMeasurements',
'showStructuredReportDisplaySetInActiveViewport',
],
actions: ['clearAllMeasurements', 'showStructuredReportDisplaySetInActiveViewport'],
cond: 'shouldSaveAndContinueWithSameReport',
},
// "starting a new report"
@@ -194,10 +191,7 @@ const machineConfiguration = {
// - start tracking a new study + report
{
target: 'tracking',
actions: [
'discardPreviouslyTrackedMeasurements',
'setTrackedStudyAndSeries',
],
actions: ['discardPreviouslyTrackedMeasurements', 'setTrackedStudyAndSeries'],
cond: 'shouldSaveAndStartNewReport',
},
// Cancel, back to tracking
@@ -279,9 +273,7 @@ const defaultOptions = {
console.warn('jumpToFirstMeasurementInActiveViewport: not implemented');
},
showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {
console.warn(
'showStructuredReportDisplaySetInActiveViewport: not implemented'
);
console.warn('showStructuredReportDisplaySetInActiveViewport: not implemented');
},
clearContext: assign({
trackedStudy: '',
@@ -302,10 +294,8 @@ const defaultOptions = {
ignoredSeries: [],
})),
setTrackedStudyAndMultipleSeries: assign((ctx, evt) => {
const studyInstanceUID =
evt.StudyInstanceUID || evt.data.StudyInstanceUID;
const seriesInstanceUIDs =
evt.SeriesInstanceUIDs || evt.data.SeriesInstanceUIDs;
const studyInstanceUID = evt.StudyInstanceUID || evt.data.StudyInstanceUID;
const seriesInstanceUIDs = evt.SeriesInstanceUIDs || evt.data.SeriesInstanceUIDs;
return {
prevTrackedStudy: ctx.trackedStudy,
@@ -338,12 +328,8 @@ const defaultOptions = {
trackedSeries: [...ctx.trackedSeries, evt.data.SeriesInstanceUID],
})),
removeTrackedSeries: assign((ctx, evt) => ({
prevTrackedSeries: ctx.trackedSeries
.slice()
.filter(ser => ser !== evt.SeriesInstanceUID),
trackedSeries: ctx.trackedSeries
.slice()
.filter(ser => ser !== evt.SeriesInstanceUID),
prevTrackedSeries: ctx.trackedSeries.slice().filter(ser => ser !== evt.SeriesInstanceUID),
trackedSeries: ctx.trackedSeries.slice().filter(ser => ser !== evt.SeriesInstanceUID),
})),
},
guards: {
@@ -367,22 +353,18 @@ const defaultOptions = {
shouldSetDirty: (ctx, evt) => {
return (
// When would this happen?
evt.SeriesInstanceUID === undefined ||
ctx.trackedSeries.includes(evt.SeriesInstanceUID)
evt.SeriesInstanceUID === undefined || ctx.trackedSeries.includes(evt.SeriesInstanceUID)
);
},
shouldKillMachine: (ctx, evt) =>
evt.data && evt.data.userResponse === RESPONSE.NO_NEVER,
shouldAddSeries: (ctx, evt) =>
evt.data && evt.data.userResponse === RESPONSE.ADD_SERIES,
shouldKillMachine: (ctx, evt) => evt.data && evt.data.userResponse === RESPONSE.NO_NEVER,
shouldAddSeries: (ctx, evt) => evt.data && evt.data.userResponse === RESPONSE.ADD_SERIES,
shouldSetStudyAndSeries: (ctx, evt) =>
evt.data && evt.data.userResponse === RESPONSE.SET_STUDY_AND_SERIES,
shouldAddIgnoredSeries: (ctx, evt) =>
evt.data && evt.data.userResponse === RESPONSE.NO_NOT_FOR_SERIES,
shouldPromptSaveReport: (ctx, evt) =>
evt.data && evt.data.userResponse === RESPONSE.CREATE_REPORT,
shouldIgnoreHydrationForSR: (ctx, evt) =>
evt.data && evt.data.userResponse === RESPONSE.CANCEL,
shouldIgnoreHydrationForSR: (ctx, evt) => evt.data && evt.data.userResponse === RESPONSE.CANCEL,
shouldSaveAndContinueWithSameReport: (ctx, evt) =>
evt.data &&
evt.data.userResponse === RESPONSE.CREATE_REPORT &&
@@ -396,8 +378,7 @@ const defaultOptions = {
// Has more than 1, or SeriesInstanceUID is not in list
// --> Post removal would have non-empty trackedSeries array
hasRemainingTrackedSeries: (ctx, evt) =>
ctx.trackedSeries.length > 1 ||
!ctx.trackedSeries.includes(evt.SeriesInstanceUID),
ctx.trackedSeries.length > 1 || !ctx.trackedSeries.includes(evt.SeriesInstanceUID),
hasNotIgnoredSRSeriesForHydration: (ctx, evt) => {
return !ctx.ignoredSRSeriesForHydration.includes(evt.SeriesInstanceUID);
},
@@ -12,11 +12,8 @@ function promptBeginTracking({ servicesManager, extensionManager }, ctx, evt) {
const { uiViewportDialogService } = servicesManager.services;
const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt;
return new Promise(async function(resolve, reject) {
let promptResult = await _askTrackMeasurements(
uiViewportDialogService,
viewportId
);
return new Promise(async function (resolve, reject) {
let promptResult = await _askTrackMeasurements(uiViewportDialogService, viewportId);
resolve({
userResponse: promptResult,
@@ -28,7 +25,7 @@ function promptBeginTracking({ servicesManager, extensionManager }, ctx, evt) {
}
function _askTrackMeasurements(uiViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
return new Promise(function (resolve, reject) {
const message = 'Track measurements for this series?';
const actions = [
{
@@ -11,25 +11,13 @@ const RESPONSE = {
HYDRATE_REPORT: 5,
};
function promptHydrateStructuredReport(
{ servicesManager, extensionManager, appConfig },
ctx,
evt
) {
const {
uiViewportDialogService,
displaySetService,
} = servicesManager.services;
function promptHydrateStructuredReport({ servicesManager, extensionManager, appConfig }, ctx, evt) {
const { uiViewportDialogService, displaySetService } = servicesManager.services;
const { viewportId, displaySetInstanceUID } = evt;
const srDisplaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID
);
const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
return new Promise(async function(resolve, reject) {
const promptResult = await _askTrackMeasurements(
uiViewportDialogService,
viewportId
);
return new Promise(async function (resolve, reject) {
const promptResult = await _askTrackMeasurements(uiViewportDialogService, viewportId);
// Need to do action here... So we can set state...
let StudyInstanceUID, SeriesInstanceUIDs;
@@ -57,9 +45,8 @@ function promptHydrateStructuredReport(
}
function _askTrackMeasurements(uiViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
const message =
'Do you want to continue tracking measurements for this study?';
return new Promise(function (resolve, reject) {
const message = 'Do you want to continue tracking measurements for this study?';
const actions = [
{
type: ButtonEnums.type.secondary,
@@ -3,27 +3,17 @@ import createReportDialogPrompt from '../../_shared/createReportDialogPrompt';
import getNextSRSeriesNumber from '../../_shared/getNextSRSeriesNumber';
import RESPONSE from '../../_shared/PROMPT_RESPONSES';
function promptSaveReport(
{ servicesManager, commandsManager, extensionManager },
ctx,
evt
) {
const {
uiDialogService,
measurementService,
displaySetService,
} = servicesManager.services;
const viewportId =
evt.viewportId === undefined ? evt.data.viewportId : evt.viewportId;
const isBackupSave =
evt.isBackupSave === undefined ? evt.data.isBackupSave : evt.isBackupSave;
function promptSaveReport({ servicesManager, commandsManager, extensionManager }, ctx, evt) {
const { uiDialogService, 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;
const SeriesInstanceUID = evt?.data?.SeriesInstanceUID;
const { trackedStudy, trackedSeries } = ctx;
let displaySetInstanceUIDs;
return new Promise(async function(resolve, reject) {
return new Promise(async function (resolve, reject) {
// TODO: Fallback if (uiDialogService) {
const promptResult = await createReportDialogPrompt(uiDialogService);
@@ -32,9 +22,7 @@ function promptSaveReport(
const dataSource = dataSources[0];
const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter(
m =>
trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID)
m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)
);
const SeriesDescription =
@@ -13,11 +13,8 @@ function promptTrackNewSeries({ servicesManager, extensionManager }, ctx, evt) {
const { UIViewportDialogService } = servicesManager.services;
const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt;
return new Promise(async function(resolve, reject) {
let promptResult = await _askShouldAddMeasurements(
UIViewportDialogService,
viewportId
);
return new Promise(async function (resolve, reject) {
let promptResult = await _askShouldAddMeasurements(UIViewportDialogService, viewportId);
if (promptResult === RESPONSE.CREATE_REPORT) {
promptResult = ctx.isDirty
@@ -36,9 +33,8 @@ function promptTrackNewSeries({ servicesManager, extensionManager }, ctx, evt) {
}
function _askShouldAddMeasurements(uiViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
const message =
'Do you want to add this measurement to the existing report?';
return new Promise(function (resolve, reject) {
const message = 'Do you want to add this measurement to the existing report?';
const actions = [
{
type: ButtonEnums.type.secondary,
@@ -76,7 +72,7 @@ function _askShouldAddMeasurements(uiViewportDialogService, viewportId) {
}
function _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
return new Promise(function (resolve, reject) {
const message =
'You have existing tracked measurements. What would you like to do with your existing tracked measurements?';
const actions = [
@@ -11,11 +11,8 @@ function promptTrackNewStudy({ servicesManager, extensionManager }, ctx, evt) {
const { UIViewportDialogService } = servicesManager.services;
const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt;
return new Promise(async function(resolve, reject) {
let promptResult = await _askTrackMeasurements(
UIViewportDialogService,
viewportId
);
return new Promise(async function (resolve, reject) {
let promptResult = await _askTrackMeasurements(UIViewportDialogService, viewportId);
if (promptResult === RESPONSE.SET_STUDY_AND_SERIES) {
promptResult = ctx.isDirty
@@ -34,7 +31,7 @@ function promptTrackNewStudy({ servicesManager, extensionManager }, ctx, evt) {
}
function _askTrackMeasurements(UIViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
return new Promise(function (resolve, reject) {
const message = 'Track measurements for this series?';
const actions = [
{ type: 'cancel', text: 'No', value: RESPONSE.CANCEL },
@@ -69,7 +66,7 @@ function _askTrackMeasurements(UIViewportDialogService, viewportId) {
}
function _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) {
return new Promise(function(resolve, reject) {
return new Promise(function (resolve, reject) {
const message =
'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?';
const actions = [
@@ -4,15 +4,12 @@ import {
useTrackedMeasurements,
} from './contexts';
function getContextModule({
servicesManager,
extensionManager,
commandsManager,
}) {
const BoundTrackedMeasurementsContextProvider = TrackedMeasurementsContextProvider.bind(
null,
{ servicesManager, extensionManager, commandsManager }
);
function getContextModule({ servicesManager, extensionManager, commandsManager }) {
const BoundTrackedMeasurementsContextProvider = TrackedMeasurementsContextProvider.bind(null, {
servicesManager,
extensionManager,
commandsManager,
});
return [
{
@@ -1,18 +1,11 @@
import { Types } from '@ohif/core';
import {
PanelMeasurementTableTracking,
PanelStudyBrowserTracking,
} from './panels';
import { PanelMeasurementTableTracking, PanelStudyBrowserTracking } from './panels';
// TODO:
// - No loading UI exists yet
// - cancel promises when component is destroyed
// - show errors in UI for thumbnails if promise fails
function getPanelModule({
commandsManager,
extensionManager,
servicesManager,
}): Types.Panel[] {
function getPanelModule({ commandsManager, extensionManager, servicesManager }): Types.Panel[] {
return [
{
name: 'seriesList',
@@ -1,9 +1,7 @@
import React from 'react';
const Component = React.lazy(() => {
return import(
/* webpackPrefetch: true */ './viewports/TrackedCornerstoneViewport'
);
return import(/* webpackPrefetch: true */ './viewports/TrackedCornerstoneViewport');
});
const OHIFCornerstoneViewport = props => {
@@ -14,11 +12,7 @@ const OHIFCornerstoneViewport = props => {
);
};
function getViewportModule({
servicesManager,
commandsManager,
extensionManager,
}) {
function getViewportModule({ servicesManager, commandsManager, extensionManager }) {
const ExtendedOHIFCornerstoneTrackingViewport = props => {
return (
<OHIFCornerstoneViewport
@@ -26,22 +26,10 @@ const DISPLAY_STUDY_SUMMARY_INITIAL_VALUE = {
function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
const [viewportGrid] = useViewportGrid();
const [measurementChangeTimestamp, setMeasurementsUpdated] = useState(
Date.now().toString()
);
const debouncedMeasurementChangeTimestamp = useDebounce(
measurementChangeTimestamp,
200
);
const {
measurementService,
uiDialogService,
displaySetService,
} = servicesManager.services;
const [
trackedMeasurements,
sendTrackedMeasurementsEvent,
] = useTrackedMeasurements();
const [measurementChangeTimestamp, setMeasurementsUpdated] = useState(Date.now().toString());
const debouncedMeasurementChangeTimestamp = useDebounce(measurementChangeTimestamp, 200);
const { measurementService, uiDialogService, displaySetService } = servicesManager.services;
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();
const { trackedStudy, trackedSeries } = trackedMeasurements.context;
const [displayStudySummary, setDisplayStudySummary] = useState(
DISPLAY_STUDY_SUMMARY_INITIAL_VALUE
@@ -52,26 +40,15 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
useEffect(() => {
const measurements = measurementService.getMeasurements();
const filteredMeasurements = measurements.filter(
m =>
trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID)
m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)
);
const mappedMeasurements = filteredMeasurements.map(m =>
_mapMeasurementToDisplay(
m,
measurementService.VALUE_TYPES,
displaySetService
)
_mapMeasurementToDisplay(m, measurementService.VALUE_TYPES, displaySetService)
);
setDisplayMeasurements(mappedMeasurements);
// eslint-ignore-next-line
}, [
measurementService,
trackedStudy,
trackedSeries,
debouncedMeasurementChangeTimestamp,
]);
}, [measurementService, trackedStudy, trackedSeries, debouncedMeasurementChangeTimestamp]);
const updateDisplayStudySummary = async () => {
if (trackedMeasurements.matches('tracking')) {
@@ -104,12 +81,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
// ~~ DisplayStudySummary
useEffect(() => {
updateDisplayStudySummary();
}, [
displayStudySummary.key,
trackedMeasurements,
trackedStudy,
updateDisplayStudySummary,
]);
}, [displayStudySummary.key, trackedMeasurements, trackedStudy, updateDisplayStudySummary]);
// TODO: Better way to consolidated, debounce, check on change?
// Are we exposing the right API for measurementService?
@@ -130,8 +102,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
setMeasurementsUpdated(Date.now().toString());
if (evt === added) {
debounce(() => {
measurementsPanelRef.current.scrollTop =
measurementsPanelRef.current.scrollHeight;
measurementsPanelRef.current.scrollTop = measurementsPanelRef.current.scrollHeight;
}, 300)();
}
}).unsubscribe
@@ -148,9 +119,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
async function exportReport() {
const measurements = measurementService.getMeasurements();
const trackedMeasurements = measurements.filter(
m =>
trackedStudy === m.referenceStudyUID &&
trackedSeries.includes(m.referenceSeriesUID)
m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)
);
downloadCSVReport(trackedMeasurements, measurementService);
@@ -209,7 +178,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
labelClassName="text-white grow text-[14px] leading-[1.2]"
autoFocus
id="annotation"
className="bg-black border-primary-main"
className="border-primary-main bg-black"
type="text"
value={value.label}
onChange={onChangeHandler}
@@ -247,7 +216,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
return (
<>
<div
className="overflow-x-hidden overflow-y-auto invisible-scrollbar"
className="invisible-scrollbar overflow-y-auto overflow-x-hidden"
ref={measurementsPanelRef}
data-cy={'trackedMeasurements-panel'}
>
@@ -285,8 +254,7 @@ function PanelMeasurementTableTracking({ servicesManager, extensionManager }) {
});
}}
disabled={
additionalFindings.length === 0 &&
displayMeasurementsWithoutFindings.length === 0
additionalFindings.length === 0 && displayMeasurementsWithoutFindings.length === 0
}
/>
</div>
@@ -318,14 +286,10 @@ function _mapMeasurementToDisplay(measurement, types, displaySetService) {
SOPInstanceUID
);
const displaySets = displaySetService.getDisplaySetsForSeries(
referenceSeriesUID
);
const displaySets = displaySetService.getDisplaySetsForSeries(referenceSeriesUID);
if (!displaySets[0] || !displaySets[0].images) {
throw new Error(
'The tracked measurements panel should only be tracking "stack" displaySets.'
);
throw new Error('The tracked measurements panel should only be tracking "stack" displaySets.');
}
const {
@@ -3,13 +3,7 @@ import { useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import PropTypes from 'prop-types';
import { utils } from '@ohif/core';
import {
StudyBrowser,
useImageViewer,
useViewportGrid,
Dialog,
ButtonEnums,
} from '@ohif/ui';
import { StudyBrowser, useImageViewer, useViewportGrid, Dialog, ButtonEnums } from '@ohif/ui';
import { useTrackedMeasurements } from '../../getContextModule';
const { formatDate } = utils;
@@ -25,12 +19,8 @@ function PanelStudyBrowserTracking({
requestDisplaySetCreationForStudy,
dataSource,
}) {
const {
displaySetService,
uiDialogService,
hangingProtocolService,
uiNotificationService,
} = servicesManager.services;
const { displaySetService, uiDialogService, hangingProtocolService, uiNotificationService } =
servicesManager.services;
const navigate = useNavigate();
const { t } = useTranslation('Common');
@@ -39,14 +29,8 @@ function PanelStudyBrowserTracking({
// doesn't have to have such an intense shape. This works well enough for now.
// Tabs --> Studies --> DisplaySets --> Thumbnails
const { StudyInstanceUIDs } = useImageViewer();
const [
{ activeViewportId, viewports },
viewportGridService,
] = useViewportGrid();
const [
trackedMeasurements,
sendTrackedMeasurementsEvent,
] = useTrackedMeasurements();
const [{ activeViewportId, viewports }, viewportGridService] = useViewportGrid();
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();
const [activeTabName, setActiveTabName] = useState('primary');
const [expandedStudyInstanceUIDs, setExpandedStudyInstanceUIDs] = useState([
...StudyInstanceUIDs,
@@ -78,8 +62,8 @@ function PanelStudyBrowserTracking({
viewportGridService.setDisplaySetsForViewports(updatedViewports);
};
const activeViewportDisplaySetInstanceUIDs = viewports.get(activeViewportId)
?.displaySetInstanceUIDs;
const activeViewportDisplaySetInstanceUIDs =
viewports.get(activeViewportId)?.displaySetInstanceUIDs;
const { trackedSeries } = trackedMeasurements.context;
@@ -102,9 +86,7 @@ function PanelStudyBrowserTracking({
// try to fetch the prior studies based on the patientID if the
// server can respond.
try {
qidoStudiesForPatient = await getStudiesForPatientByMRN(
qidoForStudyUID
);
qidoStudiesForPatient = await getStudiesForPatientByMRN(qidoForStudyUID);
} catch (error) {
console.warn(error);
}
@@ -123,11 +105,7 @@ function PanelStudyBrowserTracking({
setStudyDisplayList(prevArray => {
const ret = [...prevArray];
for (const study of actuallyMappedStudies) {
if (
!prevArray.find(
it => it.studyInstanceUid === study.studyInstanceUid
)
) {
if (!prevArray.find(it => it.studyInstanceUid === study.studyInstanceUid)) {
ret.push(study);
}
}
@@ -149,18 +127,14 @@ function PanelStudyBrowserTracking({
currentDisplaySets.forEach(async dSet => {
const newImageSrcEntry = {};
const displaySet = displaySetService.getDisplaySetByUID(
dSet.displaySetInstanceUID
);
const displaySet = displaySetService.getDisplaySetByUID(dSet.displaySetInstanceUID);
const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);
const imageId = imageIds[Math.floor(imageIds.length / 2)];
// TODO: Is it okay that imageIds are not returned here for SR displaysets?
if (imageId && !displaySet?.unsupported) {
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(
imageId
);
newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(imageId);
setThumbnailImageSrcMap(prevState => {
return { ...prevState, ...newImageSrcEntry };
});
@@ -209,9 +183,7 @@ function PanelStudyBrowserTracking({
const displaySetInstanceUID = dSet.displaySetInstanceUID;
const newImageSrcEntry = {};
const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID
);
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
if (!displaySet?.unsupported) {
if (options.madeInClient) {
setJumpToDisplaySet(displaySetInstanceUID);
@@ -223,9 +195,7 @@ function PanelStudyBrowserTracking({
// TODO: Is it okay that imageIds are not returned here for SR displaysets?
if (imageId) {
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
newImageSrcEntry[displaySetInstanceUID] = await getImageSrc(
imageId
);
newImageSrcEntry[displaySetInstanceUID] = await getImageSrc(imageId);
setThumbnailImageSrcMap(prevState => {
return { ...prevState, ...newImageSrcEntry };
});
@@ -281,14 +251,7 @@ function PanelStudyBrowserTracking({
SubscriptionDisplaySetMetaDataInvalidated.unsubscribe();
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [
displaySetService,
dataSource,
getImageSrc,
thumbnailImageSrcMap,
trackedSeries,
viewports,
]);
}, [displaySetService, dataSource, getImageSrc, thumbnailImageSrcMap, trackedSeries, viewports]);
const tabs = _createStudyBrowserTabs(
StudyInstanceUIDs,
@@ -299,26 +262,16 @@ function PanelStudyBrowserTracking({
// TODO: Should not fire this on "close"
function _handleStudyClick(StudyInstanceUID) {
const shouldCollapseStudy = expandedStudyInstanceUIDs.includes(
StudyInstanceUID
);
const shouldCollapseStudy = expandedStudyInstanceUIDs.includes(StudyInstanceUID);
const updatedExpandedStudyInstanceUIDs = shouldCollapseStudy
? [
...expandedStudyInstanceUIDs.filter(
stdyUid => stdyUid !== StudyInstanceUID
),
]
? [...expandedStudyInstanceUIDs.filter(stdyUid => stdyUid !== StudyInstanceUID)]
: [...expandedStudyInstanceUIDs, StudyInstanceUID];
setExpandedStudyInstanceUIDs(updatedExpandedStudyInstanceUIDs);
if (!shouldCollapseStudy) {
const madeInClient = true;
requestDisplaySetCreationForStudy(
displaySetService,
StudyInstanceUID,
madeInClient
);
requestDisplaySetCreationForStudy(displaySetService, StudyInstanceUID, madeInClient);
}
}
@@ -326,9 +279,7 @@ function PanelStudyBrowserTracking({
if (jumpToDisplaySet) {
// Get element by displaySetInstanceUID
const displaySetInstanceUID = jumpToDisplaySet;
const element = document.getElementById(
`thumbnail-${displaySetInstanceUID}`
);
const element = document.getElementById(`thumbnail-${displaySetInstanceUID}`);
if (element && typeof element.scrollIntoView === 'function') {
// TODO: Any way to support IE here?
@@ -346,10 +297,7 @@ function PanelStudyBrowserTracking({
const displaySetInstanceUID = jumpToDisplaySet;
// Set the activeTabName and expand the study
const thumbnailLocation = _findTabAndStudyOfDisplaySet(
displaySetInstanceUID,
tabs
);
const thumbnailLocation = _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs);
if (!thumbnailLocation) {
console.warn('jumpToThumbnail: displaySet thumbnail not found.');
@@ -359,10 +307,7 @@ function PanelStudyBrowserTracking({
setActiveTabName(tabName);
const studyExpanded = expandedStudyInstanceUIDs.includes(StudyInstanceUID);
if (!studyExpanded) {
const updatedExpandedStudyInstanceUIDs = [
...expandedStudyInstanceUIDs,
StudyInstanceUID,
];
const updatedExpandedStudyInstanceUIDs = [...expandedStudyInstanceUIDs, StudyInstanceUID];
setExpandedStudyInstanceUIDs(updatedExpandedStudyInstanceUIDs);
}
}, [expandedStudyInstanceUIDs, jumpToDisplaySet, tabs]);
@@ -378,9 +323,7 @@ function PanelStudyBrowserTracking({
setActiveTabName(clickedTabName);
}}
onClickUntrack={displaySetInstanceUID => {
const displaySet = displaySetService.getDisplaySetByUID(
displaySetInstanceUID
);
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
// TODO: shift this somewhere else where we're centralizing this logic?
// Potentially a helper from displaySetInstanceUID to this
sendTrackedMeasurementsEvent('UNTRACK_SERIES', {
@@ -451,20 +394,14 @@ function _mapDisplaySets(
if (numPanes !== 1) {
viewports.forEach(viewportData => {
if (
viewportData?.displaySetInstanceUIDs?.includes(
ds.displaySetInstanceUID
)
) {
if (viewportData?.displaySetInstanceUIDs?.includes(ds.displaySetInstanceUID)) {
viewportIdentificator.push(viewportData.viewportLabel);
}
});
}
const array =
componentType === 'thumbnailTracked'
? thumbnailDisplaySets
: thumbnailNoImageDisplaySets;
componentType === 'thumbnailTracked' ? thumbnailDisplaySets : thumbnailNoImageDisplaySets;
const { displaySetInstanceUID } = ds;
@@ -503,7 +440,7 @@ function _mapDisplaySets(
contentProps: {
title: 'Delete Report',
body: () => (
<div className="p-4 text-white bg-primary-dark">
<div className="bg-primary-dark p-4 text-white">
<p>Are you sure you want to delete this report?</p>
<p>This action cannot be undone.</p>
</div>
@@ -523,9 +460,7 @@ function _mapDisplaySets(
],
onClose: () => uiDialogService.dismiss({ id: 'ds-reject-sr' }),
onShow: () => {
const yesButton = document.querySelector(
'.reject-yes-button'
);
const yesButton = document.querySelector('.reject-yes-button');
yesButton.focus();
},
@@ -533,13 +468,8 @@ function _mapDisplaySets(
switch (action.id) {
case 'yes':
try {
await dataSource.reject.series(
ds.StudyInstanceUID,
ds.SeriesInstanceUID
);
displaySetService.deleteDisplaySet(
displaySetInstanceUID
);
await dataSource.reject.series(ds.StudyInstanceUID, ds.SeriesInstanceUID);
displaySetService.deleteDisplaySet(displaySetInstanceUID);
uiDialogService.dismiss({ id: 'ds-reject-sr' });
uiNotificationService.show({
title: 'Delete Report',
@@ -574,16 +504,7 @@ function _mapDisplaySets(
return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets];
}
const thumbnailNoImageModalities = [
'SR',
'SEG',
'SM',
'RTSTRUCT',
'RTPLAN',
'RTDOSE',
'DOC',
'OT',
];
const thumbnailNoImageModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE', 'DOC', 'OT'];
function _getComponentType(ds) {
if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {
@@ -667,23 +588,17 @@ function _createStudyBrowserTabs(
{
name: 'primary',
label: 'Primary',
studies: primaryStudies.sort((studyA, studyB) =>
_byDate(studyA.date, studyB.date)
),
studies: primaryStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),
},
{
name: 'recent',
label: 'Recent',
studies: recentStudies.sort((studyA, studyB) =>
_byDate(studyA.date, studyB.date)
),
studies: recentStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),
},
{
name: 'all',
label: 'All',
studies: allStudies.sort((studyA, studyB) =>
_byDate(studyA.date, studyB.date)
),
studies: allStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),
},
];
@@ -21,23 +21,12 @@ function _getStudyForPatientUtility(extensionManager) {
* @param {object} commandsManager
* @param {object} extensionManager
*/
function WrappedPanelStudyBrowserTracking({
commandsManager,
extensionManager,
servicesManager,
}) {
function WrappedPanelStudyBrowserTracking({ commandsManager, extensionManager, servicesManager }) {
const dataSource = extensionManager.getActiveDataSource()[0];
const getStudiesForPatientByMRN = _getStudyForPatientUtility(
extensionManager
);
const _getStudiesForPatientByMRN = getStudiesForPatientByMRN.bind(
null,
dataSource
);
const _getImageSrcFromImageId = _createGetImageSrcFromImageIdFn(
extensionManager
);
const getStudiesForPatientByMRN = _getStudyForPatientUtility(extensionManager);
const _getStudiesForPatientByMRN = getStudiesForPatientByMRN.bind(null, dataSource);
const _getImageSrcFromImageId = _createGetImageSrcFromImageIdFn(extensionManager);
const _requestDisplaySetCreationForStudy = requestDisplaySetCreationForStudy.bind(
null,
dataSource
@@ -13,29 +13,17 @@ import { BaseVolumeViewport, Enums } from '@cornerstonejs/core';
const { formatDate } = utils;
function TrackedCornerstoneViewport(props) {
const {
displaySets,
viewportId,
viewportLabel,
servicesManager,
extensionManager,
} = props;
const { displaySets, viewportId, viewportLabel, servicesManager, extensionManager } = props;
const { t } = useTranslation('Common');
const {
measurementService,
cornerstoneViewportService,
viewportGridService,
} = servicesManager.services;
const { measurementService, cornerstoneViewportService, viewportGridService } =
servicesManager.services;
// Todo: handling more than one displaySet on the same viewport
const displaySet = displaySets[0];
const [
trackedMeasurements,
sendTrackedMeasurementsEvent,
] = useTrackedMeasurements();
const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();
const [isTracked, setIsTracked] = useState(false);
const [trackedMeasurementUID, setTrackedMeasurementUID] = useState(null);
@@ -43,12 +31,7 @@ function TrackedCornerstoneViewport(props) {
const { trackedSeries } = trackedMeasurements.context;
const {
SeriesDate,
SeriesDescription,
SeriesInstanceUID,
SeriesNumber,
} = displaySet;
const { SeriesDate, SeriesDescription, SeriesInstanceUID, SeriesNumber } = displaySet;
const {
PatientID,
@@ -62,9 +45,7 @@ function TrackedCornerstoneViewport(props) {
} = displaySet.images[0];
const updateIsTracked = useCallback(() => {
const viewport = cornerstoneViewportService.getCornerstoneViewport(
viewportId
);
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
if (viewport instanceof BaseVolumeViewport) {
// A current image id will only exist for volume viewports that can have measurements tracked.
@@ -99,10 +80,7 @@ function TrackedCornerstoneViewport(props) {
);
const onElementDisabled = useCallback(() => {
viewportElem?.removeEventListener(
Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,
updateIsTracked
);
viewportElem?.removeEventListener(Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, updateIsTracked);
}, [updateIsTracked, viewportElem]);
useEffect(updateIsTracked, [updateIsTracked]);
@@ -132,9 +110,7 @@ function TrackedCornerstoneViewport(props) {
},
});
cornerstoneViewportService
.getRenderingEngine()
.renderViewport(viewportId);
cornerstoneViewportService.getRenderingEngine().renderViewport(viewportId);
return;
}
@@ -173,10 +149,8 @@ function TrackedCornerstoneViewport(props) {
// Only send the tracked measurements event for the active viewport to avoid
// sending it more than once.
if (viewportId === activeViewportId) {
const {
referenceStudyUID: StudyInstanceUID,
referenceSeriesUID: SeriesInstanceUID,
} = measurement;
const { referenceStudyUID: StudyInstanceUID, referenceSeriesUID: SeriesInstanceUID } =
measurement;
sendTrackedMeasurementsEvent('SET_DIRTY', { SeriesInstanceUID });
sendTrackedMeasurementsEvent('TRACK_SERIES', {
@@ -194,12 +168,7 @@ function TrackedCornerstoneViewport(props) {
unsub();
});
};
}, [
measurementService,
sendTrackedMeasurementsEvent,
viewportId,
viewportGridService,
]);
}, [measurementService, sendTrackedMeasurementsEvent, viewportId, viewportGridService]);
function switchMeasurement(direction) {
const newTrackedMeasurementUID = _getNextMeasurementUID(
@@ -244,8 +213,7 @@ function TrackedCornerstoneViewport(props) {
getStatusComponent={() => _getStatusComponent(isTracked)}
studyData={{
label: viewportLabel,
studyDate:
formatDate(SeriesDate) || formatDate(StudyDate) || t('NoStudyDate'),
studyDate: formatDate(SeriesDate) || formatDate(StudyDate) || t('NoStudyDate'),
currentSeries: SeriesNumber, // TODO - switch entire currentSeries to be UID based or actual position based
seriesDescription: SeriesDescription,
patientInformation: {
@@ -253,9 +221,7 @@ function TrackedCornerstoneViewport(props) {
patientSex: PatientSex || '',
patientAge: PatientAge || '',
MRN: PatientID || '',
thickness: SliceThickness
? `${parseFloat(SliceThickness).toFixed(2)}`
: '',
thickness: SliceThickness ? `${parseFloat(SliceThickness).toFixed(2)}` : '',
thicknessUnits: 'mm',
spacing:
SpacingBetweenSlices !== undefined
@@ -266,7 +232,7 @@ function TrackedCornerstoneViewport(props) {
}}
/>
{/* TODO: Viewport interface to accept stack or layers of content like this? */}
<div className="relative flex flex-row w-full h-full overflow-hidden">
<div className="relative flex h-full w-full flex-row overflow-hidden">
{getCornerstoneViewport()}
</div>
</>
@@ -295,9 +261,8 @@ function _getNextMeasurementUID(
const measurements = measurementService.getMeasurements();
const { activeViewportId, viewports } = viewportGridService.getState();
const {
displaySetInstanceUIDs: activeViewportDisplaySetInstanceUIDs,
} = viewports.get(activeViewportId);
const { displaySetInstanceUIDs: activeViewportDisplaySetInstanceUIDs } =
viewports.get(activeViewportId);
const { trackedSeries } = trackedMeasurements.context;
@@ -356,22 +321,24 @@ function _getStatusComponent(isTracked) {
content={
<div className="flex py-2">
<div className="flex pt-1">
<Icon name="info-link" className="w-4 text-primary-main" />
<Icon
name="info-link"
className="text-primary-main w-4"
/>
</div>
<div className="flex ml-4">
<span className="text-base text-common-light">
<div className="ml-4 flex">
<span className="text-common-light text-base">
{isTracked ? (
<>
Series is
<span className="font-bold text-white"> tracked</span> and
can be viewed <br /> in the measurement panel
<span className="font-bold text-white"> tracked</span> and can be viewed <br />{' '}
in the measurement panel
</>
) : (
<>
Measurements for
<span className="font-bold text-white"> untracked </span>
series <br /> will not be shown in the <br /> measurements
panel
series <br /> will not be shown in the <br /> measurements panel
</>
)}
</span>
@@ -379,7 +346,10 @@ function _getStatusComponent(isTracked) {
</div>
}
>
<Icon name={trackedIcon} className="text-aqua-pale" />
<Icon
name={trackedIcon}
className="text-aqua-pale"
/>
</Tooltip>
</div>
);