feat(typings): Enhance typing support with withAppTypes and custom services throughout OHIF (#4090)

This commit is contained in:
Ibrahim 2024-05-08 12:12:49 -04:00 committed by GitHub
parent b2cd0172d6
commit 374065bc3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
153 changed files with 842 additions and 657 deletions

View File

@ -5,9 +5,13 @@ import loadRTStruct from './loadRTStruct';
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.481.3']; const sopClassUids = ['1.2.840.10008.5.1.4.1.1.481.3'];
let loadPromises = {}; const loadPromises = {};
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { function _getDisplaySetsFromSeries(
instances,
servicesManager: AppTypes.ServicesManager,
extensionManager
) {
const instance = instances[0]; const instance = instances[0];
const { const {
@ -69,8 +73,8 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID; displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID;
displaySet.getReferenceDisplaySet = () => { displaySet.getReferenceDisplaySet = () => {
const { DisplaySetService } = servicesManager.services; const { displaySetService } = servicesManager.services;
const referencedDisplaySets = DisplaySetService.getDisplaySetsForSeries( const referencedDisplaySets = displaySetService.getDisplaySetsForSeries(
displaySet.referencedSeriesInstanceUID displaySet.referencedSeriesInstanceUID
); );
@ -90,7 +94,7 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
return [displaySet]; return [displaySet];
} }
function _load(rtDisplaySet, servicesManager, extensionManager, headers) { function _load(rtDisplaySet, servicesManager: AppTypes.ServicesManager, extensionManager, headers) {
const { SOPInstanceUID } = rtDisplaySet; const { SOPInstanceUID } = rtDisplaySet;
const { segmentationService } = servicesManager.services; const { segmentationService } = servicesManager.services;
if ( if (
@ -168,7 +172,10 @@ function _deriveReferencedSeriesSequenceFromFrameOfReferenceSequence(
return ReferencedSeriesSequence; return ReferencedSeriesSequence;
} }
function _segmentationExistsInCache(rtDisplaySet, segmentationService) { function _segmentationExistsInCache(
rtDisplaySet,
segmentationService: AppTypes.SegmentationService
) {
// Todo: fix this // Todo: fix this
return false; return false;
// This should be abstracted with the CornerstoneCacheService // This should be abstracted with the CornerstoneCacheService

View File

@ -13,7 +13,7 @@ function promptHydrateRT({
toolGroupId = 'default', toolGroupId = 'default',
preHydrateCallbacks, preHydrateCallbacks,
hydrateRTDisplaySet, hydrateRTDisplaySet,
}) { }: withAppTypes) {
const { uiViewportDialogService } = servicesManager.services; const { uiViewportDialogService } = servicesManager.services;
const extensionManager = servicesManager._extensionManager; const extensionManager = servicesManager._extensionManager;
const appConfig = extensionManager._appConfig; const appConfig = extensionManager._appConfig;
@ -41,7 +41,7 @@ function promptHydrateRT({
}); });
} }
function _askHydrate(uiViewportDialogService, viewportId) { function _askHydrate(uiViewportDialogService: AppTypes.UIViewportDialogService, viewportId) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
const message = 'Do you want to open this Segmentation?'; const message = 'Do you want to open this Segmentation?';
const actions = [ const actions = [
@ -62,6 +62,7 @@ function _askHydrate(uiViewportDialogService, viewportId) {
}; };
uiViewportDialogService.show({ uiViewportDialogService.show({
id: 'promptHydrateRT',
viewportId, viewportId,
type: 'info', type: 'info',
message, message,

View File

@ -8,7 +8,7 @@ import createRTToolGroupAndAddTools from '../utils/initRTToolGroup';
const RT_TOOLGROUP_BASE_NAME = 'RTToolGroup'; const RT_TOOLGROUP_BASE_NAME = 'RTToolGroup';
function OHIFCornerstoneRTViewport(props) { function OHIFCornerstoneRTViewport(props: withAppTypes) {
const { const {
children, children,
displaySets, displaySets,

View File

@ -1,6 +1,6 @@
import dcmjs from 'dcmjs'; import dcmjs from 'dcmjs';
import { createReportDialogPrompt } from '@ohif/extension-default'; import { createReportDialogPrompt } from '@ohif/extension-default';
import { ServicesManager, Types } from '@ohif/core'; import { Types } from '@ohif/core';
import { cache, metaData } from '@cornerstonejs/core'; import { cache, metaData } from '@cornerstonejs/core';
import { import {
segmentation as cornerstoneToolsSegmentation, segmentation as cornerstoneToolsSegmentation,
@ -48,7 +48,7 @@ const commandsModule = ({
displaySetService, displaySetService,
viewportGridService, viewportGridService,
toolGroupService, toolGroupService,
} = (servicesManager as ServicesManager).services; } = servicesManager.services;
const actions = { const actions = {
/** /**

View File

@ -10,7 +10,7 @@ const getPanelModule = ({
extensionManager, extensionManager,
configuration, configuration,
title, title,
}) => { }: withAppTypes) => {
const { customizationService } = servicesManager.services; const { customizationService } = servicesManager.services;
const wrappedPanelSegmentation = configuration => { const wrappedPanelSegmentation = configuration => {

View File

@ -8,9 +8,13 @@ import { dicomlabToRGB } from './utils/dicomlabToRGB';
const sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4']; const sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4'];
let loadPromises = {}; const loadPromises = {};
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { function _getDisplaySetsFromSeries(
instances,
servicesManager: AppTypes.ServicesManager,
extensionManager
) {
const instance = instances[0]; const instance = instances[0];
const { const {
@ -95,7 +99,12 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
return [displaySet]; return [displaySet];
} }
function _load(segDisplaySet, servicesManager, extensionManager, headers) { function _load(
segDisplaySet,
servicesManager: AppTypes.ServicesManager,
extensionManager,
headers
) {
const { SOPInstanceUID } = segDisplaySet; const { SOPInstanceUID } = segDisplaySet;
const { segmentationService } = servicesManager.services; const { segmentationService } = servicesManager.services;
@ -137,7 +146,12 @@ function _load(segDisplaySet, servicesManager, extensionManager, headers) {
return loadPromises[SOPInstanceUID]; return loadPromises[SOPInstanceUID];
} }
async function _loadSegments({ extensionManager, servicesManager, segDisplaySet, headers }) { async function _loadSegments({
extensionManager,
servicesManager,
segDisplaySet,
headers,
}: withAppTypes) {
const utilityModule = extensionManager.getModuleEntry( const utilityModule = extensionManager.getModuleEntry(
'@ohif/extension-cornerstone.utilityModule.common' '@ohif/extension-cornerstone.utilityModule.common'
); );
@ -212,7 +226,7 @@ async function _loadSegments({ extensionManager, servicesManager, segDisplaySet,
Object.assign(segDisplaySet, results); Object.assign(segDisplaySet, results);
} }
function _segmentationExists(segDisplaySet, segmentationService) { function _segmentationExists(segDisplaySet, segmentationService: AppTypes.SegmentationService) {
// This should be abstracted with the CornerstoneCacheService // This should be abstracted with the CornerstoneCacheService
return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID); return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID);
} }

View File

@ -1,4 +1,4 @@
export function getToolbarModule({ servicesManager }) { export function getToolbarModule({ servicesManager }: withAppTypes) {
const { segmentationService, toolbarService, toolGroupService } = servicesManager.services; const { segmentationService, toolbarService, toolGroupService } = servicesManager.services;
return [ return [
{ {

View File

@ -17,7 +17,7 @@ export default function PanelSegmentation({
commandsManager, commandsManager,
extensionManager, extensionManager,
configuration, configuration,
}) { }: withAppTypes) {
const { const {
segmentationService, segmentationService,
viewportGridService, viewportGridService,

View File

@ -22,7 +22,7 @@ async function updateViewportsForSegmentationRendering({
}: { }: {
viewportId: string; viewportId: string;
loadFn: () => Promise<string>; loadFn: () => Promise<string>;
servicesManager: any; servicesManager: AppTypes.ServicesManager;
referencedDisplaySetInstanceUID?: string; referencedDisplaySetInstanceUID?: string;
}) { }) {
const { cornerstoneViewportService, segmentationService, viewportGridService } = const { cornerstoneViewportService, segmentationService, viewportGridService } =
@ -134,7 +134,7 @@ function getUpdatedViewportsForSegmentation({
viewportId, viewportId,
servicesManager, servicesManager,
referencedDisplaySetInstanceUID, referencedDisplaySetInstanceUID,
}) { }: withAppTypes) {
const { hangingProtocolService, displaySetService, segmentationService, viewportGridService } = const { hangingProtocolService, displaySetService, segmentationService, viewportGridService } =
servicesManager.services; servicesManager.services;

View File

@ -12,7 +12,7 @@ function promptHydrateSEG({
viewportId, viewportId,
preHydrateCallbacks, preHydrateCallbacks,
hydrateSEGDisplaySet, hydrateSEGDisplaySet,
}) { }: withAppTypes) {
const { uiViewportDialogService } = servicesManager.services; const { uiViewportDialogService } = servicesManager.services;
const extensionManager = servicesManager._extensionManager; const extensionManager = servicesManager._extensionManager;
const appConfig = extensionManager._appConfig; const appConfig = extensionManager._appConfig;

View File

@ -8,7 +8,7 @@ import _getStatusComponent from './_getStatusComponent';
const SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup'; const SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';
function OHIFCornerstoneSEGViewport(props) { function OHIFCornerstoneSEGViewport(props: withAppTypes) {
const { const {
children, children,
displaySets, displaySets,

View File

@ -40,7 +40,7 @@ const _generateReport = (measurementData, additionalFindingTypes, options = {})
return dataset; return dataset;
}; };
const commandsModule = props => { const commandsModule = (props: withAppTypes) => {
const { servicesManager } = props; const { servicesManager } = props;
const { customizationService } = servicesManager.services; const { customizationService } = servicesManager.services;
const actions = { const actions = {
@ -57,7 +57,7 @@ const commandsModule = props => {
const reportBlob = dcmjs.data.datasetToBlob(srDataset); const reportBlob = dcmjs.data.datasetToBlob(srDataset);
//Create a URL for the binary. //Create a URL for the binary.
var objectUrl = URL.createObjectURL(reportBlob); const objectUrl = URL.createObjectURL(reportBlob);
window.location.assign(objectUrl); window.location.assign(objectUrl);
}, },

View File

@ -85,7 +85,11 @@ function addInstances(instances: InstanceMetadata[], displaySetService: DisplayS
* @param servicesManager is the services that can be used for creating * @param servicesManager is the services that can be used for creating
* @returns The list of display sets created for the given instances object * @returns The list of display sets created for the given instances object
*/ */
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { function _getDisplaySetsFromSeries(
instances,
servicesManager: AppTypes.ServicesManager,
extensionManager
) {
// If the series has no instances, stop here // If the series has no instances, stop here
if (!instances || !instances.length) { if (!instances || !instances.length) {
throw new Error('No instances were provided'); throw new Error('No instances were provided');
@ -150,7 +154,7 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
return [displaySet]; return [displaySet];
} }
async function _load(displaySet, servicesManager, extensionManager) { async function _load(displaySet, servicesManager: AppTypes.ServicesManager, extensionManager) {
const { displaySetService, measurementService } = servicesManager.services; const { displaySetService, measurementService } = servicesManager.services;
const dataSources = extensionManager.getDataSources(); const dataSources = extensionManager.getDataSources();
const dataSource = dataSources[0]; const dataSource = dataSources[0];
@ -223,7 +227,7 @@ function _checkIfCanAddMeasurementsToDisplaySet(
srDisplaySet, srDisplaySet,
newDisplaySet, newDisplaySet,
dataSource, dataSource,
servicesManager servicesManager: AppTypes.ServicesManager
) { ) {
const { customizationService } = servicesManager.services; const { customizationService } = servicesManager.services;
let unloadedMeasurements = srDisplaySet.measurements.filter( let unloadedMeasurements = srDisplaySet.measurements.filter(

View File

@ -43,7 +43,7 @@ const convertSites = (codingValues, sites) => {
* *
*/ */
export default function hydrateStructuredReport( export default function hydrateStructuredReport(
{ servicesManager, extensionManager, appConfig }, { servicesManager, extensionManager, appConfig }: withAppTypes,
displaySetInstanceUID displaySetInstanceUID
) { ) {
const annotationManager = CsAnnotation.state.getAnnotationManager(); const annotationManager = CsAnnotation.state.getAnnotationManager();

View File

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { useCallback, useContext, useEffect, useState } from 'react'; import React, { useCallback, useContext, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ServicesManager, ExtensionManager } from '@ohif/core'; import { ExtensionManager } from '@ohif/core';
import { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule'; import { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule';
@ -14,7 +14,7 @@ const MEASUREMENT_TRACKING_EXTENSION_ID = '@ohif/extension-measurement-tracking'
const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup'; const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup';
function OHIFCornerstoneSRViewport(props) { function OHIFCornerstoneSRViewport(props: withAppTypes) {
const { children, dataSource, displaySets, viewportOptions, servicesManager, extensionManager } = const { children, dataSource, displaySets, viewportOptions, servicesManager, extensionManager } =
props; props;
@ -369,7 +369,7 @@ OHIFCornerstoneSRViewport.propTypes = {
viewportLabel: PropTypes.string, viewportLabel: PropTypes.string,
customProps: PropTypes.object, customProps: PropTypes.object,
viewportOptions: PropTypes.object, viewportOptions: PropTypes.object,
servicesManager: PropTypes.instanceOf(ServicesManager).isRequired, servicesManager: PropTypes.object.isRequired,
extensionManager: PropTypes.instanceOf(ExtensionManager).isRequired, extensionManager: PropTypes.instanceOf(ExtensionManager).isRequired,
}; };

View File

@ -265,7 +265,7 @@ function _getInstanceFromSegmentations(segmentations, displaySetService) {
return { seriesMetadata, instance }; return { seriesMetadata, instance };
} }
function updateSegmentationsChartDisplaySet({ servicesManager }): void { function updateSegmentationsChartDisplaySet({ servicesManager }: withAppTypes): void {
const { segmentationService, displaySetService } = servicesManager.services; const { segmentationService, displaySetService } = servicesManager.services;
const segmentations = segmentationService.getSegmentations(); const segmentations = segmentationService.getSegmentations();
const { seriesMetadata, instance } = const { seriesMetadata, instance } =

View File

@ -4,7 +4,7 @@ import { cache } from '@cornerstonejs/core';
const LABELMAP = Enums.SegmentationRepresentations.Labelmap; const LABELMAP = Enums.SegmentationRepresentations.Labelmap;
const commandsModule = ({ commandsManager, servicesManager }) => { const commandsModule = ({ commandsManager, servicesManager }: withAppTypes) => {
const services = servicesManager.services; const services = servicesManager.services;
const { displaySetService, viewportGridService, segmentationService } = services; const { displaySetService, viewportGridService, segmentationService } = services;

View File

@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
import { ActionButtons } from '@ohif/ui'; import { ActionButtons } from '@ohif/ui';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
function DynamicExport({ commandsManager, servicesManager, extensionManager }) { function DynamicExport({ commandsManager, servicesManager, extensionManager }: withAppTypes) {
const { segmentationService } = servicesManager.services; const { segmentationService } = servicesManager.services;
const { t } = useTranslation('dynamicExport'); const { t } = useTranslation('dynamicExport');

View File

@ -8,7 +8,7 @@ import DynamicVolumeControls from './DynamicVolumeControls';
const SOPClassHandlerId = '@ohif/extension-default.sopClassHandlerModule.stack'; const SOPClassHandlerId = '@ohif/extension-default.sopClassHandlerModule.stack';
export default function PanelGenerateImage({ servicesManager, commandsManager }) { export default function PanelGenerateImage({ servicesManager, commandsManager }: withAppTypes) {
const { cornerstoneViewportService, viewportGridService, displaySetService } = const { cornerstoneViewportService, viewportGridService, displaySetService } =
servicesManager.services; servicesManager.services;

View File

@ -18,7 +18,6 @@ import { setEnabledElement } from '../state';
import './OHIFCornerstoneViewport.css'; import './OHIFCornerstoneViewport.css';
import CornerstoneOverlays from './Overlays/CornerstoneOverlays'; import CornerstoneOverlays from './Overlays/CornerstoneOverlays';
import getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes'; import getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes';
import CornerstoneServices from '../types/CornerstoneServices';
import CinePlayer from '../components/CinePlayer'; import CinePlayer from '../components/CinePlayer';
import { Types } from '@ohif/core'; import { Types } from '@ohif/core';
@ -100,7 +99,7 @@ function areEqual(prevProps, nextProps) {
// Todo: This should be done with expose of internal API similar to react-vtkjs-viewport // Todo: This should be done with expose of internal API similar to react-vtkjs-viewport
// Then we don't need to worry about the re-renders if the props change. // Then we don't need to worry about the re-renders if the props change.
const OHIFCornerstoneViewport = React.memo(props => { const OHIFCornerstoneViewport = React.memo((props: withAppTypes) => {
const { const {
displaySets, displaySets,
dataSource, dataSource,
@ -108,11 +107,13 @@ const OHIFCornerstoneViewport = React.memo(props => {
displaySetOptions, displaySetOptions,
servicesManager, servicesManager,
onElementEnabled, onElementEnabled,
// eslint-disable-next-line react/prop-types
onElementDisabled, onElementDisabled,
isJumpToMeasurementDisabled, isJumpToMeasurementDisabled,
// Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation
// of the imageData in the OHIFCornerstoneViewport. This prop is used // of the imageData in the OHIFCornerstoneViewport. This prop is used
// to set the initial state of the viewport's first image to render // to set the initial state of the viewport's first image to render
// eslint-disable-next-line react/prop-types
initialImageIndex, initialImageIndex,
// if the viewport is part of a hanging protocol layout // if the viewport is part of a hanging protocol layout
// we should not really rely on the old synchronizers and // we should not really rely on the old synchronizers and
@ -120,6 +121,7 @@ const OHIFCornerstoneViewport = React.memo(props => {
// is not part of the hanging protocol layout. HPs should // is not part of the hanging protocol layout. HPs should
// define their own synchronizers. Since the synchronizers are // define their own synchronizers. Since the synchronizers are
// viewportId dependent and // viewportId dependent and
// eslint-disable-next-line react/prop-types
isHangingProtocolLayout, isHangingProtocolLayout,
} = props; } = props;
@ -152,7 +154,7 @@ const OHIFCornerstoneViewport = React.memo(props => {
viewportGridService, viewportGridService,
stateSyncService, stateSyncService,
viewportActionCornersService, viewportActionCornersService,
} = servicesManager.services as CornerstoneServices; } = servicesManager.services;
const [viewportDialogState] = useViewportDialog(); const [viewportDialogState] = useViewportDialog();
// useCallback for scroll bar height calculation // useCallback for scroll bar height calculation

View File

@ -5,7 +5,7 @@ import CustomizableViewportOverlay from './CustomizableViewportOverlay';
import ViewportOrientationMarkers from './ViewportOrientationMarkers'; import ViewportOrientationMarkers from './ViewportOrientationMarkers';
import ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator'; import ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator';
function CornerstoneOverlays(props) { function CornerstoneOverlays(props: withAppTypes) {
const { viewportId, element, scrollbarHeight, servicesManager } = props; const { viewportId, element, scrollbarHeight, servicesManager } = props;
const { cornerstoneViewportService } = servicesManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [imageSliceData, setImageSliceData] = useState({ const [imageSliceData, setImageSliceData] = useState({

View File

@ -4,7 +4,6 @@ import PropTypes from 'prop-types';
import { metaData, Enums, utilities } from '@cornerstonejs/core'; import { metaData, Enums, utilities } from '@cornerstonejs/core';
import { ImageSliceData } from '@cornerstonejs/core/dist/esm/types'; import { ImageSliceData } from '@cornerstonejs/core/dist/esm/types';
import { ViewportOverlay } from '@ohif/ui'; import { ViewportOverlay } from '@ohif/ui';
import { ServicesManager } from '@ohif/core';
import { InstanceMetadata } from '@ohif/core/src/types'; import { InstanceMetadata } from '@ohif/core/src/types';
import { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils'; import { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils';
import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService'; import { StackViewportData, VolumeViewportData } from '../../types/CornerstoneCacheService';
@ -19,7 +18,7 @@ interface OverlayItemProps {
element: HTMLElement; element: HTMLElement;
viewportData: ViewportData; viewportData: ViewportData;
imageSliceData: ImageSliceData; imageSliceData: ImageSliceData;
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
viewportId: string; viewportId: string;
instance: InstanceMetadata; instance: InstanceMetadata;
customization: any; customization: any;
@ -59,7 +58,7 @@ function CustomizableViewportOverlay({
viewportData: ViewportData; viewportData: ViewportData;
imageSliceData: ImageSliceData; imageSliceData: ImageSliceData;
viewportId: string; viewportId: string;
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
}) { }) {
const { cornerstoneViewportService, customizationService, toolGroupService } = const { cornerstoneViewportService, customizationService, toolGroupService } =
servicesManager.services; servicesManager.services;

View File

@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
import { Enums, Types, utilities } from '@cornerstonejs/core'; import { Enums, Types, utilities } from '@cornerstonejs/core';
import { utilities as csToolsUtils } from '@cornerstonejs/tools'; import { utilities as csToolsUtils } from '@cornerstonejs/tools';
import { ImageScrollbar } from '@ohif/ui'; import { ImageScrollbar } from '@ohif/ui';
import { ServicesManger } from '@ohif/core';
function CornerstoneImageScrollbar({ function CornerstoneImageScrollbar({
viewportData, viewportData,
@ -13,8 +12,8 @@ function CornerstoneImageScrollbar({
setImageSliceData, setImageSliceData,
scrollbarHeight, scrollbarHeight,
servicesManager, servicesManager,
}) { }: withAppTypes) {
const { cineService, cornerstoneViewportService } = (servicesManager as ServicesManger).services; const { cineService, cornerstoneViewportService } = servicesManager.services;
const onImageScrollbarChange = (imageIndex, viewportId) => { const onImageScrollbarChange = (imageIndex, viewportId) => {
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);

View File

@ -22,7 +22,7 @@ function ViewportOrientationMarkers({
viewportId, viewportId,
servicesManager, servicesManager,
orientationMarkers = ['top', 'left'], orientationMarkers = ['top', 'left'],
}) { }: withAppTypes) {
// Rotation is in degrees // Rotation is in degrees
const [rotation, setRotation] = useState(0); const [rotation, setRotation] = useState(0);
const [flipHorizontal, setFlipHorizontal] = useState(false); const [flipHorizontal, setFlipHorizontal] = useState(false);

View File

@ -20,7 +20,6 @@ import { callLabelAutocompleteDialog, showLabelAnnotationPopup } from './utils/c
import toggleImageSliceSync from './utils/imageSliceSync/toggleImageSliceSync'; import toggleImageSliceSync from './utils/imageSliceSync/toggleImageSliceSync';
import { getFirstAnnotationSelected } from './utils/measurementServiceMappings/utils/selection'; import { getFirstAnnotationSelected } from './utils/measurementServiceMappings/utils/selection';
import getActiveViewportEnabledElement from './utils/getActiveViewportEnabledElement'; import getActiveViewportEnabledElement from './utils/getActiveViewportEnabledElement';
import { CornerstoneServices } from './types';
import toggleVOISliceSync from './utils/toggleVOISliceSync'; import toggleVOISliceSync from './utils/toggleVOISliceSync';
const toggleSyncFunctions = { const toggleSyncFunctions = {
@ -44,7 +43,7 @@ function commandsModule({
colorbarService, colorbarService,
hangingProtocolService, hangingProtocolService,
syncGroupService, syncGroupService,
} = servicesManager.services as CornerstoneServices; } = servicesManager.services;
const { measurementServiceSource } = this; const { measurementServiceSource } = this;

View File

@ -1,14 +1,9 @@
import React, { ReactElement } from 'react'; import React, { ReactElement } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { ServicesManager } from '@ohif/core';
import { useViewportGrid } from '@ohif/ui'; import { useViewportGrid } from '@ohif/ui';
import ViewportWindowLevel from '../ViewportWindowLevel/ViewportWindowLevel'; import ViewportWindowLevel from '../ViewportWindowLevel/ViewportWindowLevel';
const ActiveViewportWindowLevel = ({ const ActiveViewportWindowLevel = ({ servicesManager }: withAppTypes): ReactElement => {
servicesManager,
}: {
servicesManager: ServicesManager;
}): ReactElement => {
const [viewportGrid] = useViewportGrid(); const [viewportGrid] = useViewportGrid();
const { activeViewportId } = viewportGrid; const { activeViewportId } = viewportGrid;
@ -25,7 +20,7 @@ const ActiveViewportWindowLevel = ({
}; };
ActiveViewportWindowLevel.propTypes = { ActiveViewportWindowLevel.propTypes = {
servicesManager: PropTypes.instanceOf(ServicesManager), servicesManager: PropTypes.object.isRequired,
}; };
export default ActiveViewportWindowLevel; export default ActiveViewportWindowLevel;

View File

@ -4,7 +4,14 @@ import { Enums, eventTarget, cache } from '@cornerstonejs/core';
import { Enums as StreamingEnums } from '@cornerstonejs/streaming-image-volume-loader'; import { Enums as StreamingEnums } from '@cornerstonejs/streaming-image-volume-loader';
import { useAppConfig } from '@state'; import { useAppConfig } from '@state';
function WrappedCinePlayer({ enabledVPElement, viewportId, servicesManager }) { function WrappedCinePlayer({
enabledVPElement,
viewportId,
servicesManager,
}: withAppTypes<{
enabledVPElement: HTMLElement;
viewportId: string;
}>) {
const { customizationService, displaySetService, viewportGridService } = servicesManager.services; const { customizationService, displaySetService, viewportGridService } = servicesManager.services;
const [{ isCineEnabled, cines }, cineService] = useCine(); const [{ isCineEnabled, cines }, cineService] = useCine();
const [newStackFrameRate, setNewStackFrameRate] = useState(24); const [newStackFrameRate, setNewStackFrameRate] = useState(24);

View File

@ -1,7 +1,6 @@
import React, { useEffect, useCallback, useState, ReactElement } from 'react'; import React, { useEffect, useCallback, useState, ReactElement } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import debounce from 'lodash.debounce'; import debounce from 'lodash.debounce';
import { ServicesManager } from '@ohif/core';
import { PanelSection, WindowLevel } from '@ohif/ui'; import { PanelSection, WindowLevel } from '@ohif/ui';
import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps'; import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';
import { Enums, eventTarget, cache as cs3DCache, utilities as csUtils } from '@cornerstonejs/core'; import { Enums, eventTarget, cache as cs3DCache, utilities as csUtils } from '@cornerstonejs/core';
@ -12,10 +11,9 @@ const { Events } = Enums;
const ViewportWindowLevel = ({ const ViewportWindowLevel = ({
servicesManager, servicesManager,
viewportId, viewportId,
}: { }: withAppTypes<{
servicesManager: ServicesManager;
viewportId: string; viewportId: string;
}): ReactElement => { }>): ReactElement => {
const { cornerstoneViewportService } = servicesManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [windowLevels, setWindowLevels] = useState([]); const [windowLevels, setWindowLevels] = useState([]);
const [cachedHistograms, setCachedHistograms] = useState({}); const [cachedHistograms, setCachedHistograms] = useState({});
@ -380,7 +378,7 @@ const ViewportWindowLevel = ({
}; };
ViewportWindowLevel.propTypes = { ViewportWindowLevel.propTypes = {
servicesManager: PropTypes.instanceOf(ServicesManager), servicesManager: PropTypes.object.isRequired,
viewportId: PropTypes.string.isRequired, viewportId: PropTypes.string.isRequired,
}; };

View File

@ -8,10 +8,10 @@ export function setViewportColorbar(
viewportId, viewportId,
displaySets, displaySets,
commandsManager, commandsManager,
serviceManager, servicesManager: AppTypes.ServicesManager,
colorbarOptions colorbarOptions
) { ) {
const { cornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = servicesManager.services;
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
@ -59,10 +59,10 @@ export function Colorbar({
viewportId, viewportId,
displaySets, displaySets,
commandsManager, commandsManager,
serviceManager, servicesManager,
colorbarProperties, colorbarProperties,
}: ColorbarProps): ReactElement { }: withAppTypes<ColorbarProps>): ReactElement {
const { colorbarService } = serviceManager.services; const { colorbarService } = servicesManager.services;
const { const {
width: colorbarWidth, width: colorbarWidth,
colorbarTickPosition, colorbarTickPosition,
@ -73,7 +73,7 @@ export function Colorbar({
const [showColorbar, setShowColorbar] = useState(colorbarService.hasColorbar(viewportId)); const [showColorbar, setShowColorbar] = useState(colorbarService.hasColorbar(viewportId));
const onSetColorbar = useCallback(() => { const onSetColorbar = useCallback(() => {
setViewportColorbar(viewportId, displaySets, commandsManager, serviceManager, { setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, {
viewportId, viewportId,
colormaps, colormaps,
ticks: { ticks: {

View File

@ -8,9 +8,9 @@ export function Colormap({
viewportId, viewportId,
displaySets, displaySets,
commandsManager, commandsManager,
serviceManager, servicesManager,
}: ColormapProps): ReactElement { }: ColormapProps): ReactElement {
const { cornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [activeDisplaySet, setActiveDisplaySet] = useState(displaySets[0]); const [activeDisplaySet, setActiveDisplaySet] = useState(displaySets[0]);

View File

@ -2,11 +2,11 @@ import React, { ReactElement, useState, useEffect, useCallback } from 'react';
import { VolumeLightingProps } from '../../types/ViewportPresets'; import { VolumeLightingProps } from '../../types/ViewportPresets';
export function VolumeLighting({ export function VolumeLighting({
serviceManager, servicesManager,
commandsManager, commandsManager,
viewportId, viewportId,
}: VolumeLightingProps): ReactElement { }: VolumeLightingProps): ReactElement {
const { cornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [ambient, setAmbient] = useState(null); const [ambient, setAmbient] = useState(null);
const [diffuse, setDiffuse] = useState(null); const [diffuse, setDiffuse] = useState(null);
const [specular, setSpecular] = useState(null); const [specular, setSpecular] = useState(null);

View File

@ -9,21 +9,21 @@ export function VolumeRenderingOptions({
viewportId, viewportId,
commandsManager, commandsManager,
volumeRenderingQualityRange, volumeRenderingQualityRange,
serviceManager, servicesManager,
}: VolumeRenderingOptionsProps): ReactElement { }: VolumeRenderingOptionsProps): ReactElement {
return ( return (
<AllInOneMenu.ItemPanel> <AllInOneMenu.ItemPanel>
<VolumeRenderingQuality <VolumeRenderingQuality
viewportId={viewportId} viewportId={viewportId}
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={serviceManager} servicesManager={servicesManager}
volumeRenderingQualityRange={volumeRenderingQualityRange} volumeRenderingQualityRange={volumeRenderingQualityRange}
/> />
<VolumeShift <VolumeShift
viewportId={viewportId} viewportId={viewportId}
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={serviceManager} servicesManager={servicesManager}
/> />
<div className="all-in-one-menu-item mt-2 flex !h-[20px] w-full justify-start"> <div className="all-in-one-menu-item mt-2 flex !h-[20px] w-full justify-start">
<div className="text-aqua-pale text-[13px]">LIGHTING</div> <div className="text-aqua-pale text-[13px]">LIGHTING</div>
@ -32,14 +32,14 @@ export function VolumeRenderingOptions({
<div className="all-in-one-menu-item flex w-full justify-center"> <div className="all-in-one-menu-item flex w-full justify-center">
<VolumeShade <VolumeShade
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={serviceManager} servicesManager={servicesManager}
viewportId={viewportId} viewportId={viewportId}
/> />
</div> </div>
<VolumeLighting <VolumeLighting
viewportId={viewportId} viewportId={viewportId}
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={serviceManager} servicesManager={servicesManager}
/> />
</AllInOneMenu.ItemPanel> </AllInOneMenu.ItemPanel>
); );

View File

@ -5,11 +5,11 @@ import { VolumeRenderingPresetsContent } from './VolumeRenderingPresetsContent';
export function VolumeRenderingPresets({ export function VolumeRenderingPresets({
viewportId, viewportId,
serviceManager, servicesManager,
commandsManager, commandsManager,
volumeRenderingPresets, volumeRenderingPresets,
}: VolumeRenderingPresetsProps): ReactElement { }: VolumeRenderingPresetsProps): ReactElement {
const { uiModalService } = serviceManager.services; const { uiModalService } = servicesManager.services;
const onClickPresets = () => { const onClickPresets = () => {
uiModalService.show({ uiModalService.show({

View File

@ -4,10 +4,10 @@ import { VolumeRenderingQualityProps } from '../../types/ViewportPresets';
export function VolumeRenderingQuality({ export function VolumeRenderingQuality({
volumeRenderingQualityRange, volumeRenderingQualityRange,
commandsManager, commandsManager,
serviceManager, servicesManager,
viewportId, viewportId,
}: VolumeRenderingQualityProps): ReactElement { }: VolumeRenderingQualityProps): ReactElement {
const { cornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = servicesManager.services;
const { min, max, step } = volumeRenderingQualityRange; const { min, max, step } = volumeRenderingQualityRange;
const [quality, setQuality] = useState(null); const [quality, setQuality] = useState(null);

View File

@ -5,9 +5,9 @@ import { VolumeShadeProps } from '../../types/ViewportPresets';
export function VolumeShade({ export function VolumeShade({
commandsManager, commandsManager,
viewportId, viewportId,
serviceManager, servicesManager,
}: VolumeShadeProps): ReactElement { }: VolumeShadeProps): ReactElement {
const { cornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [shade, setShade] = useState(true); const [shade, setShade] = useState(true);
const [key, setKey] = useState(0); const [key, setKey] = useState(0);

View File

@ -4,9 +4,9 @@ import { VolumeShiftProps } from '../../types/ViewportPresets';
export function VolumeShift({ export function VolumeShift({
viewportId, viewportId,
commandsManager, commandsManager,
serviceManager, servicesManager,
}: VolumeShiftProps): ReactElement { }: VolumeShiftProps): ReactElement {
const { cornerstoneViewportService } = serviceManager.services; const { cornerstoneViewportService } = servicesManager.services;
const [minShift, setMinShift] = useState<number | null>(null); const [minShift, setMinShift] = useState<number | null>(null);
const [maxShift, setMaxShift] = useState<number | null>(null); const [maxShift, setMaxShift] = useState<number | null>(null);
const [shift, setShift] = useState<number | null>( const [shift, setShift] = useState<number | null>(

View File

@ -2,7 +2,6 @@ import React, { ReactElement, useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import classNames from 'classnames'; import classNames from 'classnames';
import { AllInOneMenu, useViewportGrid } from '@ohif/ui'; import { AllInOneMenu, useViewportGrid } from '@ohif/ui';
import { CommandsManager, ServicesManager } from '@ohif/core';
import { Colormap } from './Colormap'; import { Colormap } from './Colormap';
import { Colorbar } from './Colorbar'; import { Colorbar } from './Colorbar';
import { setViewportColorbar } from './Colorbar'; import { setViewportColorbar } from './Colorbar';
@ -22,8 +21,6 @@ export type WindowLevelActionMenuProps = {
presets: Array<Record<string, Array<WindowLevelPreset>>>; presets: Array<Record<string, Array<WindowLevelPreset>>>;
verticalDirection: AllInOneMenu.VerticalDirection; verticalDirection: AllInOneMenu.VerticalDirection;
horizontalDirection: AllInOneMenu.HorizontalDirection; horizontalDirection: AllInOneMenu.HorizontalDirection;
commandsManager: CommandsManager;
serviceManager: ServicesManager;
colorbarProperties: ColorbarProperties; colorbarProperties: ColorbarProperties;
displaySets: Array<any>; displaySets: Array<any>;
volumeRenderingPresets: Array<ViewportPreset>; volumeRenderingPresets: Array<ViewportPreset>;
@ -37,12 +34,12 @@ export function WindowLevelActionMenu({
verticalDirection, verticalDirection,
horizontalDirection, horizontalDirection,
commandsManager, commandsManager,
serviceManager, servicesManager,
colorbarProperties, colorbarProperties,
displaySets, displaySets,
volumeRenderingPresets, volumeRenderingPresets,
volumeRenderingQualityRange, volumeRenderingQualityRange,
}: WindowLevelActionMenuProps): ReactElement { }: withAppTypes<WindowLevelActionMenuProps>): ReactElement {
const { const {
colormaps, colormaps,
colorbarContainerPosition, colorbarContainerPosition,
@ -50,7 +47,7 @@ export function WindowLevelActionMenu({
colorbarTickPosition, colorbarTickPosition,
width: colorbarWidth, width: colorbarWidth,
} = colorbarProperties; } = colorbarProperties;
const { colorbarService, cornerstoneViewportService } = serviceManager.services; const { colorbarService, cornerstoneViewportService } = servicesManager.services;
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId); const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId); const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
const backgroundColor = viewportInfo.getViewportOptions().background; const backgroundColor = viewportInfo.getViewportOptions().background;
@ -68,7 +65,7 @@ export function WindowLevelActionMenu({
const [is3DVolume, setIs3DVolume] = useState(false); const [is3DVolume, setIs3DVolume] = useState(false);
const onSetColorbar = useCallback(() => { const onSetColorbar = useCallback(() => {
setViewportColorbar(viewportId, displaySets, commandsManager, serviceManager, { setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, {
colormaps, colormaps,
ticks: { ticks: {
position: colorbarTickPosition, position: colorbarTickPosition,
@ -138,7 +135,7 @@ export function WindowLevelActionMenu({
viewportId={viewportId} viewportId={viewportId}
displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))} displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))}
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={serviceManager} servicesManager={servicesManager}
colorbarProperties={colorbarProperties} colorbarProperties={colorbarProperties}
/> />
)} )}
@ -154,7 +151,7 @@ export function WindowLevelActionMenu({
viewportId={viewportId} viewportId={viewportId}
displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))} displaySets={displaySets.filter(ds => !nonImageModalities.includes(ds.Modality))}
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={serviceManager} servicesManager={servicesManager}
/> />
</AllInOneMenu.SubMenu> </AllInOneMenu.SubMenu>
)} )}
@ -175,7 +172,7 @@ export function WindowLevelActionMenu({
{volumeRenderingPresets && is3DVolume && ( {volumeRenderingPresets && is3DVolume && (
<VolumeRenderingPresets <VolumeRenderingPresets
serviceManager={serviceManager} servicesManager={servicesManager}
viewportId={viewportId} viewportId={viewportId}
commandsManager={commandsManager} commandsManager={commandsManager}
volumeRenderingPresets={volumeRenderingPresets} volumeRenderingPresets={volumeRenderingPresets}
@ -188,7 +185,7 @@ export function WindowLevelActionMenu({
viewportId={viewportId} viewportId={viewportId}
commandsManager={commandsManager} commandsManager={commandsManager}
volumeRenderingQualityRange={volumeRenderingQualityRange} volumeRenderingQualityRange={volumeRenderingQualityRange}
serviceManager={serviceManager} servicesManager={servicesManager}
/> />
</AllInOneMenu.SubMenu> </AllInOneMenu.SubMenu>
)} )}

View File

@ -9,7 +9,7 @@ export function getWindowLevelActionMenu({
commandsManager, commandsManager,
verticalDirection, verticalDirection,
horizontalDirection, horizontalDirection,
}): ReactNode { }: withAppTypes): ReactNode {
const { customizationService } = servicesManager.services; const { customizationService } = servicesManager.services;
const { presets } = customizationService.get('cornerstone.windowLevelPresets'); const { presets } = customizationService.get('cornerstone.windowLevelPresets');
@ -32,7 +32,7 @@ export function getWindowLevelActionMenu({
verticalDirection={verticalDirection} verticalDirection={verticalDirection}
horizontalDirection={horizontalDirection} horizontalDirection={horizontalDirection}
commandsManager={commandsManager} commandsManager={commandsManager}
serviceManager={servicesManager} servicesManager={servicesManager}
colorbarProperties={colorbarProperties} colorbarProperties={colorbarProperties}
displaySets={displaySets} displaySets={displaySets}
volumeRenderingPresets={volumeRenderingPresets} volumeRenderingPresets={volumeRenderingPresets}

View File

@ -6,7 +6,7 @@ const getToggledClassName = (isToggled: boolean) => {
: '!text-common-bright hover:!bg-primary-dark hover:text-primary-light'; : '!text-common-bright hover:!bg-primary-dark hover:text-primary-light';
}; };
export default function getToolbarModule({ commandsManager, servicesManager }) { export default function getToolbarModule({ commandsManager, servicesManager }: withAppTypes) {
const { const {
toolGroupService, toolGroupService,
toolbarService, toolbarService,

View File

@ -8,7 +8,7 @@ import {
} from '@cornerstonejs/core'; } from '@cornerstonejs/core';
import * as csStreamingImageVolumeLoader from '@cornerstonejs/streaming-image-volume-loader'; import * as csStreamingImageVolumeLoader from '@cornerstonejs/streaming-image-volume-loader';
import { Enums as cs3DToolsEnums } from '@cornerstonejs/tools'; import { Enums as cs3DToolsEnums } from '@cornerstonejs/tools';
import { ServicesManager, Types } from '@ohif/core'; import { Types } from '@ohif/core';
import init from './init'; import init from './init';
import getCustomizationModule from './getCustomizationModule'; import getCustomizationModule from './getCustomizationModule';
@ -61,7 +61,7 @@ const cornerstoneExtension: Types.Extensions.Extension = {
*/ */
id, id,
onModeEnter: ({ servicesManager }): void => { onModeEnter: ({ servicesManager }: withAppTypes): void => {
const { cornerstoneViewportService, toolbarService, segmentationService } = const { cornerstoneViewportService, toolbarService, segmentationService } =
servicesManager.services; servicesManager.services;
toolbarService.registerEventForToolbarUpdate(cornerstoneViewportService, [ toolbarService.registerEventForToolbarUpdate(cornerstoneViewportService, [
@ -79,7 +79,7 @@ const cornerstoneExtension: Types.Extensions.Extension = {
]); ]);
}, },
onModeExit: ({ servicesManager }): void => { onModeExit: ({ servicesManager }: withAppTypes): void => {
const { cineService } = servicesManager.services; const { cineService } = servicesManager.services;
// Empty out the image load and retrieval pools to prevent memory leaks // Empty out the image load and retrieval pools to prevent memory leaks
// on the mode exits // on the mode exits
@ -132,7 +132,7 @@ const cornerstoneExtension: Types.Extensions.Extension = {
// const onNewImageHandler = jumpData => { // const onNewImageHandler = jumpData => {
// commandsManager.runCommand('jumpToImage', jumpData); // commandsManager.runCommand('jumpToImage', jumpData);
// }; // };
const { toolbarService } = (servicesManager as ServicesManager).services; const { toolbarService } = servicesManager.services;
return ( return (
<OHIFCornerstoneViewport <OHIFCornerstoneViewport

View File

@ -30,12 +30,9 @@ import nthLoader from './utils/nthLoader';
import interleaveTopToBottom from './utils/interleaveTopToBottom'; import interleaveTopToBottom from './utils/interleaveTopToBottom';
import initContextMenu from './initContextMenu'; import initContextMenu from './initContextMenu';
import initDoubleClick from './initDoubleClick'; import initDoubleClick from './initDoubleClick';
import { CornerstoneServices } from './types';
import initViewTiming from './utils/initViewTiming'; import initViewTiming from './utils/initViewTiming';
import { colormaps } from './utils/colormaps'; import { colormaps } from './utils/colormaps';
import { debounce } from 'lodash';
const { registerColormap } = csUtilities.colormap; const { registerColormap } = csUtilities.colormap;
// TODO: Cypress tests are currently grabbing this from the window? // TODO: Cypress tests are currently grabbing this from the window?
@ -101,7 +98,7 @@ export default async function init({
hangingProtocolService, hangingProtocolService,
viewportGridService, viewportGridService,
stateSyncService, stateSyncService,
} = servicesManager.services as CornerstoneServices; } = servicesManager.services;
window.services = servicesManager.services; window.services = servicesManager.services;
window.extensionManager = extensionManager; window.extensionManager = extensionManager;

View File

@ -19,7 +19,7 @@ function _getVolumeFromViewport(viewport) {
* @param srcViewportIndex Source viewport index * @param srcViewportIndex Source viewport index
* @returns array with viewport information. * @returns array with viewport information.
*/ */
function _getSyncedViewports(servicesManager, srcViewportId) { function _getSyncedViewports(servicesManager: AppTypes.ServicesManager, srcViewportId) {
const { viewportGridService, cornerstoneViewportService } = servicesManager.services; const { viewportGridService, cornerstoneViewportService } = servicesManager.services;
const { viewports: viewportsStates } = viewportGridService.getState(); const { viewports: viewportsStates } = viewportGridService.getState();
@ -48,7 +48,7 @@ function _getSyncedViewports(servicesManager, srcViewportId) {
.map(({ viewportId }) => ({ viewportId })); .map(({ viewportId }) => ({ viewportId }));
} }
function initCineService(servicesManager) { function initCineService(servicesManager: AppTypes.ServicesManager) {
const { cineService } = servicesManager.services; const { cineService } = servicesManager.services;
const getSyncedViewports = viewportId => { const getSyncedViewports = viewportId => {

View File

@ -178,7 +178,7 @@ const initMeasurementService = (
return csTools3DVer1MeasurementSource; return csTools3DVer1MeasurementSource;
}; };
const connectToolsToMeasurementService = servicesManager => { const connectToolsToMeasurementService = (servicesManager: AppTypes.ServicesManager) => {
const { const {
measurementService, measurementService,
displaySetService, displaySetService,

View File

@ -1,4 +1,4 @@
import { ServicesManager, Types } from '@ohif/core'; import { Types } from '@ohif/core';
import { cache as cs3DCache, Enums, volumeLoader, utilities as utils } from '@cornerstonejs/core'; import { cache as cs3DCache, Enums, volumeLoader, utilities as utils } from '@cornerstonejs/core';
import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType'; import getCornerstoneViewportType from '../../utils/getCornerstoneViewportType';
@ -17,9 +17,9 @@ class CornerstoneCacheService {
stackImageIds: Map<string, string[]> = new Map(); stackImageIds: Map<string, string[]> = new Map();
volumeImageIds: Map<string, string[]> = new Map(); volumeImageIds: Map<string, string[]> = new Map();
readonly servicesManager: ServicesManager; readonly servicesManager: AppTypes.ServicesManager;
constructor(servicesManager: ServicesManager) { constructor(servicesManager: AppTypes.ServicesManager) {
this.servicesManager = servicesManager; this.servicesManager = servicesManager;
} }

View File

@ -1,4 +1,4 @@
import { Types as OhifTypes, ServicesManager, PubSubService } from '@ohif/core'; import { Types as OhifTypes, PubSubService } from '@ohif/core';
import { import {
cache, cache,
Enums as csEnums, Enums as csEnums,
@ -60,7 +60,7 @@ class SegmentationService extends PubSubService {
}; };
segmentations: Record<string, Segmentation>; segmentations: Record<string, Segmentation>;
readonly servicesManager: ServicesManager; readonly servicesManager: AppTypes.ServicesManager;
highlightIntervalId = null; highlightIntervalId = null;
readonly EVENTS = EVENTS; readonly EVENTS = EVENTS;

View File

@ -1,7 +1,7 @@
import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools'; import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools';
import { getRenderingEngines, utilities } from '@cornerstonejs/core'; import { getRenderingEngines, utilities } from '@cornerstonejs/core';
import { pubSubServiceInterface, Types, ServicesManager } from '@ohif/core'; import { pubSubServiceInterface, Types } from '@ohif/core';
const EVENTS = { const EVENTS = {
TOOL_GROUP_CREATED: 'event::cornerstone::syncgroupservice:toolgroupcreated', TOOL_GROUP_CREATED: 'event::cornerstone::syncgroupservice:toolgroupcreated',
@ -40,7 +40,7 @@ export default class SyncGroupService {
}, },
}; };
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
listeners: { [key: string]: (...args: any[]) => void } = {}; listeners: { [key: string]: (...args: any[]) => void } = {};
EVENTS: { [key: string]: string }; EVENTS: { [key: string]: string };
synchronizerCreators: Record<string, SyncCreator> = { synchronizerCreators: Record<string, SyncCreator> = {
@ -55,8 +55,8 @@ export default class SyncGroupService {
synchronizersByType: { [key: string]: Synchronizer[] } = {}; synchronizersByType: { [key: string]: Synchronizer[] } = {};
constructor(serviceManager: ServicesManager) { constructor(servicesManager: AppTypes.ServicesManager) {
this.servicesManager = serviceManager; this.servicesManager = servicesManager;
this.listeners = {}; this.listeners = {};
this.EVENTS = EVENTS; this.EVENTS = EVENTS;
// //

View File

@ -32,7 +32,10 @@ export default class ToolGroupService {
}, },
}; };
serviceManager: any; servicesManager: AppTypes.ServicesManager;
cornerstoneViewportService: any;
viewportGridService: any;
uiNotificationService: any;
private toolGroupIds: Set<string> = new Set(); private toolGroupIds: Set<string> = new Set();
/** /**
* Service-specific * Service-specific
@ -40,9 +43,9 @@ export default class ToolGroupService {
listeners: { [key: string]: Function[] }; listeners: { [key: string]: Function[] };
EVENTS: { [key: string]: string }; EVENTS: { [key: string]: string };
constructor(serviceManager) { constructor(servicesManager: AppTypes.ServicesManager) {
const { cornerstoneViewportService, viewportGridService, uiNotificationService } = const { cornerstoneViewportService, viewportGridService, uiNotificationService } =
serviceManager.services; servicesManager.services;
this.cornerstoneViewportService = cornerstoneViewportService; this.cornerstoneViewportService = cornerstoneViewportService;
this.viewportGridService = viewportGridService; this.viewportGridService = viewportGridService;
this.uiNotificationService = uiNotificationService; this.uiNotificationService = uiNotificationService;

View File

@ -1,4 +1,4 @@
import { PubSubService, ServicesManager } from '@ohif/core'; import { PubSubService } from '@ohif/core';
import * as OhifTypes from '@ohif/core/types'; import * as OhifTypes from '@ohif/core/types';
import { import {
RenderingEngine, RenderingEngine,
@ -52,14 +52,14 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
enableResizeDetector: true; enableResizeDetector: true;
resizeRefreshRateMs: 200; resizeRefreshRateMs: 200;
resizeRefreshMode: 'debounce'; resizeRefreshMode: 'debounce';
servicesManager = null; servicesManager: AppTypes.ServicesManager = null;
resizeQueue = []; resizeQueue = [];
viewportResizeTimer = null; viewportResizeTimer = null;
gridResizeDelay = 50; gridResizeDelay = 50;
gridResizeTimeOut = null; gridResizeTimeOut = null;
constructor(servicesManager: ServicesManager) { constructor(servicesManager: AppTypes.ServicesManager) {
super(EVENTS); super(EVENTS);
this.renderingEngine = null; this.renderingEngine = null;
this.viewportGridResizeObserver = null; this.viewportGridResizeObserver = null;

View File

@ -8,7 +8,7 @@ import { Presentations } from '../../types/Presentation';
* updating the viewport. * updating the viewport.
*/ */
export interface IViewportService { export interface IViewportService {
servicesManager: unknown; servicesManager: AppTypes.ServicesManager;
hangingProtocolService: unknown; hangingProtocolService: unknown;
renderingEngine: unknown; renderingEngine: unknown;
viewportGridResizeObserver: unknown; viewportGridResizeObserver: unknown;

View File

@ -1,4 +1,3 @@
import { metaData } from '@cornerstonejs/core';
import { LengthTool, utilities } from '@cornerstonejs/tools'; import { LengthTool, utilities } from '@cornerstonejs/tools';
import callInputDialog from '../utils/callInputDialog'; import callInputDialog from '../utils/callInputDialog';
import getActiveViewportEnabledElement from '../utils/getActiveViewportEnabledElement'; import getActiveViewportEnabledElement from '../utils/getActiveViewportEnabledElement';
@ -49,7 +48,10 @@ function calculateLength3(pos1, pos2) {
export default CalibrationLineTool; export default CalibrationLineTool;
export function onCompletedCalibrationLine(servicesManager, csToolsEvent) { export function onCompletedCalibrationLine(
servicesManager: AppTypes.ServicesManager,
csToolsEvent
) {
const { uiDialogService, viewportGridService } = servicesManager.services; const { uiDialogService, viewportGridService } = servicesManager.services;
// calculate length (mm) with the current Pixel Spacing // calculate length (mm) with the current Pixel Spacing

View File

@ -0,0 +1,29 @@
/* eslint-disable @typescript-eslint/no-namespace */
import CornerstoneCacheServiceType from '../services/CornerstoneCacheService';
import CornerstoneViewportServiceType from '../services/ViewportService/CornerstoneViewportService';
import SegmentationServiceType from '../services/SegmentationService';
import SyncGroupServiceType from '../services/SyncGroupService';
import ToolGroupServiceType from '../services/ToolGroupService';
import ViewportActionCornersServiceType from '../services/ViewportActionCornersService/ViewportActionCornersService';
import ColorbarServiceType from '../services/ColorbarService';
declare global {
namespace AppTypes {
export type CornerstoneCacheService = CornerstoneCacheServiceType;
export type CornerstoneViewportService = CornerstoneViewportServiceType;
export type SegmentationService = SegmentationServiceType;
export type SyncGroupService = SyncGroupServiceType;
export type ToolGroupService = ToolGroupServiceType;
export type ViewportActionCornersService = ViewportActionCornersServiceType;
export type ColorbarService = ColorbarServiceType;
export interface Services {
cornerstoneViewportService?: CornerstoneViewportServiceType;
toolGroupService?: ToolGroupServiceType;
syncGroupService?: SyncGroupServiceType;
segmentationService?: SegmentationServiceType;
cornerstoneCacheService?: CornerstoneCacheServiceType;
viewportActionCornersService?: ViewportActionCornersServiceType;
colorbarService?: ColorbarServiceType;
}
}
}

View File

@ -1,5 +1,4 @@
import { ColorMapPreset } from './Colormap'; import { ColorMapPreset } from './Colormap';
import { CommandsManager, ServicesManager } from '@ohif/core';
export type ColorbarOptions = { export type ColorbarOptions = {
position: string; position: string;
@ -11,8 +10,6 @@ export type ColorbarOptions = {
export type ColorbarProps = { export type ColorbarProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager;
serviceManager: ServicesManager;
displaySets: Array<any>; displaySets: Array<any>;
colorbarProperties: ColorbarProperties; colorbarProperties: ColorbarProperties;
}; };

View File

@ -1,4 +1,4 @@
import { CommandsManager, ServicesManager } from '@ohif/core'; import { CommandsManager } from '@ohif/core';
export type ColorMapPreset = { export type ColorMapPreset = {
ColorSpace; ColorSpace;
@ -10,7 +10,7 @@ export type ColorMapPreset = {
export type ColormapProps = { export type ColormapProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
colormaps: Array<ColorMapPreset>; colormaps: Array<ColorMapPreset>;
displaySets: Array<any>; displaySets: Array<any>;
}; };

View File

@ -5,6 +5,7 @@ import SegmentationService from '../services/SegmentationService';
import CornerstoneCacheService from '../services/CornerstoneCacheService'; import CornerstoneCacheService from '../services/CornerstoneCacheService';
import CornerstoneViewportService from '../services/ViewportService/CornerstoneViewportService'; import CornerstoneViewportService from '../services/ViewportService/CornerstoneViewportService';
import ViewportActionCornersService from '../services/ViewportActionCornersService/ViewportActionCornersService'; import ViewportActionCornersService from '../services/ViewportActionCornersService/ViewportActionCornersService';
import ColorbarService from '../services/ColorbarService';
interface CornerstoneServices extends Types.Services { interface CornerstoneServices extends Types.Services {
cornerstoneViewportService: CornerstoneViewportService; cornerstoneViewportService: CornerstoneViewportService;
@ -13,6 +14,7 @@ interface CornerstoneServices extends Types.Services {
segmentationService: SegmentationService; segmentationService: SegmentationService;
cornerstoneCacheService: CornerstoneCacheService; cornerstoneCacheService: CornerstoneCacheService;
viewportActionCornersService: ViewportActionCornersService; viewportActionCornersService: ViewportActionCornersService;
colorbarService: ColorbarService;
} }
export default CornerstoneServices; export default CornerstoneServices;

View File

@ -1,4 +1,4 @@
import { ServicesManager, CommandsManager } from '@ohif/core'; import { CommandsManager } from '@ohif/core';
export type ViewportPreset = { export type ViewportPreset = {
name: string; name: string;
@ -15,7 +15,7 @@ export type ViewportPreset = {
export type VolumeRenderingPresetsProps = { export type VolumeRenderingPresetsProps = {
viewportId: string; viewportId: string;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
commandsManager: CommandsManager; commandsManager: CommandsManager;
volumeRenderingPresets: ViewportPreset[]; volumeRenderingPresets: ViewportPreset[];
}; };
@ -30,7 +30,7 @@ export type VolumeRenderingPresetsContentProps = {
export type VolumeRenderingOptionsProps = { export type VolumeRenderingOptionsProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
volumeRenderingQualityRange: VolumeRenderingQualityRange; volumeRenderingQualityRange: VolumeRenderingQualityRange;
}; };
@ -43,24 +43,24 @@ export type VolumeRenderingQualityRange = {
export type VolumeRenderingQualityProps = { export type VolumeRenderingQualityProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
volumeRenderingQualityRange: VolumeRenderingQualityRange; volumeRenderingQualityRange: VolumeRenderingQualityRange;
}; };
export type VolumeShiftProps = { export type VolumeShiftProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
}; };
export type VolumeShadeProps = { export type VolumeShadeProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
}; };
export type VolumeLightingProps = { export type VolumeLightingProps = {
viewportId: string; viewportId: string;
commandsManager: CommandsManager; commandsManager: CommandsManager;
serviceManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
}; };

View File

@ -1,10 +1,12 @@
import { DisplaySetService, ViewportGridService } from '@ohif/core';
const IMAGE_SLICE_SYNC_NAME = 'IMAGE_SLICE_SYNC'; const IMAGE_SLICE_SYNC_NAME = 'IMAGE_SLICE_SYNC';
export default function toggleImageSliceSync({ export default function toggleImageSliceSync({
servicesManager, servicesManager,
viewports: providedViewports, viewports: providedViewports,
syncId, syncId,
}) { }: withAppTypes) {
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
servicesManager.services; servicesManager.services;
@ -46,7 +48,7 @@ export default function toggleImageSliceSync({
}); });
} }
function disableSync(syncName, servicesManager) { function disableSync(syncName, servicesManager: AppTypes.ServicesManager) {
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
servicesManager.services; servicesManager.services;
const viewports = getReconstructableStackViewports(viewportGridService, displaySetService); const viewports = getReconstructableStackViewports(viewportGridService, displaySetService);
@ -68,7 +70,10 @@ function disableSync(syncName, servicesManager) {
* Gets the consistent spacing stack viewport types, which are the ones which * Gets the consistent spacing stack viewport types, which are the ones which
* can be navigated using the stack image sync right now. * can be navigated using the stack image sync right now.
*/ */
function getReconstructableStackViewports(viewportGridService, displaySetService) { function getReconstructableStackViewports(
viewportGridService: ViewportGridService,
displaySetService: DisplaySetService
) {
let { viewports } = viewportGridService.getState(); let { viewports } = viewportGridService.getState();
viewports = [...viewports.values()]; viewports = [...viewports.values()];

View File

@ -1,3 +1,5 @@
import { DisplaySetService, ViewportGridService } from '@ohif/core';
const VOI_SYNC_NAME = 'VOI_SYNC'; const VOI_SYNC_NAME = 'VOI_SYNC';
const getSyncId = modality => `${VOI_SYNC_NAME}_${modality}`; const getSyncId = modality => `${VOI_SYNC_NAME}_${modality}`;
@ -6,7 +8,7 @@ export default function toggleVOISliceSync({
servicesManager, servicesManager,
viewports: providedViewports, viewports: providedViewports,
syncId, syncId,
}) { }: withAppTypes) {
const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } = const { syncGroupService, viewportGridService, displaySetService, cornerstoneViewportService } =
servicesManager.services; servicesManager.services;
@ -52,7 +54,7 @@ export default function toggleVOISliceSync({
} }
} }
function disableSync(modalityViewports, syncId, servicesManager) { function disableSync(modalityViewports, syncId, servicesManager: AppTypes.ServicesManager) {
const { syncGroupService, cornerstoneViewportService } = servicesManager.services; const { syncGroupService, cornerstoneViewportService } = servicesManager.services;
const viewports = modalityViewports; const viewports = modalityViewports;
@ -70,7 +72,10 @@ function disableSync(modalityViewports, syncId, servicesManager) {
}); });
} }
function groupViewportsByModality(viewportGridService, displaySetService) { function groupViewportsByModality(
viewportGridService: ViewportGridService,
displaySetService: DisplaySetService
) {
let { viewports } = viewportGridService.getState(); let { viewports } = viewportGridService.getState();
viewports = [...viewports.values()]; viewports = [...viewports.values()];

View File

@ -5,7 +5,11 @@ import { DicomMetadataStore } from '@ohif/core';
* *
* @param {*} servicesManager * @param {*} servicesManager
*/ */
async function createReportAsync({ servicesManager, getReport, reportType = 'measurement' }) { async function createReportAsync({
servicesManager,
getReport,
reportType = 'measurement',
}: withAppTypes) {
const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services; const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services;
const loadingDialogId = uiDialogService.create({ const loadingDialogId = uiDialogService.create({
showOverlay: true, showOverlay: true,

View File

@ -1,18 +1,13 @@
import React, { ReactElement, useCallback, useEffect, useState } from 'react'; import React, { ReactElement, useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Icon, useModal } from '@ohif/ui'; import { Icon, useModal } from '@ohif/ui';
import { ExtensionManager, ServicesManager, Types } from '@ohif/core'; import { Types } from '@ohif/core';
import DataSourceConfigurationModalComponent from './DataSourceConfigurationModalComponent'; import DataSourceConfigurationModalComponent from './DataSourceConfigurationModalComponent';
type DataSourceConfigurationComponentProps = {
servicesManager: ServicesManager;
extensionManager: ExtensionManager;
};
function DataSourceConfigurationComponent({ function DataSourceConfigurationComponent({
servicesManager, servicesManager,
extensionManager, extensionManager,
}: DataSourceConfigurationComponentProps): ReactElement { }: withAppTypes): ReactElement {
const { t } = useTranslation('DataSourceConfiguration'); const { t } = useTranslation('DataSourceConfiguration');
const { show, hide } = useModal(); const { show, hide } = useModal();

View File

@ -1,9 +1,9 @@
import React, { useEffect, useState, useCallback } from 'react'; import React, { useEffect, useState, useCallback } from 'react';
import { SidePanel } from '@ohif/ui'; import { SidePanel } from '@ohif/ui';
import { PanelService, ServicesManager, Types } from '@ohif/core'; import { Types } from '@ohif/core';
export type SidePanelWithServicesProps = { export type SidePanelWithServicesProps = {
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
side: 'left' | 'right'; side: 'left' | 'right';
className: string; className: string;
activeTabIndex: number; activeTabIndex: number;
@ -19,7 +19,7 @@ const SidePanelWithServices = ({
expandedWidth, expandedWidth,
...props ...props
}: SidePanelWithServicesProps) => { }: SidePanelWithServicesProps) => {
const panelService: PanelService = servicesManager?.services?.panelService; const panelService = servicesManager?.services?.panelService;
// Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM. // Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM.
// Thus going to the Study List page and back to the viewer resets this flag for a SidePanel. // Thus going to the Study List page and back to the viewer resets this flag for a SidePanel.

View File

@ -1,6 +1,6 @@
import * as ContextMenuItemsBuilder from './ContextMenuItemsBuilder'; import * as ContextMenuItemsBuilder from './ContextMenuItemsBuilder';
import ContextMenu from '../../../../platform/ui/src/components/ContextMenu/ContextMenu'; import ContextMenu from '../../../../platform/ui/src/components/ContextMenu/ContextMenu';
import { CommandsManager, ServicesManager, Types } from '@ohif/core'; import { CommandsManager } from '@ohif/core';
import { annotation as CsAnnotation } from '@cornerstonejs/tools'; import { annotation as CsAnnotation } from '@cornerstonejs/tools';
import { Menu, MenuItem, Point, ContextMenuProps } from './types'; import { Menu, MenuItem, Point, ContextMenuProps } from './types';
@ -17,11 +17,11 @@ import { Menu, MenuItem, Point, ContextMenuProps } from './types';
*/ */
export default class ContextMenuController { export default class ContextMenuController {
commandsManager: CommandsManager; commandsManager: CommandsManager;
services: Types.Services; services: AppTypes.Services;
menuItems: Menu[] | MenuItem[]; menuItems: Menu[] | MenuItem[];
constructor(servicesManager: ServicesManager, commandsManager: CommandsManager) { constructor(servicesManager: AppTypes.ServicesManager, commandsManager: CommandsManager) {
this.services = servicesManager.services as Obj; this.services = servicesManager.services;
this.commandsManager = commandsManager; this.commandsManager = commandsManager;
} }

View File

@ -42,7 +42,7 @@ class GoogleCloudDataSourceConfigurationAPI implements Types.BaseDataSourceConfi
private _fetchOptions: { method: string; headers: unknown }; private _fetchOptions: { method: string; headers: unknown };
private _dataSourceName: string; private _dataSourceName: string;
constructor(dataSourceName, servicesManager, extensionManager) { constructor(dataSourceName, servicesManager: AppTypes.ServicesManager, extensionManager) {
this._dataSourceName = dataSourceName; this._dataSourceName = dataSourceName;
this._extensionManager = extensionManager; this._extensionManager = extensionManager;
const userAuthenticationService = servicesManager.services.userAuthenticationService; const userAuthenticationService = servicesManager.services.userAuthenticationService;

View File

@ -8,13 +8,13 @@ import {
processResults, processResults,
processSeriesResults, processSeriesResults,
} from './qido.js'; } from './qido.js';
import dcm4cheeReject from './dcm4cheeReject'; import dcm4cheeReject from './dcm4cheeReject.js';
import getImageId from './utils/getImageId'; import getImageId from './utils/getImageId.js';
import dcmjs from 'dcmjs'; import dcmjs from 'dcmjs';
import { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js'; import { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js';
import StaticWadoClient from './utils/StaticWadoClient'; import StaticWadoClient from './utils/StaticWadoClient';
import getDirectURL from '../utils/getDirectURL'; import getDirectURL from '../utils/getDirectURL.js';
import { fixBulkDataURI } from './utils/fixBulkDataURI'; import { fixBulkDataURI } from './utils/fixBulkDataURI';
const { DicomMetaDictionary, DicomDict } = dcmjs.data; const { DicomMetaDictionary, DicomDict } = dcmjs.data;
@ -89,9 +89,9 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
}; };
generateWadoHeader = () => { generateWadoHeader = () => {
let authorizationHeader = getAuthrorizationHeader(); const authorizationHeader = getAuthrorizationHeader();
//Generate accept header depending on config params //Generate accept header depending on config params
let formattedAcceptHeader = utils.generateAcceptHeader( const formattedAcceptHeader = utils.generateAcceptHeader(
dicomWebConfig.acceptHeader, dicomWebConfig.acceptHeader,
dicomWebConfig.requestTransferSyntaxUID, dicomWebConfig.requestTransferSyntaxUID,
dicomWebConfig.omitQuotationForMultipartRequest dicomWebConfig.omitQuotationForMultipartRequest

View File

@ -9,7 +9,7 @@ import { createDicomWebApi } from '../DicomWebDataSource/index';
* dicomWeb configuration array * dicomWeb configuration array
* *
*/ */
function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) { function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager: AppTypes.ServicesManager) {
const { name } = dicomWebProxyConfig; const { name } = dicomWebProxyConfig;
let dicomWebDelegate = undefined; let dicomWebDelegate = undefined;
@ -21,7 +21,7 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
throw new Error(`No url for '${name}'`); throw new Error(`No url for '${name}'`);
} else { } else {
const response = await fetch(url); const response = await fetch(url);
let data = await response.json(); const data = await response.json();
if (!data.servers?.dicomWeb?.[0]) { if (!data.servers?.dicomWeb?.[0]) {
throw new Error('Invalid configuration returned by url'); throw new Error('Invalid configuration returned by url');
} }

View File

@ -167,7 +167,7 @@ export const callByRetrieveAETitle = ({
function createMergeDataSourceApi( function createMergeDataSourceApi(
mergeConfig: MergeConfig, mergeConfig: MergeConfig,
servicesManager: unknown, servicesManager: AppTypes.ServicesManager,
extensionManager extensionManager
) { ) {
const { seriesMerge } = mergeConfig; const { seriesMerge } = mergeConfig;

View File

@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { utils, ServicesManager } from '@ohif/core'; import { utils } from '@ohif/core';
import { import {
MeasurementTable, MeasurementTable,
Dialog, Dialog,
@ -24,14 +24,13 @@ export default function PanelMeasurementTable({
servicesManager, servicesManager,
commandsManager, commandsManager,
extensionManager, extensionManager,
}): React.FunctionComponent { }: withAppTypes): React.FunctionComponent {
const { t } = useTranslation('MeasurementTable'); const { t } = useTranslation('MeasurementTable');
const [viewportGrid, viewportGridService] = useViewportGrid(); const [viewportGrid, viewportGridService] = useViewportGrid();
const { activeViewportId, viewports } = viewportGrid; const { activeViewportId, viewports } = viewportGrid;
const { measurementService, uiDialogService, uiNotificationService, displaySetService } = ( const { measurementService, uiDialogService, uiNotificationService, displaySetService } =
servicesManager as ServicesManager servicesManager.services;
).services;
const [displayMeasurements, setDisplayMeasurements] = useState([]); const [displayMeasurements, setDisplayMeasurements] = useState([]);
useEffect(() => { useEffect(() => {
@ -245,7 +244,7 @@ export default function PanelMeasurementTable({
} }
PanelMeasurementTable.propTypes = { PanelMeasurementTable.propTypes = {
servicesManager: PropTypes.instanceOf(ServicesManager).isRequired, servicesManager: PropTypes.object.isRequired,
}; };
function _getMappedMeasurements(measurementService) { function _getMappedMeasurements(measurementService) {

View File

@ -16,7 +16,7 @@ function PanelStudyBrowser({
getStudiesForPatientByMRN, getStudiesForPatientByMRN,
requestDisplaySetCreationForStudy, requestDisplaySetCreationForStudy,
dataSource, dataSource,
}) { }: withAppTypes) {
const { hangingProtocolService, displaySetService, uiNotificationService } = const { hangingProtocolService, displaySetService, uiNotificationService } =
servicesManager.services; servicesManager.services;
const navigate = useNavigate(); const navigate = useNavigate();

View File

@ -1,9 +1,8 @@
import React, { useEffect, useState, useCallback } from 'react'; import React, { useEffect, useState, useCallback } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { LayoutSelector as OHIFLayoutSelector, ToolbarButton } from '@ohif/ui'; import { LayoutSelector as OHIFLayoutSelector, ToolbarButton } from '@ohif/ui';
import { ServicesManager } from '@ohif/core';
function LegacyLayoutSelectorWithServices({ servicesManager, ...props }) { function LegacyLayoutSelectorWithServices({ servicesManager, ...props }: withAppTypes) {
const { toolbarService } = servicesManager.services; const { toolbarService } = servicesManager.services;
const onSelection = useCallback( const onSelection = useCallback(
@ -76,7 +75,7 @@ LayoutSelector.propTypes = {
rows: PropTypes.number, rows: PropTypes.number,
columns: PropTypes.number, columns: PropTypes.number,
onLayoutChange: PropTypes.func, onLayoutChange: PropTypes.func,
servicesManager: PropTypes.instanceOf(ServicesManager), servicesManager: PropTypes.object.isRequired,
}; };
LayoutSelector.defaultProps = { LayoutSelector.defaultProps = {

View File

@ -1,7 +1,6 @@
import React, { useEffect, useState, useCallback } from 'react'; import React, { useEffect, useState, useCallback } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { LayoutSelector as OHIFLayoutSelector, ToolbarButton, LayoutPreset } from '@ohif/ui'; import { LayoutSelector as OHIFLayoutSelector, ToolbarButton, LayoutPreset } from '@ohif/ui';
import { ServicesManager } from '@ohif/core';
const defaultCommonPresets = [ const defaultCommonPresets = [
{ {
@ -45,7 +44,7 @@ const _areSelectorsValid = (hp, displaySets, hangingProtocolService) => {
); );
}; };
const generateAdvancedPresets = ({ servicesManager }) => { const generateAdvancedPresets = ({ servicesManager }: withAppTypes) => {
const { hangingProtocolService, viewportGridService, displaySetService } = const { hangingProtocolService, viewportGridService, displaySetService } =
servicesManager.services; servicesManager.services;
@ -84,7 +83,11 @@ const generateAdvancedPresets = ({ servicesManager }) => {
.filter(preset => preset !== null); .filter(preset => preset !== null);
}; };
function ToolbarLayoutSelectorWithServices({ commandsManager, servicesManager, ...props }) { function ToolbarLayoutSelectorWithServices({
commandsManager,
servicesManager,
...props
}: withAppTypes) {
const [isDisabled, setIsDisabled] = useState(false); const [isDisabled, setIsDisabled] = useState(false);
const handleMouseEnter = () => { const handleMouseEnter = () => {
@ -129,7 +132,7 @@ function LayoutSelector({
servicesManager, servicesManager,
tooltipDisabled, tooltipDisabled,
...rest ...rest
}) { }: withAppTypes) {
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const { customizationService } = servicesManager.services; const { customizationService } = servicesManager.services;
@ -225,7 +228,7 @@ LayoutSelector.propTypes = {
rows: PropTypes.number, rows: PropTypes.number,
columns: PropTypes.number, columns: PropTypes.number,
onLayoutChange: PropTypes.func, onLayoutChange: PropTypes.func,
servicesManager: PropTypes.instanceOf(ServicesManager), servicesManager: PropTypes.object.isRequired,
}; };
LayoutSelector.defaultProps = { LayoutSelector.defaultProps = {

View File

@ -10,7 +10,7 @@ function ToolbarSplitButtonWithServices({
renderer, renderer,
onInteraction, onInteraction,
servicesManager, servicesManager,
}) { }: withAppTypes) {
const { toolbarService } = servicesManager?.services; const { toolbarService } = servicesManager?.services;
/* Bubbles up individual item clicks */ /* Bubbles up individual item clicks */

View File

@ -10,7 +10,12 @@ import { Toolbar } from '../Toolbar/Toolbar';
const { availableLanguages, defaultLanguage, currentLanguage } = i18n; const { availableLanguages, defaultLanguage, currentLanguage } = i18n;
function ViewerHeader({ hotkeysManager, extensionManager, servicesManager, appConfig }) { function ViewerHeader({
hotkeysManager,
extensionManager,
servicesManager,
appConfig,
}: withAppTypes) {
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); const location = useLocation();

View File

@ -2,7 +2,7 @@ import React, { useEffect, useState, useCallback } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { ErrorBoundary, LoadingIndicatorProgress, InvestigationalUseDialog } from '@ohif/ui'; import { ErrorBoundary, LoadingIndicatorProgress, InvestigationalUseDialog } from '@ohif/ui';
import { ServicesManager, HangingProtocolService, CommandsManager } from '@ohif/core'; import { HangingProtocolService, CommandsManager } from '@ohif/core';
import { useAppConfig } from '@state'; import { useAppConfig } from '@state';
import ViewerHeader from './ViewerHeader'; import ViewerHeader from './ViewerHeader';
import SidePanelWithServices from '../Components/SidePanelWithServices'; import SidePanelWithServices from '../Components/SidePanelWithServices';
@ -18,7 +18,7 @@ function ViewerLayout({
ViewportGridComp, ViewportGridComp,
leftPanelClosed = false, leftPanelClosed = false,
rightPanelClosed = false, rightPanelClosed = false,
}): React.FunctionComponent { }: withAppTypes): React.FunctionComponent {
const [appConfig] = useAppConfig(); const [appConfig] = useAppConfig();
const { panelService, hangingProtocolService } = servicesManager.services; const { panelService, hangingProtocolService } = servicesManager.services;
@ -167,7 +167,7 @@ ViewerLayout.propTypes = {
getModuleEntry: PropTypes.func.isRequired, getModuleEntry: PropTypes.func.isRequired,
}).isRequired, }).isRequired,
commandsManager: PropTypes.instanceOf(CommandsManager), commandsManager: PropTypes.instanceOf(CommandsManager),
servicesManager: PropTypes.instanceOf(ServicesManager), servicesManager: PropTypes.object.isRequired,
// From modes // From modes
leftPanels: PropTypes.array, leftPanels: PropTypes.array,
rightPanels: PropTypes.array, rightPanels: PropTypes.array,

View File

@ -1,4 +1,4 @@
import { ServicesManager, utils, Types } from '@ohif/core'; import { utils, Types } from '@ohif/core';
import { ContextMenuController, defaultContextMenu } from './CustomizableContextMenu'; import { ContextMenuController, defaultContextMenu } from './CustomizableContextMenu';
import DicomTagBrowser from './DicomTagBrowser/DicomTagBrowser'; import DicomTagBrowser from './DicomTagBrowser/DicomTagBrowser';
@ -12,7 +12,6 @@ import { NavigateHistory } from './types/commandModuleTypes';
import { history } from '@ohif/app'; import { history } from '@ohif/app';
const { subscribeToNextViewportGridChange } = utils; const { subscribeToNextViewportGridChange } = utils;
export type HangingProtocolParams = { export type HangingProtocolParams = {
protocolId?: string; protocolId?: string;
stageIndex?: number; stageIndex?: number;
@ -38,7 +37,7 @@ const commandsModule = ({
viewportGridService, viewportGridService,
displaySetService, displaySetService,
stateSyncService, stateSyncService,
} = (servicesManager as ServicesManager).services; } = servicesManager.services;
// Define a context menu controller for use with any context menus // Define a context menu controller for use with any context menus
const contextMenuController = new ContextMenuController(servicesManager, commandsManager); const contextMenuController = new ContextMenuController(servicesManager, commandsManager);

View File

@ -1,5 +1,4 @@
import React, { useEffect, useState, useCallback, ReactElement } from 'react'; import React, { useEffect, useState, useCallback, ReactElement } from 'react';
import { ServicesManager } from '@ohif/core';
import { ProgressDropdown } from '@ohif/ui'; import { ProgressDropdown } from '@ohif/ui';
const workflowStepsToDropdownOptions = (steps = []) => const workflowStepsToDropdownOptions = (steps = []) =>
@ -11,11 +10,7 @@ const workflowStepsToDropdownOptions = (steps = []) =>
completed: false, completed: false,
})); }));
function ProgressDropdownWithService({ function ProgressDropdownWithService({ servicesManager }: withAppTypes): ReactElement {
servicesManager,
}: {
servicesManager: ServicesManager;
}): ReactElement {
const { workflowStepsService } = servicesManager.services; const { workflowStepsService } = servicesManager.services;
const [activeStepId, setActiveStepId] = useState(workflowStepsService.activeWorkflowStep?.id); const [activeStepId, setActiveStepId] = useState(workflowStepsService.activeWorkflowStep?.id);

View File

@ -5,7 +5,7 @@
import { createDicomWebApi } from './DicomWebDataSource/index.js'; import { createDicomWebApi } from './DicomWebDataSource/index.js';
import { createDicomJSONApi } from './DicomJSONDataSource/index.js'; import { createDicomJSONApi } from './DicomJSONDataSource/index.js';
import { createDicomLocalApi } from './DicomLocalDataSource/index.js'; import { createDicomLocalApi } from './DicomLocalDataSource/index.js';
import { createDicomWebProxyApi } from './DicomWebProxyDataSource/index.js'; import { createDicomWebProxyApi } from './DicomWebProxyDataSource/index';
import { createMergeDataSourceApi } from './MergeDataSource/index'; import { createMergeDataSourceApi } from './MergeDataSource/index';
/** /**

View File

@ -13,7 +13,7 @@ const getClassName = isToggled => {
}; };
}; };
export default function getToolbarModule({ commandsManager, servicesManager }) { export default function getToolbarModule({ commandsManager, servicesManager }: withAppTypes) {
const { cineService } = servicesManager.services; const { cineService } = servicesManager.services;
return [ return [
{ {

View File

@ -1,4 +1,4 @@
import { ServicesManager, CommandsManager, ExtensionManager } from '@ohif/core'; import { CommandsManager, ExtensionManager } from '@ohif/core';
import LineChartViewport from './Components/LineChartViewport/index'; import LineChartViewport from './Components/LineChartViewport/index';
const getViewportModule = ({ const getViewportModule = ({
@ -6,7 +6,7 @@ const getViewportModule = ({
commandsManager, commandsManager,
extensionManager, extensionManager,
}: { }: {
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
commandsManager: CommandsManager; commandsManager: CommandsManager;
extensionManager: ExtensionManager; extensionManager: ExtensionManager;
}) => { }) => {

View File

@ -10,7 +10,11 @@ const metadataProvider = classes.MetadataProvider;
* @param {Object} servicesManager * @param {Object} servicesManager
* @param {Object} configuration * @param {Object} configuration
*/ */
export default function init({ servicesManager, configuration = {}, commandsManager }): void { export default function init({
servicesManager,
configuration = {},
commandsManager,
}: withAppTypes): void {
const { stateSyncService, toolbarService, cineService, viewportGridService } = const { stateSyncService, toolbarService, cineService, viewportGridService } =
servicesManager.services; servicesManager.services;

View File

@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { ServicesManager, ExtensionManager, CommandsManager, DicomMetadataStore } from '@ohif/core'; import { ExtensionManager, CommandsManager, DicomMetadataStore } from '@ohif/core';
import { MeasurementTable } from '@ohif/ui'; import { MeasurementTable } from '@ohif/ui';
import { withTranslation, WithTranslation } from 'react-i18next'; import { withTranslation, WithTranslation } from 'react-i18next';
import { EVENTS as MicroscopyEvents } from '../../services/MicroscopyService'; import { EVENTS as MicroscopyEvents } from '../../services/MicroscopyService';
@ -53,7 +53,7 @@ interface IMicroscopyPanelProps extends WithTranslation {
onRejectComplete?: PropTypes.func; // callback when rejected annotations onRejectComplete?: PropTypes.func; // callback when rejected annotations
// //
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
extensionManager: ExtensionManager; extensionManager: ExtensionManager;
commandsManager: CommandsManager; commandsManager: CommandsManager;
} }

View File

@ -1,4 +1,4 @@
import { ServicesManager, CommandsManager, ExtensionManager } from '@ohif/core'; import { CommandsManager, ExtensionManager } from '@ohif/core';
import styles from './utils/styles'; import styles from './utils/styles';
import callInputDialog from './utils/callInputDialog'; import callInputDialog from './utils/callInputDialog';
@ -7,7 +7,7 @@ export default function getCommandsModule({
commandsManager, commandsManager,
extensionManager, extensionManager,
}: { }: {
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
commandsManager: CommandsManager; commandsManager: CommandsManager;
extensionManager: ExtensionManager; extensionManager: ExtensionManager;
}) { }) {

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { ServicesManager, CommandsManager, ExtensionManager } from '@ohif/core'; import { CommandsManager, ExtensionManager } from '@ohif/core';
import { useViewportGrid } from '@ohif/ui'; import { useViewportGrid } from '@ohif/ui';
import MicroscopyPanel from './components/MicroscopyPanel/MicroscopyPanel'; import MicroscopyPanel from './components/MicroscopyPanel/MicroscopyPanel';
@ -13,7 +13,7 @@ export default function getPanelModule({
extensionManager, extensionManager,
servicesManager, servicesManager,
}: { }: {
servicesManager: ServicesManager; servicesManager: AppTypes.ServicesManager;
commandsManager: CommandsManager; commandsManager: CommandsManager;
extensionManager: ExtensionManager; extensionManager: ExtensionManager;
}) { }) {

View File

@ -18,17 +18,17 @@ const EVENTS = {
* ROI annotations relevant to the application * ROI annotations relevant to the application
*/ */
export default class MicroscopyService extends PubSubService { export default class MicroscopyService extends PubSubService {
public static REGISTRATION = serviceManager => { public static REGISTRATION = servicesManager => {
return { return {
name: 'microscopyService', name: 'microscopyService',
altName: 'MicroscopyService', altName: 'MicroscopyService',
create: ({ configuration = {} }) => { create: ({ configuration = {} }) => {
return new MicroscopyService(serviceManager); return new MicroscopyService(servicesManager);
}, },
}; };
}; };
serviceManager: any; servicesManager: any;
managedViewers = new Set(); managedViewers = new Set();
roiUids = new Set(); roiUids = new Set();
@ -36,9 +36,9 @@ export default class MicroscopyService extends PubSubService {
selectedAnnotation = null; selectedAnnotation = null;
pendingFocus = false; pendingFocus = false;
constructor(serviceManager) { constructor(servicesManager) {
super(EVENTS); super(EVENTS);
this.serviceManager = serviceManager; this.servicesManager = servicesManager;
this._onRoiAdded = this._onRoiAdded.bind(this); this._onRoiAdded = this._onRoiAdded.bind(this);
this._onRoiModified = this._onRoiModified.bind(this); this._onRoiModified = this._onRoiModified.bind(this);
this._onRoiRemoved = this._onRoiRemoved.bind(this); this._onRoiRemoved = this._onRoiRemoved.bind(this);

View File

@ -0,0 +1,11 @@
/* eslint-disable @typescript-eslint/no-namespace */
import MicroscopyServiceType from '../services/MicroscopyService';
declare global {
namespace AppTypes {
export type MicroscopyService = MicroscopyServiceType;
export interface Services {
microscopyService?: MicroscopyServiceType;
}
}
}

View File

@ -9,7 +9,7 @@ import { StaticWadoClient } from '@ohif/extension-default';
* @param param0 * @param param0
* @returns * @returns
*/ */
export default function getDicomWebClient({ extensionManager, servicesManager }) { export default function getDicomWebClient({ extensionManager, servicesManager }: withAppTypes) {
const dataSourceConfig = window.config.dataSources.find( const dataSourceConfig = window.config.dataSources.find(
ds => ds.sourceName === extensionManager.activeDataSource ds => ds.sourceName === extensionManager.activeDataSource
); );

View File

@ -1,11 +0,0 @@
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true,
"moduleResolution": "node"
}
}

View File

@ -24,7 +24,7 @@ const SR_SOPCLASSHANDLERID = '@ohif/extension-cornerstone-dicom-sr.sopClassHandl
* @param {*} param0 * @param {*} param0
*/ */
function TrackedMeasurementsContextProvider( function TrackedMeasurementsContextProvider(
{ servicesManager, commandsManager, extensionManager }, // Bound by consumer { servicesManager, commandsManager, extensionManager }: withAppTypes, // Bound by consumer
{ children } // Component props { children } // Component props
) { ) {
const [appConfig] = useAppConfig(); const [appConfig] = useAppConfig();

View File

@ -1,6 +1,10 @@
import { hydrateStructuredReport as baseHydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr'; import { hydrateStructuredReport as baseHydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr';
function hydrateStructuredReport({ servicesManager, extensionManager, appConfig }, ctx, evt) { function hydrateStructuredReport(
{ servicesManager, extensionManager, appConfig }: withAppTypes,
ctx,
evt
) {
const { displaySetService } = servicesManager.services; const { displaySetService } = servicesManager.services;
const { viewportId, displaySetInstanceUID } = evt; const { viewportId, displaySetInstanceUID } = evt;
const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID); const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);

View File

@ -9,21 +9,18 @@ const RESPONSE = {
NO_NOT_FOR_SERIES: 4, NO_NOT_FOR_SERIES: 4,
}; };
function promptTrackNewStudy({ servicesManager, extensionManager }, ctx, evt) { function promptTrackNewStudy({ servicesManager, extensionManager }: withAppTypes, ctx, evt) {
const { UIViewportDialogService } = servicesManager.services; const { uiViewportDialogService } = servicesManager.services;
const appConfig = extensionManager._appConfig;
// When the state change happens after a promise, the state machine sends the retult in evt.data; // When the state change happens after a promise, the state machine sends the retult in evt.data;
// In case of direct transition to the state, the state machine sends the data in evt; // In case of direct transition to the state, the state machine sends the data in evt;
const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt.data || evt; const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt.data || evt;
return new Promise(async function (resolve, reject) { return new Promise(async function (resolve, reject) {
let promptResult = appConfig?.disableConfirmationPrompts let promptResult = await _askTrackMeasurements(uiViewportDialogService, viewportId);
? RESPONSE.SET_STUDY_AND_SERIES
: await _askTrackMeasurements(UIViewportDialogService, viewportId);
if (promptResult === RESPONSE.SET_STUDY_AND_SERIES) { if (promptResult === RESPONSE.SET_STUDY_AND_SERIES) {
promptResult = ctx.isDirty promptResult = ctx.isDirty
? await _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) ? await _askSaveDiscardOrCancel(uiViewportDialogService, viewportId)
: RESPONSE.SET_STUDY_AND_SERIES; : RESPONSE.SET_STUDY_AND_SERIES;
} }
@ -37,7 +34,10 @@ function promptTrackNewStudy({ servicesManager, extensionManager }, ctx, evt) {
}); });
} }
function _askTrackMeasurements(UIViewportDialogService, viewportId) { function _askTrackMeasurements(
UIViewportDialogService: AppTypes.UIViewportDialogService,
viewportId
) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
const message = i18n.t('MeasurementTable:Track measurements for this series?'); const message = i18n.t('MeasurementTable:Track measurements for this series?');
const actions = [ const actions = [
@ -78,7 +78,10 @@ function _askTrackMeasurements(UIViewportDialogService, viewportId) {
}); });
} }
function _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) { function _askSaveDiscardOrCancel(
UIViewportDialogService: AppTypes.UIViewportDialogService,
viewportId
) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
const message = const message =
'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?'; 'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?';

View File

@ -18,7 +18,7 @@ const DISPLAY_STUDY_SUMMARY_INITIAL_VALUE = {
description: '', // 'CHEST/ABD/PELVIS W CONTRAST', description: '', // 'CHEST/ABD/PELVIS W CONTRAST',
}; };
function PanelMeasurementTableTracking({ servicesManager, extensionManager }) { function PanelMeasurementTableTracking({ servicesManager, extensionManager }: withAppTypes) {
const [viewportGrid] = useViewportGrid(); const [viewportGrid] = useViewportGrid();
const { t } = useTranslation('MeasurementTable'); const { t } = useTranslation('MeasurementTable');
const [measurementChangeTimestamp, setMeasurementsUpdated] = useState(Date.now().toString()); const [measurementChangeTimestamp, setMeasurementsUpdated] = useState(Date.now().toString());

View File

@ -18,7 +18,7 @@ function PanelStudyBrowserTracking({
getStudiesForPatientByMRN, getStudiesForPatientByMRN,
requestDisplaySetCreationForStudy, requestDisplaySetCreationForStudy,
dataSource, dataSource,
}) { }: withAppTypes) {
const { const {
displaySetService, displaySetService,
uiDialogService, uiDialogService,

View File

@ -21,7 +21,11 @@ function _getStudyForPatientUtility(extensionManager) {
* @param {object} commandsManager * @param {object} commandsManager
* @param {object} extensionManager * @param {object} extensionManager
*/ */
function WrappedPanelStudyBrowserTracking({ commandsManager, extensionManager, servicesManager }) { function WrappedPanelStudyBrowserTracking({
commandsManager,
extensionManager,
servicesManager,
}: withAppTypes) {
const dataSource = extensionManager.getActiveDataSource()[0]; const dataSource = extensionManager.getActiveDataSource()[0];
const getStudiesForPatientByMRN = _getStudyForPatientUtility(extensionManager); const getStudiesForPatientByMRN = _getStudyForPatientUtility(extensionManager);

View File

@ -8,7 +8,7 @@ import { useTrackedMeasurements } from './../getContextModule';
import { BaseVolumeViewport, Enums } from '@cornerstonejs/core'; import { BaseVolumeViewport, Enums } from '@cornerstonejs/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
function TrackedCornerstoneViewport(props) { function TrackedCornerstoneViewport(props: withAppTypes) {
const { displaySets, viewportId, servicesManager, extensionManager } = props; const { displaySets, viewportId, servicesManager, extensionManager } = props;
const { const {
@ -251,7 +251,7 @@ TrackedCornerstoneViewport.defaultProps = {
function _getNextMeasurementUID( function _getNextMeasurementUID(
direction, direction,
servicesManager, servicesManager: AppTypes.ServicesManager,
trackedMeasurementId, trackedMeasurementId,
trackedMeasurements trackedMeasurements
) { ) {

View File

@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { PanelSection, Input, Button } from '@ohif/ui'; import { PanelSection, Input, Button } from '@ohif/ui';
import { DicomMetadataStore, ServicesManager } from '@ohif/core'; import { DicomMetadataStore } from '@ohif/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
const DEFAULT_MEATADATA = { const DEFAULT_MEATADATA = {
@ -22,11 +22,10 @@ const DEFAULT_MEATADATA = {
* @param param0 * @param param0
* @returns * @returns
*/ */
export default function PanelPetSUV({ servicesManager, commandsManager }) { export default function PanelPetSUV({ servicesManager, commandsManager }: withAppTypes) {
const { t } = useTranslation('PanelSUV'); const { t } = useTranslation('PanelSUV');
const { displaySetService, toolGroupService, toolbarService, hangingProtocolService } = ( const { displaySetService, toolGroupService, toolbarService, hangingProtocolService } =
servicesManager as ServicesManager servicesManager.services;
).services;
const [metadata, setMetadata] = useState(DEFAULT_MEATADATA); const [metadata, setMetadata] = useState(DEFAULT_MEATADATA);
const [ptDisplaySet, setPtDisplaySet] = useState(null); const [ptDisplaySet, setPtDisplaySet] = useState(null);

View File

@ -6,7 +6,10 @@ import { eventTarget } from '@cornerstonejs/core';
import { Enums } from '@cornerstonejs/tools'; import { Enums } from '@cornerstonejs/tools';
import { handleROIThresholding } from '../../utils/handleROIThresholding'; import { handleROIThresholding } from '../../utils/handleROIThresholding';
export default function PanelRoiThresholdSegmentation({ servicesManager, commandsManager }) { export default function PanelRoiThresholdSegmentation({
servicesManager,
commandsManager,
}: withAppTypes) {
const { segmentationService, uiNotificationService } = servicesManager.services; const { segmentationService, uiNotificationService } = servicesManager.services;
const { t } = useTranslation('PanelSUVExport'); const { t } = useTranslation('PanelSUVExport');

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { Input, Dialog, ButtonEnums } from '@ohif/ui'; import { Input, Dialog, ButtonEnums } from '@ohif/ui';
function segmentationItemEditHandler({ id, servicesManager }) { function segmentationItemEditHandler({ id, servicesManager }: withAppTypes) {
const { segmentationService, uiDialogService } = servicesManager.services; const { segmentationService, uiDialogService } = servicesManager.services;
const segmentation = segmentationService.getSegmentation(id); const segmentation = segmentationService.getSegmentation(id);

View File

@ -40,7 +40,7 @@ function reducer(state, action) {
} }
} }
function RectangleROIOptions({ servicesManager, commandsManager }) { function RectangleROIOptions({ servicesManager, commandsManager }: withAppTypes) {
const { segmentationService } = servicesManager.services; const { segmentationService } = servicesManager.services;
const [selectedSegmentationId, setSelectedSegmentationId] = useState(null); const [selectedSegmentationId, setSelectedSegmentationId] = useState(null);

View File

@ -35,7 +35,7 @@ const workerFn = () => {
}); });
}; };
const commandsModule = ({ servicesManager, commandsManager, extensionManager }) => { const commandsModule = ({ servicesManager, commandsManager, extensionManager }: withAppTypes) => {
const { const {
viewportGridService, viewportGridService,
uiNotificationService, uiNotificationService,
@ -354,7 +354,7 @@ const commandsModule = ({ servicesManager, commandsManager, extensionManager })
let segmentationMax = -Infinity; let segmentationMax = -Infinity;
let segmentationMin = Infinity; let segmentationMin = Infinity;
let segmentationValues = []; const segmentationValues = [];
let voxelCount = 0; let voxelCount = 0;
for (let i = 0; i < scalarData.length; i++) { for (let i = 0; i < scalarData.length; i++) {
@ -551,7 +551,7 @@ const commandsModule = ({ servicesManager, commandsManager, extensionManager })
segmentations = segmentationService.getSegmentations(); segmentations = segmentationService.getSegmentations();
} }
let report = {}; const report = {};
for (const segmentation of segmentations) { for (const segmentation of segmentations) {
const { id, label, cachedStats: data } = segmentation; const { id, label, cachedStats: data } = segmentation;
@ -633,7 +633,7 @@ const commandsModule = ({ servicesManager, commandsManager, extensionManager })
const fusionViewportIds = toolGroup.getViewportIds(); const fusionViewportIds = toolGroup.getViewportIds();
let viewports = []; const viewports = [];
fusionViewportIds.forEach(viewportId => { fusionViewportIds.forEach(viewportId => {
commandsManager.runCommand('setViewportColormap', { commandsManager.runCommand('setViewportColormap', {
viewportId, viewportId,

View File

@ -4,7 +4,7 @@ const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
const ENTRY = { const ENTRY = {
app: `${SRC_DIR}/index.js`, app: `${SRC_DIR}/index.ts`,
}; };
module.exports = (env, argv) => { module.exports = (env, argv) => {

View File

@ -9,7 +9,7 @@ const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
const ENTRY = { const ENTRY = {
app: `${SRC_DIR}/index.js`, app: `${SRC_DIR}/index.ts`,
}; };
module.exports = (env, argv) => { module.exports = (env, argv) => {

View File

@ -6,7 +6,7 @@
"license": "MIT", "license": "MIT",
"repository": "OHIF/Viewers", "repository": "OHIF/Viewers",
"main": "dist/ohif-mode-basic-dev-mode.umd.js", "main": "dist/ohif-mode-basic-dev-mode.umd.js",
"module": "src/index.js", "module": "src/index.ts",
"engines": { "engines": {
"node": ">=10", "node": ">=10",
"npm": ">=6", "npm": ">=6",

Some files were not shown because too many files have changed in this diff Show More