Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import { DicomMetadataStore } from '../services/DicomMetadataStore/DicomMetadataStore'; import formatPN from './formatPN'; export default function downloadCSVReport(measurementData) { Iif (measurementData.length === 0) { // Prevent download of report with no measurements. return; } const columns = [ 'Patient ID', 'Patient Name', 'StudyInstanceUID', 'SeriesInstanceUID', 'SOPInstanceUID', 'Label', ]; const reportMap = {}; measurementData.forEach(measurement => { const { referenceStudyUID, referenceSeriesUID, getReport, uid } = measurement; Iif (!getReport) { console.warn('Measurement does not have a getReport function'); return; } const seriesMetadata = DicomMetadataStore.getSeries(referenceStudyUID, referenceSeriesUID); const commonRowItems = _getCommonRowItems(measurement, seriesMetadata); const report = getReport(measurement); reportMap[uid] = { report, commonRowItems, }; }); // get columns names inside the report from each measurement and // add them to the rows array (this way we can add columns for any custom // measurements that may be added in the future) Object.keys(reportMap).forEach(id => { const { report } = reportMap[id]; report.columns.forEach(column => { Iif (!columns.includes(column)) { columns.push(column); } }); }); const results = _mapReportsToRowArray(reportMap, columns); let csvContent = 'data:text/csv;charset=utf-8,' + results.map(res => res.join(',')).join('\n'); _createAndDownloadFile(csvContent); } function _mapReportsToRowArray(reportMap, columns) { const results = [columns]; Object.keys(reportMap).forEach(id => { const { report, commonRowItems } = reportMap[id]; const row = []; // For commonRowItems, find the correct index and add the value to the // correct row in the results array Object.keys(commonRowItems).forEach(key => { const index = columns.indexOf(key); const value = commonRowItems[key]; row[index] = value; }); // For each annotation data, find the correct index and add the value to the // correct row in the results array report.columns.forEach((column, index) => { const colIndex = columns.indexOf(column); const value = report.values[index]; row[colIndex] = value; }); results.push(row); }); return results; } function _getCommonRowItems(measurement, seriesMetadata) { const firstInstance = seriesMetadata.instances[0]; return { 'Patient ID': firstInstance.PatientID, // Patient ID 'Patient Name': formatPN(firstInstance.PatientName) || '', // Patient Name StudyInstanceUID: measurement.referenceStudyUID, // StudyInstanceUID SeriesInstanceUID: measurement.referenceSeriesUID, // SeriesInstanceUID SOPInstanceUID: measurement.SOPInstanceUID, // SOPInstanceUID Label: measurement.label || '', // Label }; } function _createAndDownloadFile(csvContent) { const encodedUri = encodeURI(csvContent); const link = document.createElement('a'); link.setAttribute('href', encodedUri); link.setAttribute('download', 'MeasurementReport.csv'); document.body.appendChild(link); link.click(); } |