From 8d5d1ee36010ed5c0e79c0d7642e4c43a86a6db3 Mon Sep 17 00:00:00 2001 From: Bruno Alves de Faria Date: Thu, 29 Sep 2016 12:25:04 -0300 Subject: [PATCH] LT-67; OHIF-78: Merging server configuration and CINE dialog changes from downstream (Ascend) --- OHIFViewer/.meteor/versions | 5 + .../components/ohifViewer/ohifViewer.html | 45 ++++-- .../components/ohifViewer/ohifViewer.js | 5 +- .../toolbarSection/toolbarSection.js | 4 + Packages/design/styles/common/global.styl | 3 + Packages/dimseservice/server/Connection.js | 118 +++++++-------- Packages/dimseservice/server/DIMSE.js | 51 ++----- Packages/lesiontracker/both/collections.js | 3 - .../client/collections/subscriptions.js | 1 - .../serverInformationList.js | 30 ---- Packages/lesiontracker/package.js | 19 --- Packages/lesiontracker/server/publications.js | 4 - .../components/base/mixins/schemaData.js | 2 +- .../viewer/cineDialog/cineDialog.html | 12 +- .../viewer/cineDialog/cineDialog.js | 2 +- .../viewer/cineDialog/cineDialog.styl | 24 ++-- Packages/worklist/both/collections.js | 8 +- .../worklist/both/lib/getCurrentServer.js | 14 ++ Packages/worklist/both/schema.js | 20 ++- .../client/collections/subscriptions.js | 2 + .../serverInformationDicomWeb.html | 0 .../serverInformationDicomWeb.js | 0 .../serverInformationDimse.html | 19 ++- .../serverInformationDimse.js | 26 ++-- .../serverInformationForm.html | 2 +- .../serverInformationForm.js | 6 +- .../serverInformationFormField.html | 0 .../serverInformationList.html | 0 .../serverInformationList.js | 47 ++++++ .../serverInformationModal.html | 0 .../serverInformationModal.js | 0 .../serverInformationModal.styl | 0 Packages/worklist/client/lib/switchToTab.js | 5 + Packages/worklist/client/lib/worklist.js | 20 ++- Packages/worklist/package.js | 43 +++++- .../server/methods/getStudyMetadata.js | 15 +- .../worklist/server/methods/importStudies.js | 15 +- .../worklist/server/methods/worklistSearch.js | 21 +-- Packages/worklist/server/publications.js | 10 +- .../server/servers.js | 64 ++++++--- .../server/services/dimse/instances.js | 134 +++++++++--------- .../server/services/dimse/retrieveMetadata.js | 8 +- .../worklist/server/services/dimse/setup.js | 38 +++++ config/dcm4cheeDIMSE.json | 1 + config/localhostOrthancDIMSE.json | 1 + config/medkenOrthanc.json | 1 + config/orthancDIMSE.json | 1 + 47 files changed, 516 insertions(+), 333 deletions(-) delete mode 100644 Packages/lesiontracker/client/components/serverInformation/serverInformationList/serverInformationList.js create mode 100644 Packages/worklist/both/lib/getCurrentServer.js create mode 100644 Packages/worklist/client/collections/subscriptions.js rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html (100%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js (100%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html (68%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationDimse/serverInformationDimse.js (54%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationForm/serverInformationForm.html (97%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationForm/serverInformationForm.js (97%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationForm/serverInformationFormField.html (100%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationList/serverInformationList.html (100%) create mode 100644 Packages/worklist/client/components/serverInformation/serverInformationList/serverInformationList.js rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationModal/serverInformationModal.html (100%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationModal/serverInformationModal.js (100%) rename Packages/{lesiontracker => worklist}/client/components/serverInformation/serverInformationModal/serverInformationModal.styl (100%) rename Packages/{lesiontracker => worklist}/server/servers.js (53%) create mode 100644 Packages/worklist/server/services/dimse/setup.js diff --git a/OHIFViewer/.meteor/versions b/OHIFViewer/.meteor/versions index 8c204c5c0..3a41e01a9 100644 --- a/OHIFViewer/.meteor/versions +++ b/OHIFViewer/.meteor/versions @@ -1,3 +1,4 @@ +accounts-base@1.2.11 aldeed:simple-schema@1.5.3 aldeed:template-extension@4.0.0 allow-deny@1.0.5 @@ -24,6 +25,7 @@ cornerstone@0.0.1 ddp@1.2.5 ddp-client@1.3.1 ddp-common@1.2.6 +ddp-rate-limiter@1.0.5 ddp-server@1.3.10 deps@1.0.12 design@0.0.1 @@ -51,6 +53,7 @@ johdirr:meteor-git-rev@0.0.4 jquery@1.11.9 launch-screen@1.0.12 livedata@1.0.18 +localstorage@1.0.11 logging@1.1.15 mdg:validation-error@0.5.1 meteor@1.2.17 @@ -78,12 +81,14 @@ practicalmeteor:chai@2.1.0_1 practicalmeteor:loglevel@1.2.0_2 promise@0.8.7 random@1.0.10 +rate-limit@1.0.5 reactive-dict@1.1.8 reactive-var@1.0.10 reload@1.1.10 retry@1.0.8 routepolicy@1.0.11 rwatts:uuid@0.1.0 +service-configuration@1.0.10 session@1.1.6 shell-server@0.2.1 silentcicero:jszip@0.0.4 diff --git a/OHIFViewer/client/components/ohifViewer/ohifViewer.html b/OHIFViewer/client/components/ohifViewer/ohifViewer.html index e0bbad1db..d3ddd7ed6 100644 --- a/OHIFViewer/client/components/ohifViewer/ohifViewer.html +++ b/OHIFViewer/client/components/ohifViewer/ohifViewer.html @@ -11,19 +11,36 @@ Open Health Imaging Foundation - {{ #if studyListToggleText }} - - {{studyListToggleText}} - - {{ /if }} - - About - + {{#if studyListToggleText}} + + {{studyListToggleText}} + + {{/if}} + + + - {{> worklist }} - {{> aboutModal }} - {{> viewSeriesDetailsModal }} - \ No newline at end of file + {{>serverInformationModal}} + {{>worklist}} + {{>aboutModal}} + {{>viewSeriesDetailsModal}} + diff --git a/OHIFViewer/client/components/ohifViewer/ohifViewer.js b/OHIFViewer/client/components/ohifViewer/ohifViewer.js index 70f906dfd..ed6ed4f3d 100644 --- a/OHIFViewer/client/components/ohifViewer/ohifViewer.js +++ b/OHIFViewer/client/components/ohifViewer/ohifViewer.js @@ -1,3 +1,6 @@ +import { Template } from 'meteor/templating'; +import { Session } from 'meteor/session'; + const worklistContentId = 'worklistTab'; let lastContentId; @@ -39,7 +42,7 @@ Template.ohifViewer.helpers({ return 'Study list'; } }, - + onStudyList() { return (Session.get('activeContentId') === 'worklistTab'); } diff --git a/OHIFViewer/client/components/toolbarSection/toolbarSection.js b/OHIFViewer/client/components/toolbarSection/toolbarSection.js index 1197cd998..aef4b5e84 100644 --- a/OHIFViewer/client/components/toolbarSection/toolbarSection.js +++ b/OHIFViewer/client/components/toolbarSection/toolbarSection.js @@ -221,6 +221,10 @@ Template.toolbarSection.onRendered(function() { instance.$('#layout').dropdown(); + if (OHIF.uiSettings.showCineDialogOnRendered) { + toggleCineDialog(); + } + // Set disabled/enabled tool buttons that are set in toolManager const states = toolManager.getToolDefaultStates(); const disabledToolButtons = states.disabledToolButtons; diff --git a/Packages/design/styles/common/global.styl b/Packages/design/styles/common/global.styl index 62db481d0..afe263a0a 100644 --- a/Packages/design/styles/common/global.styl +++ b/Packages/design/styles/common/global.styl @@ -31,6 +31,9 @@ label.form-group margin-left: auto margin-right: auto +.height-auto + height: auto !important + .caret-down display: inline-block width: 0 diff --git a/Packages/dimseservice/server/Connection.js b/Packages/dimseservice/server/Connection.js index 2e46cd7f9..7727c5989 100755 --- a/Packages/dimseservice/server/Connection.js +++ b/Packages/dimseservice/server/Connection.js @@ -1,9 +1,9 @@ +import { _ } from 'meteor/underscore'; + // Uses NodeJS 'net' // https://nodejs.org/api/net.html -var net = Npm.require('net'), - Socket = net.Socket; - -var DEFAULT_MAX_PACKAGE_SIZE = 32768; +var net = Npm.require('net'); +var Socket = net.Socket; Connection = function(options) { EventEmitter.call(this); @@ -16,10 +16,7 @@ Connection = function(options) { } }, options); - this.peers = {}; - this.peerSockets = {}; - this.defaultPeer = null; - this.defaultServer = null; + this.reset(); }; util.inherits(Connection, EventEmitter); @@ -30,15 +27,29 @@ var StoreHandle = function() { util.inherits(StoreHandle, EventEmitter); +Connection.prototype.reset = function() { + this.defaultPeer = null; + this.defaultServer = null; + + _.each(this.peers, peerInfo => { + _.each(peerInfo.sockets, socket => socket.emit('close')); + }); + + this.peers = {}; +}; + Connection.prototype.addPeer = function(options) { if (!options.aeTitle || !options.host || !options.port) { return false; } - this.peers[options.aeTitle] = { + var peer = { host: options.host, - port: options.port + port: options.port, + sockets: {} }; + + this.peers[options.aeTitle] = peer; if (options.default) { if (options.server) { this.defaultServer = options.aeTitle; @@ -49,22 +60,21 @@ Connection.prototype.addPeer = function(options) { if (options.server) { //start listening - var server = net.createServer(); - server.listen(options.port, options.host, function() { + peer.server = net.createServer(); + peer.server.listen(options.port, options.host, function() { console.log('listening on %j', this.address()); }); - server.on('error', function(err) { + peer.server.on('error', function(err) { console.log('server error %j', err); }); - var o = this; - server.on('connection', function(nativeSocket) { + peer.server.on('connection', nativeSocket => { //incoming connections - var socket = new CSocket(nativeSocket, o.options); - o.addSocket(options.aeTitle, socket); + var socket = new CSocket(nativeSocket, this.options); + this.addSocket(options.aeTitle, socket); //close server on close socket socket.on('close', function() { - server.close(); + peer.server.close(); }); }); } @@ -81,8 +91,8 @@ Connection.prototype.selectPeer = function(aeTitle) { Connection.prototype._sendFile = function(socket, sHandle, file, maxSend, metaLength, list) { var fileNameText = typeof file.file === 'string' ? file.file : 'buffer'; console.log('Sending file ' + fileNameText); - var useContext = socket.getContextByUID(file.context), - self = this; + var useContext = socket.getContextByUID(file.context); + var self = this; PDU.generatePDatas(useContext.id, file.file, maxSend, null, metaLength, function(err, handle) { if (err) { @@ -122,13 +132,14 @@ Connection.prototype._sendFile = function(socket, sHandle, file, maxSend, metaLe }; Connection.prototype.storeInstances = function(fileList) { - var contexts = {}, - read = 0, - length = fileList.length, - toSend = [], - self = this, - handle = new StoreHandle(); + var contexts = {}; + var read = 0; + var length = fileList.length; + var toSend = []; + var self = this; + var handle = new StoreHandle(); var lastProcessedMetaLength; + fileList.forEach(function(bufferOrFile) { var fileNameText = typeof bufferOrFile === 'string' ? bufferOrFile : 'buffer'; DicomMessage.readMetaHeader(bufferOrFile, function(err, metaMessage, metaLength) { @@ -144,9 +155,9 @@ Connection.prototype.storeInstances = function(fileList) { console.log('Dicom file ' + (typeof bufferOrFile === 'string' ? bufferOrFile : 'buffer') + ' found'); lastProcessedMetaLength = metaLength; - var syntax = metaMessage.getValue(0x00020010), - sopClassUID = metaMessage.getValue(0x00020002), - instanceUID = metaMessage.getValue(0x00020003); + var syntax = metaMessage.getValue(0x00020010); + var sopClassUID = metaMessage.getValue(0x00020002); + var instanceUID = metaMessage.getValue(0x00020003); if (!contexts[sopClassUID]) { contexts[sopClassUID] = []; @@ -173,23 +184,22 @@ Connection.prototype.storeInstances = function(fileList) { // Starts to send dcm files sendProcessedFiles = function(self, contexts, toSend, handle, metaLength) { var useContexts = []; - for (var context in contexts) { - var useSyntaxes = contexts[context]; + _.each(contexts, (useSyntaxes, context) => { if (useSyntaxes.length > 0) { useContexts.push({ context: context, - syntaxes: contexts[context] + syntaxes: useSyntaxes }); } else { throw 'No syntax specified for context ' + context; } - } + }); self.associate({ contexts: useContexts }, function(ac) { - var maxSend = ac.getMaxSize(), - next = toSend.shift(); + var maxSend = ac.getMaxSize(); + var next = toSend.shift(); self._sendFile(this, handle, next, maxSend, metaLength, toSend); }); @@ -202,8 +212,8 @@ Connection.prototype.storeResponse = function(messageId, msg) { var status = rq.listener[2].call(this, msg); if (status !== undefined && status !== null && rq.command.store) { //store ok, ready to send c-store-rsp - var storeSr = rq.command.store, - replyMessage = storeSr.replyWith(status); + var storeSr = rq.command.store; + var replyMessage = storeSr.replyWith(status); replyMessage.setAffectedSOPInstanceUID(this.lastCommand.getSOPInstanceUID()); replyMessage.setReplyMessageId(this.lastCommand.messageId); this.sendMessage(replyMessage, null, null, storeSr); @@ -215,8 +225,8 @@ Connection.prototype.storeResponse = function(messageId, msg) { Connection.prototype.allClosed = function() { var allClosed = true; - for (var i in o.peerSockets) { - if (Object.keys(o.peerSockets[ae]).length > 0) { + for (var i in this.peers) { + if (Object.keys(peers[i].sockets).length > 0) { allClosed = false; break; } @@ -225,34 +235,30 @@ Connection.prototype.allClosed = function() { return allClosed; }; -Connection.prototype.addSocket = function(ae, socket) { - if (!this.peerSockets[ae]) { - this.peerSockets[ae] = {}; - } +Connection.prototype.addSocket = function(hostAE, socket) { + var peerInfo = this.selectPeer(hostAE); - this.peerSockets[ae][socket.id] = socket; + peerInfo.sockets[socket.id] = socket; - var o = this; socket.on('close', function() { - if (o.peerSockets[ae][this.id]) { - delete o.peerSockets[ae][this.id]; + if (peerInfo.sockets[this.id]) { + delete peerInfo.sockets[this.id]; } }); }; Connection.prototype.associate = function(options, callback) { - var hostAE = options.hostAE ? options.hostAE : this.defaultPeer, - sourceAE = options.sourceAE ? options.sourceAE : this.defaultServer; + var hostAE = options.hostAE ? options.hostAE : this.defaultPeer; + var sourceAE = options.sourceAE ? options.sourceAE : this.defaultServer; if (!hostAE || !sourceAE) { throw 'Peers not provided or no defaults in settings'; } - var peerInfo = this.selectPeer(hostAE), - nativeSocket = new Socket(); + var peerInfo = this.selectPeer(hostAE); + var nativeSocket = new Socket(); - var socket = new CSocket(nativeSocket, this.options), - o = this; + var socket = new CSocket(nativeSocket, this.options); if (callback) { socket.once('associated', callback); @@ -268,9 +274,9 @@ Connection.prototype.associate = function(options, callback) { nativeSocket.connect({ host: peerInfo.host, port: peerInfo.port - }, function() { + }, () => { //connected - o.addSocket(hostAE, socket); + this.addSocket(hostAE, socket); if (options.contexts) { socket.setPresentationContexts(options.contexts); @@ -282,4 +288,4 @@ Connection.prototype.associate = function(options, callback) { }); return socket; -}; \ No newline at end of file +}; diff --git a/Packages/dimseservice/server/DIMSE.js b/Packages/dimseservice/server/DIMSE.js index 2c3f776f3..883ce92bd 100755 --- a/Packages/dimseservice/server/DIMSE.js +++ b/Packages/dimseservice/server/DIMSE.js @@ -1,12 +1,14 @@ var Future = Npm.require('fibers/future'); -DIMSE = {}; +DIMSE = { + connection: new Connection({ + vr: { + split: false + } + }) +}; -var conn = new Connection({ - vr: { - split: false - } -}); +var conn = DIMSE.connection; var getInstanceRetrievalParams = function(studyInstanceUID, seriesInstanceUID) { return { @@ -64,35 +66,6 @@ var getInstanceRetrievalParams = function(studyInstanceUID, seriesInstanceUID) { }; }; -Meteor.startup(function() { - if (Meteor.settings.defaultServiceType !== 'dimse') { - return; - } - - if (!Meteor.settings.servers.dimse || - !Meteor.settings.servers.dimse.length) { - console.error('dimse-config: ' + 'No DIMSE Servers provided.'); - throw new Meteor.Error('dimse-config', 'No DIMSE Servers provided.'); - } - - // TODO: [custom-servers] use active server and check if type is DIMSE - var peers = Meteor.settings.servers.dimse[0].peers; - if (!peers || !peers.length) { - console.error('dimse-config: ' + 'No DIMSE Peers provided.'); - throw new Meteor.Error('dimse-config', 'No DIMSE Peers provided.'); - } - - console.log('Adding DIMSE peers'); - try { - peers.forEach(function(peer) { - conn.addPeer(peer); - }); - } catch(error) { - console.error('dimse-addPeers: ' + error); - throw new Meteor.Error('dimse-addPeers', error); - } -}); - DIMSE.associate = function(contexts, callback, options) { var defaults = { contexts: contexts @@ -239,10 +212,10 @@ DIMSE.retrieveInstancesByStudyOnly = function(studyInstanceUID, params, options) 0x0020000E: '', 0x00200011: '' }; - var result = this.findSeries(Object.assign(defaultParams, params)), - series = [], - conn = this, - allInstances = []; + var result = this.findSeries(Object.assign(defaultParams, params)); + var series = []; + var conn = this; + var allInstances = []; result.on('result', function(msg) { series.push(msg); diff --git a/Packages/lesiontracker/both/collections.js b/Packages/lesiontracker/both/collections.js index c4f742aa4..c37da9dc0 100644 --- a/Packages/lesiontracker/both/collections.js +++ b/Packages/lesiontracker/both/collections.js @@ -1,8 +1,5 @@ import { Mongo } from 'meteor/mongo'; -// Servers describe the DICOM servers configurations -Servers = new Mongo.Collection('servers'); - Timepoints = new Mongo.Collection('timepoints'); Studies = new Mongo.Collection('studies'); Measurements = new Mongo.Collection('measurements'); diff --git a/Packages/lesiontracker/client/collections/subscriptions.js b/Packages/lesiontracker/client/collections/subscriptions.js index c8a266593..bc19ceff2 100644 --- a/Packages/lesiontracker/client/collections/subscriptions.js +++ b/Packages/lesiontracker/client/collections/subscriptions.js @@ -1,2 +1 @@ Meteor.subscribe('reviewers'); -Meteor.subscribe('servers'); diff --git a/Packages/lesiontracker/client/components/serverInformation/serverInformationList/serverInformationList.js b/Packages/lesiontracker/client/components/serverInformation/serverInformationList/serverInformationList.js deleted file mode 100644 index 82a8db91f..000000000 --- a/Packages/lesiontracker/client/components/serverInformation/serverInformationList/serverInformationList.js +++ /dev/null @@ -1,30 +0,0 @@ -Template.serverInformationList.onCreated(() => { - const instance = Template.instance(); - - instance.api = { - add: () => instance.data.mode.set('create'), - edit(server) { - instance.data.currentItem.set(server); - instance.data.mode.set('edit'); - }, - delete(server) { - Meteor.call('serverRemove', server._id, error => { - // TODO: check for errors: not-authorized, data-write - }); - }, - use(server) { - Meteor.call('serverSetActive', server._id, error => { - // TODO: [custom-servers] check for errors: not-authorized, data-write - }); - } - }; -}); - -Template.serverInformationList.helpers({ - isActive: function(server) { - return server._id === Meteor.user().profile.activeServer; - }, - servers: function() { - return Servers.find().fetch(); - } -}); diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js index 92b42e008..30217d1ca 100644 --- a/Packages/lesiontracker/package.js +++ b/Packages/lesiontracker/package.js @@ -203,7 +203,6 @@ Package.onUse(function(api) { // Server functions api.addFiles('server/publications.js', 'server'); - api.addFiles('server/servers.js', 'server'); api.addFiles('server/methods.js', [ 'server' ]); api.addFiles('server/reviewers.js', [ 'server' ]); api.addFiles('server/createDemoUser.js', [ 'server' ]); @@ -242,23 +241,6 @@ Package.onUse(function(api) { api.addFiles('lib/handleMeasurementModified.js', 'client'); api.addFiles('lib/handleMeasurementRemoved.js', 'client'); - api.addFiles('client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html', 'client'); - api.addFiles('client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js', 'client'); - - api.addFiles('client/components/serverInformation/serverInformationDimse/serverInformationDimse.html', 'client'); - api.addFiles('client/components/serverInformation/serverInformationDimse/serverInformationDimse.js', 'client'); - - api.addFiles('client/components/serverInformation/serverInformationForm/serverInformationForm.html', 'client'); - api.addFiles('client/components/serverInformation/serverInformationForm/serverInformationForm.js', 'client'); - api.addFiles('client/components/serverInformation/serverInformationForm/serverInformationFormField.html', 'client'); - - api.addFiles('client/components/serverInformation/serverInformationList/serverInformationList.html', 'client'); - api.addFiles('client/components/serverInformation/serverInformationList/serverInformationList.js', 'client'); - - api.addFiles('client/components/serverInformation/serverInformationModal/serverInformationModal.html', 'client'); - api.addFiles('client/components/serverInformation/serverInformationModal/serverInformationModal.styl', 'client'); - api.addFiles('client/components/serverInformation/serverInformationModal/serverInformationModal.js', 'client'); - // API classes api.addFiles('client/api/timepoint.js'); api.addFiles('client/api/measurement.js'); @@ -299,7 +281,6 @@ Package.onUse(function(api) { api.export('TrialCriteriaTypes', 'client'); // Export collections spanning both client and server - api.export('Servers', [ 'client', 'server' ]); api.export('AdditionalFindings', [ 'client', 'server' ]); api.export('ImageMeasurements', [ 'client', 'server' ]); api.export('Measurements', [ 'client', 'server' ]); diff --git a/Packages/lesiontracker/server/publications.js b/Packages/lesiontracker/server/publications.js index 8a6cbbbdb..f1a5f6521 100644 --- a/Packages/lesiontracker/server/publications.js +++ b/Packages/lesiontracker/server/publications.js @@ -46,10 +46,6 @@ Meteor.publish('reviewers', function() { return Reviewers.find(); }); -Meteor.publish('servers', () => { - return Servers.find(); -}); - // Temporary fix to drop all Collections on server restart // http://stackoverflow.com/questions/23891631/meteor-how-can-i-drop-all-mongo-collections-and-clear-all-data-on-startup Meteor.startup(function() { diff --git a/Packages/ohif-core/client/components/base/mixins/schemaData.js b/Packages/ohif-core/client/components/base/mixins/schemaData.js index 6072eafb8..33a59a07f 100644 --- a/Packages/ohif-core/client/components/base/mixins/schemaData.js +++ b/Packages/ohif-core/client/components/base/mixins/schemaData.js @@ -126,7 +126,7 @@ OHIF.mixins.schemaData = new OHIF.Mixin({ // Stop here if there's no schema data for current key if (!currentSchema) { - return; + return value; } // Check if the schema is a Number diff --git a/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.html b/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.html index 670ce1a57..b4bb7f8b5 100644 --- a/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.html +++ b/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.html @@ -1,7 +1,6 @@ diff --git a/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.js b/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.js index 04073efa3..0cbea9a3e 100644 --- a/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.js +++ b/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.js @@ -21,7 +21,7 @@ Template.cineDialog.onCreated(() => { }, framesPerSecond: { type: Number, - label: 'Cine Speed', + label: '', defaultValue: 24, min: 1, max: 90, diff --git a/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.styl b/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.styl index cdf2756f4..da4acec35 100644 --- a/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.styl +++ b/Packages/viewerbase/client/components/viewer/cineDialog/cineDialog.styl @@ -1,19 +1,19 @@ @import "{design}/app.styl" #cineDialog - theme('border', '1px solid $uiBorderColor', 0.95) + theme('border', '2px solid $uiBorderColor', 0.95) theme('background', '$uiGrayDarkest', 0.95) theme('color', '$textSecondaryColor') border-radius: 8px bottom: 3px box-sizing: border-box - height: 150px + height: 80px left: 50% overflow: hidden padding: 10px position: absolute right: 3px - top: 50% + top: 2% width: 300px z-index: 1000 transform(translateX(-50%) translateY(-50%)) @@ -36,9 +36,10 @@ &:active, &.active theme('color', '$activeColor') + .cine-navigation position: absolute - right: 24px + right: 4px top: 4px .btn @@ -49,12 +50,19 @@ line-height: 36px .cine-controls - display: table - margin: 0 auto + left: 0px .cine-options - padding: 5px 0 - overflow: auto + padding: 0px 0 + + .fps-section + width: 175px + float: left + + #fps + float: right + padding: 5px 10px 0 0 .loop-section padding-right: 12px + diff --git a/Packages/worklist/both/collections.js b/Packages/worklist/both/collections.js index 3ba215818..61024e050 100644 --- a/Packages/worklist/both/collections.js +++ b/Packages/worklist/both/collections.js @@ -1,3 +1,9 @@ import { Mongo } from 'meteor/mongo'; -StudyImportStatus = new Mongo.Collection('studyImportStatus'); \ No newline at end of file +StudyImportStatus = new Mongo.Collection('studyImportStatus'); + +// Servers describe the DICOM servers configurations +Servers = new Mongo.Collection('servers'); + +// CurrentServer is a single document collection to describe which of the Servers is being used +CurrentServer = new Mongo.Collection('currentServer'); diff --git a/Packages/worklist/both/lib/getCurrentServer.js b/Packages/worklist/both/lib/getCurrentServer.js new file mode 100644 index 000000000..d34022712 --- /dev/null +++ b/Packages/worklist/both/lib/getCurrentServer.js @@ -0,0 +1,14 @@ +/** + * Retrieves the current server configuration used to retrieve studies + */ +getCurrentServer = () => { + const currentServer = CurrentServer.findOne(); + + if (!currentServer) { + return; + } + + const serverConfiguration = Servers.findOne({ _id: currentServer.serverId }); + + return serverConfiguration; +}; diff --git a/Packages/worklist/both/schema.js b/Packages/worklist/both/schema.js index 1f7b7e994..dfa2aa670 100644 --- a/Packages/worklist/both/schema.js +++ b/Packages/worklist/both/schema.js @@ -14,6 +14,12 @@ const serverTypeDefinitions = { optional: true }; +const wadoUriRootDefinitions = { + type: String, + label: 'WADO URI root', + max: 1000 +}; + export const DICOMWebRequestOptions = new SimpleSchema({ auth: { type: String, @@ -40,11 +46,7 @@ export const DICOMWebRequestOptions = new SimpleSchema({ export const DICOMWebServer = new SimpleSchema({ name: serverNameDefinitions, type: serverTypeDefinitions, - wadoUriRoot: { - type: String, - label: 'WADO URI root', - max: 1000 - }, + wadoUriRoot: wadoUriRootDefinitions, wadoRoot: { type: String, label: 'WADO root', @@ -106,7 +108,7 @@ export const DIMSEPeer = new SimpleSchema({ }, supportsInstanceRetrievalByStudyUid: { type: Boolean, - label: 'Supports instance retrieval by StudyUid?', + label: 'Supports instance retrieval by StudyUid', defaultValue: true } }); @@ -114,6 +116,7 @@ export const DIMSEPeer = new SimpleSchema({ export const DIMSEServer = new SimpleSchema({ name: serverNameDefinitions, type: serverTypeDefinitions, + wadoUriRoot: wadoUriRootDefinitions, peers: { type: [DIMSEPeer], label: 'Peer List', @@ -141,6 +144,11 @@ export const UISettings = new SimpleSchema({ type: Boolean, label: 'The UP/DOWN display set navigation buttons will iterate over all the viewports at once?', defaultValue: false + }, + showCineDialogOnRendered: { + type: Boolean, + label: 'The Cine dialog will be displayed by default', + defaultValue: false } }); diff --git a/Packages/worklist/client/collections/subscriptions.js b/Packages/worklist/client/collections/subscriptions.js new file mode 100644 index 000000000..1da4725c2 --- /dev/null +++ b/Packages/worklist/client/collections/subscriptions.js @@ -0,0 +1,2 @@ +Meteor.subscribe('servers'); +Meteor.subscribe('currentServer'); diff --git a/Packages/lesiontracker/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html b/Packages/worklist/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html similarity index 100% rename from Packages/lesiontracker/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html rename to Packages/worklist/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.html diff --git a/Packages/lesiontracker/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js b/Packages/worklist/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js similarity index 100% rename from Packages/lesiontracker/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js rename to Packages/worklist/client/components/serverInformation/serverInformationDicomWeb/serverInformationDicomWeb.js diff --git a/Packages/lesiontracker/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html b/Packages/worklist/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html similarity index 68% rename from Packages/lesiontracker/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html rename to Packages/worklist/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html index 5b94094f0..8555290e3 100644 --- a/Packages/lesiontracker/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html +++ b/Packages/worklist/client/components/serverInformation/serverInformationDimse/serverInformationDimse.html @@ -1,8 +1,15 @@