import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { MeasurementTable, Dialog, Input, useViewportGrid } from '@ohif/ui'; import ActionButtons from './ActionButtons'; import debounce from 'lodash.debounce'; import { utils } from '@ohif/core'; import createReportDialogPrompt, { CREATE_REPORT_DIALOG_RESPONSE, } from './createReportDialogPrompt'; import createReportAsync from '../Actions/createReportAsync'; import getNextSRSeriesNumber from '../utils/getNextSRSeriesNumber'; const { downloadCSVReport } = utils; export default function PanelMeasurementTable({ servicesManager, commandsManager, extensionManager, }) { const [viewportGrid, viewportGridService] = useViewportGrid(); const { activeViewportIndex, viewports } = viewportGrid; const { measurementService, uiDialogService, uiNotificationService, displaySetService, } = servicesManager.services; const [displayMeasurements, setDisplayMeasurements] = useState([]); useEffect(() => { const debouncedSetDisplayMeasurements = debounce( setDisplayMeasurements, 100 ); // ~~ Initial setDisplayMeasurements(_getMappedMeasurements(measurementService)); // ~~ Subscription const added = measurementService.EVENTS.MEASUREMENT_ADDED; const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED; const updated = measurementService.EVENTS.MEASUREMENT_UPDATED; const removed = measurementService.EVENTS.MEASUREMENT_REMOVED; const cleared = measurementService.EVENTS.MEASUREMENTS_CLEARED; const subscriptions = []; [added, addedRaw, updated, removed, cleared].forEach(evt => { subscriptions.push( measurementService.subscribe(evt, () => { debouncedSetDisplayMeasurements( _getMappedMeasurements(measurementService) ); }).unsubscribe ); }); return () => { subscriptions.forEach(unsub => { unsub(); }); debouncedSetDisplayMeasurements.cancel(); }; }, []); async function exportReport() { const measurements = measurementService.getMeasurements(); downloadCSVReport(measurements, measurementService); } async function clearMeasurements() { measurementService.clearMeasurements(); } async function createReport() { // filter measurements that are added to the active study const activeViewport = viewports[activeViewportIndex]; const measurements = measurementService.getMeasurements(); const displaySet = displaySetService.getDisplaySetByUID( activeViewport.displaySetInstanceUIDs[0] ); const trackedMeasurements = measurements.filter( m => displaySet.StudyInstanceUID === m.referenceStudyUID ); if (trackedMeasurements.length <= 0) { uiNotificationService.show({ title: 'No Measurements', message: 'No Measurements are added to the current Study.', type: 'info', duration: 3000, }); return; } const promptResult = await createReportDialogPrompt(uiDialogService, { extensionManager, }); if (promptResult.action === CREATE_REPORT_DIALOG_RESPONSE.CREATE_REPORT) { const dataSources = extensionManager.getDataSources( promptResult.dataSourceName ); const dataSource = dataSources[0]; const SeriesDescription = // isUndefinedOrEmpty promptResult.value === undefined || promptResult.value === '' ? 'Research Derived Series' // default : promptResult.value; // provided value const SeriesNumber = getNextSRSeriesNumber(displaySetService); const displaySetInstanceUIDs = await createReportAsync( servicesManager, commandsManager, dataSource, trackedMeasurements, { SeriesDescription, SeriesNumber, } ); } } const jumpToImage = ({ uid, isActive }) => { measurementService.jumpToMeasurement(viewportGrid.activeViewportIndex, uid); onMeasurementItemClickHandler({ uid, isActive }); }; const onMeasurementItemEditHandler = ({ uid, isActive }) => { const measurement = measurementService.getMeasurement(uid); //Todo: why we are jumping to image? // jumpToImage({ id, isActive }); const onSubmitHandler = ({ action, value }) => { switch (action.id) { case 'save': { measurementService.update( uid, { ...measurement, ...value, }, true ); } } uiDialogService.dismiss({ id: 'enter-annotation' }); }; uiDialogService.create({ id: 'enter-annotation', centralize: true, isDraggable: false, showOverlay: true, content: Dialog, contentProps: { title: 'Enter your annotation', noCloseButton: true, value: { label: measurement.label || '' }, body: ({ value, setValue }) => { const onChangeHandler = event => { event.persist(); setValue(value => ({ ...value, label: event.target.value })); }; const onKeyPressHandler = event => { if (event.key === 'Enter') { onSubmitHandler({ value, action: { id: 'save' } }); } }; return (