From 5f56d06fcd7711d44d3fcd478bf5cd7f1905837d Mon Sep 17 00:00:00 2001 From: mario Date: Sat, 26 Apr 2025 23:38:18 +0700 Subject: [PATCH] edit ip pdf dan cloud --- .../utils/CornerstoneViewportDownloadForm.tsx | 59 ++++++++++++++- .../viewports/OHIFCornerstonePdfViewport.tsx | 3 +- platform/app/.webpack/webpack.pwa.js | 2 +- platform/app/public/config/default.js | 57 ++++++++------- platform/app/public/config/google.js | 73 ++++++++----------- 5 files changed, 121 insertions(+), 73 deletions(-) diff --git a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx index 5e72d37..514855c 100644 --- a/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx +++ b/extensions/cornerstone/src/utils/CornerstoneViewportDownloadForm.tsx @@ -26,6 +26,15 @@ const CornerstoneViewportDownloadForm = ({ const activeViewportElement = enabledElement?.element; const activeViewportEnabledElement = getEnabledElement(activeViewportElement); + // console.log('cornerstoneViewportService', cornerstoneViewportService); + const viewportInfo = cornerstoneViewportService.getViewportInfo("default"); + // console.log('viewportInfo', viewportInfo); + + // Retrieve StudyInstanceUID from viewportInfo + const StudyInstanceUID = viewportInfo.getViewportData().data[0].StudyInstanceUID; + const SetInstanceUID = viewportInfo.getViewportData().data[0].displaySetInstanceUID; + // console.log('StudyInstanceUID', StudyInstanceUID); + // console.log('SetInstanceUID', SetInstanceUID); const { viewportId: activeViewportId, renderingEngineId, @@ -108,6 +117,10 @@ const CornerstoneViewportDownloadForm = ({ const downloadCanvas = getOrCreateCanvas(element); + // Log the canvas content before conversion + const context = downloadCanvas.getContext('2d'); + const imageData = context.getImageData(0, 0, downloadCanvas.width, downloadCanvas.height); + const type = 'image/' + fileType; const dataUrl = downloadCanvas.toDataURL(type, 1); @@ -214,6 +227,43 @@ const CornerstoneViewportDownloadForm = ({ }); }; + // New function to send annotation data + const sendAnnotationData = async (base64Image, activeViewportElement) => { + try { + // Get the SOPInstanceUID from the active viewport + const activeViewportEnabledElement = getEnabledElement(activeViewportElement); + const imageId = activeViewportEnabledElement?.viewport?.getCurrentImageId(); + + if (!base64Image || !StudyInstanceUID) { + throw new Error('Missing required data'); + } + + const payload = { + image: base64Image, + StudyInstanceUID: StudyInstanceUID + }; + + const response = await fetch('http://host:port/one-api/tools/annotation/store', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload) + }); + + if (!response.ok) { + throw new Error('Network response was not ok'); + } + + const data = await response.json(); + console.log('Annotation data sent successfully:', data); + return data; + } catch (error) { + console.error('Error sending annotation data:', error); + throw error; + } + }; + const downloadBlob = (filename, fileType) => { const file = `${filename}.${fileType}`; const divForDownloadViewport = document.querySelector( @@ -221,9 +271,16 @@ const CornerstoneViewportDownloadForm = ({ ); html2canvas(divForDownloadViewport).then(canvas => { + const dataUrl = canvas.toDataURL(fileType, 1.0); + const base64Image = dataUrl.split(',')[1]; // Remove prefix 'data:image/png;base64,' + + // Send annotation data + sendAnnotationData(base64Image, activeViewportElement) + .catch(error => console.error('Annotation data sending failed:', error)); + const link = document.createElement('a'); link.download = file; - link.href = canvas.toDataURL(fileType, 1.0); + link.href = dataUrl; link.click(); }); }; diff --git a/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx b/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx index a7d9df9..5e4651e 100644 --- a/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx +++ b/extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx @@ -6,7 +6,8 @@ function OHIFCornerstonePdfViewport({ displaySets }) { var [url, setUrl] = useState(null); const sopInstanceUid = displaySets[0].SOPInstanceUID; - url = `http://128.199.154.150:8080/rid/IHERetrieveDocument?requestType=DOCUMENT&documentUID=${sopInstanceUid}&preferredContentType=application%2Fpdf`; + url = `http://${window.config.pacs_document_host}:${window.config.pacs_document_port}/rid/IHERetrieveDocument?requestType=DOCUMENT&documentUID=${sopInstanceUid}&preferredContentType=application%2Fpdf`; + console.log("URL PDF", url); useEffect(() => { document.body.addEventListener('drag', makePdfDropTarget); diff --git a/platform/app/.webpack/webpack.pwa.js b/platform/app/.webpack/webpack.pwa.js index cd64875..78c05e0 100644 --- a/platform/app/.webpack/webpack.pwa.js +++ b/platform/app/.webpack/webpack.pwa.js @@ -25,7 +25,7 @@ const PROXY_DOMAIN = process.env.PROXY_DOMAIN; const PROXY_PATH_REWRITE_FROM = process.env.PROXY_PATH_REWRITE_FROM; const PROXY_PATH_REWRITE_TO = process.env.PROXY_PATH_REWRITE_TO; -const OHIF_PORT = Number(process.env.OHIF_PORT || 3000); +const OHIF_PORT = Number(process.env.OHIF_PORT || 3030); const ENTRY_TARGET = process.env.ENTRY_TARGET || `${SRC_DIR}/index.js`; const Dotenv = require('dotenv-webpack'); const writePluginImportFile = require('./writePluginImportsFile.js'); diff --git a/platform/app/public/config/default.js b/platform/app/public/config/default.js index e1f69dc..f0d49e4 100644 --- a/platform/app/public/config/default.js +++ b/platform/app/public/config/default.js @@ -2,6 +2,8 @@ window.config = { routerBasename: '/', + pacs_document_host: '152.42.173.210', + pacs_document_port: 8080, // whiteLabeling: {}, extensions: [], modes: [], @@ -23,10 +25,11 @@ window.config = { // above, the number of requests can be go a lot higher. prefetch: 25, }, - expertise: true, //* Tambahan untuk enable expertise (CustomizableViewportOverlay) + expertise: false, //* Tambahan untuk enable expertise (CustomizableViewportOverlay) // filterQueryParam: false, // defaultDataSourceName: 'dicomweb', defaultDataSourceName: 'local-proxy', + // defaultDataSourceName: 'GCP', /* Dynamic config allows user to pass "configUrl" query string this allows to load config without recompiling application. The regex will ensure valid configuration source */ // dangerouslyUseDynamicConfig: { // enabled: true, @@ -38,6 +41,32 @@ window.config = { // regex: /.*/, // }, dataSources: [ + { + namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', + sourceName: 'local-proxy', + configuration: { + friendlyName: 'DCM4CHEE Server', + name: 'DCM4CHEE', + qidoRoot: 'http://152.42.173.210:5000/rs', + wadoRoot: 'http://152.42.173.210:5000/rs', + qidoSupportsIncludeField: false, + supportsReject: true, + supportsStow: true, + imageRendering: 'wadors', + thumbnailRendering: 'wadors', + enableStudyLazyLoad: true, + supportsFuzzyMatching: false, + supportsWildcard: true, + staticWado: true, + singlepart: 'bulkdata,video', + bulkDataURI: { + enabled: true, + relativeResolution: 'studies', + transform: url => url.replace('/pixeldata.mp4', '/rendered'), + }, + omitQuotationForMultipartRequest: true, + }, + }, { namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', sourceName: 'dicomweb', @@ -123,32 +152,6 @@ window.config = { omitQuotationForMultipartRequest: true, }, }, - - { - namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', - sourceName: 'local-proxy', - configuration: { - friendlyName: 'Static WADO Local Data', - name: 'DCM4CHEE', - qidoRoot: 'http://128.199.154.150:5000/rs', - wadoRoot: 'http://128.199.154.150:5000/rs', - qidoSupportsIncludeField: false, - supportsReject: true, - supportsStow: true, - imageRendering: 'wadors', - thumbnailRendering: 'wadors', - enableStudyLazyLoad: true, - supportsFuzzyMatching: false, - supportsWildcard: true, - staticWado: true, - singlepart: 'video', - bulkDataURI: { - enabled: true, - relativeResolution: 'studies', - }, - }, - }, - { namespace: '@ohif/extension-default.dataSourcesModule.dicomwebproxy', sourceName: 'dicomwebproxy', diff --git a/platform/app/public/config/google.js b/platform/app/public/config/google.js index bdbdd16..5b1d75f 100644 --- a/platform/app/public/config/google.js +++ b/platform/app/public/config/google.js @@ -1,6 +1,9 @@ /** @type {AppTypes.Config} */ window.config = { routerBasename: '/', + pacs_document_host: '152.42.173.210', + pacs_document_port: 8080, + expertise:false, enableGoogleCloudAdapter: false, // below flag is for performance reasons, but it might not work for all servers showWarningMessageForCrossOrigin: true, @@ -8,37 +11,24 @@ window.config = { showLoadingIndicator: true, strictZSpacingForVolumeViewport: true, // This is an array, but we'll only use the first entry for now - oidc: [ - { - // ~ REQUIRED - // Authorization Server URL - authority: 'https://accounts.google.com', - client_id: '382212153306-7q39hdie4ecj0uhemkitvedo93bnvfhn.apps.googleusercontent.com', - redirect_uri: '/callback', - response_type: 'id_token token', - scope: - 'email profile openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/cloud-healthcare', // email profile openid - // ~ OPTIONAL - post_logout_redirect_uri: '/logout-redirect.html', - revoke_uri: 'https://accounts.google.com/o/oauth2/revoke?token=', - automaticSilentRenew: true, - revokeAccessTokenOnSignout: true, - - // Tambahan dari Google CLoud Secret - project_id: "westone-433204", - auth_uri: "https://accounts.google.com/o/oauth2/auth", - token_uri: "https://oauth2.googleapis.com/token", - auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs", - client_secret: "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", - redirect_uris: [ - "http://devkedungdoro.aplikasi.web.id:3000/callback" - ], - javascript_origins: [ - "https://devone.aplikasi.web.id", - "http://devkedungdoro.aplikasi.web.id:3000" - ] - }, - ], + // Remove OIDC configuration since proxy handles authentication + // oidc: [ + // { + // // ~ REQUIRED + // // Authorization Server URL + // authority: 'https://accounts.google.com', + // client_id: '382212153306-7q39hdie4ecj0uhemkitvedo93bnvfhn.apps.googleusercontent.com', + // redirect_uri: '/callback', + // response_type: 'id_token token', + // scope: + // 'email profile openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/cloud-healthcare', // email profile openid + // // ~ OPTIONAL + // post_logout_redirect_uri: '/logout-redirect.html', + // revoke_uri: 'https://accounts.google.com/o/oauth2/revoke?token=', + // automaticSilentRenew: true, + // revokeAccessTokenOnSignout: true, + // }, + // ], extensions: [], modes: [], showStudyList: true, @@ -51,12 +41,9 @@ window.config = { configuration: { friendlyName: 'dcmjs DICOMWeb Server', name: 'GCP', - wadoUriRoot: - 'https://healthcare.googleapis.com/v1/projects/westone-433204/locations/asia-southeast2/datasets/sas-dicom-storage/dicomStores/ohif/dicomWeb', - qidoRoot: - 'https://healthcare.googleapis.com/v1/projects/westone-433204/locations/asia-southeast2/datasets/sas-dicom-storage/dicomStores/ohif/dicomWeb', - wadoRoot: - 'https://healthcare.googleapis.com/v1/projects/westone-433204/locations/asia-southeast2/datasets/sas-dicom-storage/dicomStores/ohif/dicomWeb', + wadoUriRoot: `http://${window.location.hostname}:5555/dicomWeb`, + qidoRoot: `http://${window.location.hostname}:5555/dicomWeb`, + wadoRoot: `http://${window.location.hostname}:5555/dicomWeb`, qidoSupportsIncludeField: true, imageRendering: 'wadors', thumbnailRendering: 'wadors', @@ -66,12 +53,12 @@ window.config = { dicomUploadEnabled: true, omitQuotationForMultipartRequest: true, configurationAPI: 'ohif.dataSourceConfigurationAPI.google', - defaultDicomStoreConfiguredItems: { - id: 'projects/westone-433204/locations/asia-southeast2/datasets/sas-dicom-storage', - itemType: '3', - name: 'ohif', - url: 'https://healthcare.googleapis.com/v1/projects/westone-433204/locations/asia-southeast2/datasets/sas-dicom-storage/dicomStores/ohif' - }, + // defaultDicomStoreConfiguredItems: { + // id: 'projects/ohifproxy/locations/asia-southeast2/datasets/sas-storage', + // itemType: '3', + // name: 'store-1', + // url: 'https://healthcare.googleapis.com/v1/projects/ohifproxy/locations/asia-southeast2/datasets/sas-storage/dicomStores/store-1' + // }, }, }, {